ش | ی | د | س | چ | پ | ج |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Function BoxProc(ByVal hWnd As LongPtr, ByVal uMsg As Long, ByVal wParam As LongPtr, ByVal lparam As LongPtr) As LongPtr
Case WM_LBUTTONDOWN
Dim p As POINTAPI
GetCursorPos p
ScreenToClient hWnd, p
SetWindowTextA hWnd, "lbtn" & "..." & p.x & "." & p.Y
Case WM_DESTROY,WM_NCDESTROY
SetWindowLongptr hWnd,(-4),HookBox
End Select
BoxProc=CallWindowProc(HookBox,hWnd,Umsg,wParam,lParam)
End Function
در BS_OWNERDRAW یا خود Button کار نمی کند نتیجتا ترسیم شد ( منظور ناحیه ای که در تصویر پایین داخلش تکست Inside ترسیم شده) . DrawEdge و DrawTextA
dim rr as RECT
If wMsg = WM_PAINT Then
z1.Left = 285 + GetSystemMetrics(SM_CYFRAME) * 3 ' 296
z1.right = 348 + GetSystemMetrics(SM_CYFRAME) * 2 ' 355
z1.Top = 63 + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) * 2 ' 95
z1.bottom = 86 + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME) + 2 ' 115
(WindProc = DrawEdge(GetWindowDC(hwnd), z1, EDGE_RAISED, BF_RECT + BF_ADJUST
End If
If wMsg = WM_LBUTTONDOWN Then 'WM_MOUSEMOVE
Dim cp As POINTAPI
SetRect rr, 285, 63, 348, 86
GetCursorPos cp
ScreenToClient hwnd, cp
rr.Left = rr.Left + 2
rr.right = rr.right - 2
rr.Top = rr.Top - cp.y + 2
rr.bottom = rr.bottom - cp.y - 2
If PtInRect(rr, cp.x, cp.y) Then
End If
اگر شکل را مشاهده کنید زمان فشردن باتن سمت چپ ماوس در مستطیل موردنظر با مختصات صفحه در قسمت کپشن ویندو هم IN ارسال میشود
کار سختی نیست از منبعی که در انتهای صفحه آمده استفاده شده که تابع ویندوزی است
Declare PtrSafe Function PtInRect Lib "user32" (lpRect As RECT, pt As POINTAPI) As Long'
Use Belows Only
Declare PtrSafe Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
If PtInRect(nn, p.x, p.y) Then
" ... MsgBox "You Clicked Me
End If
.....RedrawWindow
مورد بالا تست شده
در 32 بیت