getdlgctrlid : Retrieves the identifier of the
.specified control
بر گرفته از فروم خارجی ( بررسی موقعیت ماوس در باتن موردنظر )
1-find your button rectangle
GetWindowRect BtnHwnd,BtnRect
2-transform form client coordinate in screen coordinate
ClientToScreen BtnRect,pt
(those 2 points in OnInitDialog or equivalent)
3-in OnMouseMove function check if mouse point is inside BtnRect (use PtInRect(BtnRect,pt) and if it is then do what u want to do.The mouse point u can found it this way:Dim pt As POINT
(pt.x = LOWORD(lParam
(pt.y = HIWORD(lParam
WM_SETCURSOR
. Do not change anything, just detect if wParam is HWND of your button. If it is, then set a
flag (some BOOL) and InvalidateRect(..) your button.
#define WM_SETCURSOR 0x0020
تست شده طبق توصیه ی دوست خارجی
Case WM_SETCURSOR
Dim cc As RECT
(hdc = GetWindowDC(can
GetClientRect can, cc ' Necessary
can is handle of Cancel Button'
If wParam = can Then
((FillRect hdc, cc, CreateSolidBrush(RGB(255, 0, 0
ReleaseDC can, hdc
Else
InvalidateRect can, cc, False
End If
Hook کردن MsgBox و Subclass کردن تغییر حالت باتن ها به BS_OWNERDRAW در ENUMCHILDPROC و گرفتن آیدی های باتن فرضا IDYES=6 و IDNO=7 و IDCANCEL=2 با GetDlgCtrlID که در مثال زیر در ناحیه کنترل Static در آخرش آیدی ها پرینت شده.
آیدی ها درمتغید تعریف شده بنام GetBtn ذخیره شده و با تابع Split در اکسس جدا شده ودر لوپ گذاشته شده این متد فقط با پیام DRAWITEN انجام میشود و پیام CTLCOLORBTN جواب نخواهد داد.
Case WM_DRAWITEM
Dim pDIS As DRAWITEMSTRUCT
Dim state
Dim p As RECT
Dim pdc As LongPtr
Dim OldBr As LongPtr
("," ,SplitBtn = Split(GetBtn
(For i = 0 To UBound(SplitBtn
(CopyMemory pDIS, ByVal lParam, Len(pDIS
DeleteObject OldBr
(( BtnHwnd = GetDlgItem(lhwnd, SplitBtn(i
p = pDIS.rcItem
pdc = pDIS.hdc
(hdc = GetWindowDC(pdc
pDIS.hwndItem = BtnHwnd
GetClientRect pDIS.hwndItem, p
,OldBr=SelectObject(hdc
((CreateSolidBrush(RGB(100, 0, 135
RoundRect hdc, p.Left, p.Top, p.Right, p.Bottom, 16, 16
ReleaseDC BtnHwnd, hdc
DeleteObject OldBr
(CopyMemory ByVal lParam, pDIS, Len(pDIS
Next
Case WM_SETCURSOR
Dim cc As RECT
Dim txt
(" ,",SplitBtn = Split(GetBtn
(For j = 0 To UBound(SplitBtn
DeleteObject OldBr
((BtnHwnd = GetDlgItem(lhwnd, SplitBtn(j
(txt = GetText(BtnHwnd
GetClientRect BtnHwnd, cc
(hdc = GetWindowDC(BtnHwnd
GetClientRect BtnHwnd, cc
If wParam = BtnHwnd Then
cc.Left = cc.Left + 2.5
cc.Top = cc.Top + 2.5
cc.Right = cc.Right - 2.5
cc.Bottom = cc.Bottom - 2.5
(( FillRect hdc, cc, CreateSolidBrush(RGB(255, 0, 0
DrawText hdc, txt, Len(txt), cc, DT_CENTER ReleaseDC BtnHwnd, hdc
DeleteObject OldBr
Else
InvalidateRect BtnHwnd, cc, False
ReleaseDC BtnHwnd, hdc
DeleteObject OldBr
End If
Next
SetBkMode hdc,0'