Maks150988 В связи с тем, что все равно сабклассишь как и я свои кнопки в подобных приложениях вот код (взято из открытого проекта - там красивое определение каптурения кнопки). Но юзаю OwnerDraw стиль кнопки.
Код: function ButtonProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
point :TPoint;
Rect :TRect;
begin
case Msg of
WM_MOUSEMOVE:
begin
GetCursorPos(point);
GetWindowRect(hwnd, rect);
if PtInRect(rect, point) then begin
if GetCapture <> hWnd then begin
SetCapture(hWnd);
MouseOver:=OverOK;
InvalidateRect(hWnd,nil,FALSE);
end;
end else begin
ReleaseCapture;
MouseOver:=NotOver;
InvalidateRect(hWnd,nil,FALSE);
end;
end;
end;
result := CallWindowProc(pointer(OldBtnProc), hWnd, Msg, wParam, lParam);
end;
procedure OnDrawItem(const DStr:PDRAWITEMSTRUCT);
var
DC :HDC;
Rect :TRect;
BtnText
Char;
Focused :boolean;
holdFont,HTFont :HFONT;
Color :TCOLORREF;
begin
case DStr.CtlType of
ODT_BUTTON:
begin
DC:=DStr.hDC;
Rect:=DStr.rcItem;
case DStr.CtlID of
BTN_OK: begin
BtnText:=PChar(GetProp(DStr.hWndItem,'Caption'));
if (DStr.itemState and ODS_FOCUS)<>0 then Focused:=True else Focused:=False;
if (DStr.itemState and ODS_SELECTED)<>0 then
DrawButtonDown(DC,Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,Focused,BtnText)
else DrawButton(DC,Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,Focused,BtnText);
if (MouseOver=OverOK) and NOT ((DStr.itemState and ODS_SELECTED)<>0) then
DrawButtonUp(DC,Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,Focused,BtnText);
end;
end;
end;
end;
end;
WM_DRAWITEM: OnDrawItem(PDRAWITEMSTRUCT(lParam));