Cześć. Wiecie, że rzadko proszę o pomoc i staram sobie radzić sam. Jednak mimo, że coś tam potrafię zakodować w WinAPI, to tego nie potrafię do końca sam zrobić. Zobaczcie na exek i kod w załączniku. Chodzi o to żeby górny przycisk z tekstem This is test
dało się zablokować przez funckję EnableWindow(Uchwyt, False)
i nie skopała się grafika oraz tekst. Teraz jak widać pojawia się szary prostokąt na cały button. A odblokowywać i blokowac przycisk można klikając dolnym przyciskiem tylko z ikonką choinki. To co jest w kodzie funkcji CreateBitBtn
po ButtonEnabled
to cześc z modułu bitbtn.pas
co mamy przy rysowaniu captiona przy state disabled. Jednak to się nie sprawdza. Oczywiście dla VCL nie ma problemu bo mamy TBitBtn działąjący jak trzeba, jednak ja chcę osiągnąc to w WinAPI i to dla HICON zamiast HBITMAP jako obrazka i koniecznie by można było ustawić Enabled na False i grafika oraz tekst wyświetlały się odpowiednio jako nieaktywne. Póki co przycisk jest tworzony "na sztywno", później jak pomożecie mi to okiełznać zamiast tego tworzenia będzie ustawianie stylów i HDC dla podanego uchwytu. I jak za pewne widać - próbowałem kombinować z użyciem Color_Values_Arr
kiedy nie ustawiamy EnableWindow(Uchwyt, False);
tylko parametr ButtonEnabled
na False. Wtedy ikonka ładowana z takimi flagami przez LoadImage
miała by ok kolory, ale przycisk można klikać i nadal problem z rysowaniem tekstu. Liczę na Waszą pomoc, bo sporo googlowałem i sam kombinowałem, ale posiłokowałem się głownie kodami podanymi w tym wątku: http://pl.comp.lang.delphi.narkive.com/vLIXHiLD/delphi-winapi-tworzenie-przycisku-z-ikona-i-tekstem - może @kAzek lub @-321oho będą wiedzieć. Albo ktoś inny, kto coś dłubał w WinAPI i Delphi. Dodam, że nie upieram się przy tej metodzie, ale jeżeli jest sposób na wyświetlenie przycisku z obrazkiem jako ikonka i tekstem jednocześnie, ustawienie mu Enabled jak należy, a można by to jakoś zrobić przez obsługę komunikatu WM_DRAWITEM
czy WM_PAINT
to prosił bym o przykładowe kody. Załaczony plik to kompletne żródło, exek i plik buildujący. Kompilowac się to będzie bez probleów pod Delphi 7, w nowszych chyba też może dać radę. Poniżej kod tego co na razie działa ok tylko przy Enabled na True. Docelowo jak wspomniałem tworzenie na sztywno oraz dopasowanie pozycji ikonki i tekstu do rozmairów przycisku ustawie odpowiednio. Bo to teraz jest pisane na szybko, dla testów. Sorry za rozpisanie się. Czekam na Wasze pomysły.
function CreateBitBtn(HParentWnd : HWND; ButtonIcon : HICON; Text : string;
TextFont : HFONT; ButtonEnabled : boolean) : HWND;
const
BtnWidth = 200;
BtnHeight = 74;
BtnStyle = WS_CHILDWINDOW or WS_VISIBLE or BS_BITMAP;
Color_Values_Arr : array[boolean] of UINT = (LR_MONOCHROME, LR_DEFAULTCOLOR);
var
BtnH : HWND;
BtnDc : HDC;
MemDC : HDC;
NullBmp : HBITMAP;
BitmapH : HICON;
BmpRect : TRect;
Txtrect : TRect;
Caption : PChar;
BMInf : TagBITMAP;
IconInf : TIconInfo;
IconWidth, IconHeight : integer;
begin
Result := 0;
Caption := PChar(TexT);
BtnH := CreateWindow('Button', nil, BtnStyle, 18, 30,
BtnWidth, BtnHeight, HParentWnd, 0, HInstance, nil);
if GetLastError = 0 then
begin
Result := BtnH;
BtnDc := GetDC(BtnH);
MemDC := CreateCompatibleDC(BtnDc);
IconWidth := LR_DEFAULTSIZE;
IconHeight := LR_DEFAULTSIZE;
if GetIconInfo(ButtonIcon, IconInf) then
begin
if GetObject(IconInf.hbmColor, SizeOf(BMInf), @BMInf) > 0 then
begin
IconWidth := BMInf.bmWidth;
IconHeight := BMInf.bmHeight;
end;
end;
BitmapH := CreateCompatibleBitmap(BtnDc, BtnWidth - 8, IconHeight);
ReleaseDC(BtnH, BtnDc);
NullBmp := SelectObject(MemDC, BitmapH);
BmpRect.Left := 0;
BmpRect.Top := 0;
BmpRect.Right := BtnWidth - 8;
BmpRect.Bottom := IconHeight;
FillRect(MemDC, BmpRect, GetSysColorBrush(COLOR_BTNFACE));
DrawIconEx(MemDC, 0, 0, ButtonIcon, 0, 0, 0, 0, DI_NORMAL);
SelectObject(MemDc, TextFont);
SetTextColor(MemDC, GetSysColor(COLOR_WINDOWTEXT));
SetBkColor(MemDC, GetSysColor(COLOR_BTNFACE));
TxtRect.Left := IconWidth + 8;
TxtRect.Top := 0;
TxtRect.Right := BtnWidth - 8;
TxtRect.Bottom := 16;
DrawText(MemDC, Caption, -1, txtrect, DT_END_ELLIPSIS);
if not ButtonEnabled then
begin
SetTextColor(MemDC, GetSysColor(COLOR_BTNHIGHLIGHT));
//Fnt Font.Color := clBtnHighlight;
DrawText(BtnH, PChar(Caption), Length(Caption), TxtRect,
DT_CENTER or DT_VCENTER);
SetTextColor(MemDC, GetSysColor(COLOR_BTNSHADOW));
DrawText(BtnH, PChar(Caption), Length(Caption), TxtRect,
DT_CENTER or DT_VCENTER);
end
else
begin
DrawText(BtnH, PChar(Caption), Length(Caption), TxtRect,
DT_CENTER or DT_VCENTER);
end;
SelectObject(MemDC, NullBmp);
DeleteDC(MemDC);
SendMessage(BtnH, BM_SETIMAGE, IMAGE_BITMAP, BitmapH);
end;
end;