بسیار ساده ولی پر دردسر
Btn0 Bt t1
Btn1 Btnt2
Btn2 Btnt3
Btnt4
طبق نام های بالا کنترل هایی از نوع باتن در فرم ساخته شده در کنار هم و زیر هم دقیقا مثل موارد فوق الذکر، تابعی نوشته شد که در زمان اتفاق افتادن رویدادکلیک باتنی از باتن های سمت چپ کل باتن های سمت راست به زیر آن انتقال یابد .
Function Btn(Bt As Control3) As Doble
For i=1 to 4
Controls("Btnt" & i).Left=Bt.Left+300
موقعیت پراپرتی TOP هر یک از کنترل های سمت راست میشود ( فرضا Btnt1 میشود Btn0.Top به اضافه ی عرضش و Btnt2 میشود Btn0.Top + Btn.Height +Btnt2.Height
Controls("Btnt" & i).Top=Bt.Top+Bt.Height+(i-1)*Controls("Btnt" & i).Height
(Btn=Controls("Btnt4".Top
Next
یا بصورت زیر
Function Btn(Bt As Control) As Double
b = Bt.Top
For i = 1 To 4
Controls("Btnt" & i).Left = Btn0.Left+300
Controls("Btnt" & i).Top = b + Controls("Btnt" & i).Height * i
Btn = Controls("Btnt" & i).Top
Next
End Function
چنانچه هر یک Toppadding خودش را داشته باشه فرضا بین باتن های سمت راست هر کدام فواصل متغیری باشد باید آنها را هم در نظر بگیرید ولی معمولا باتن ها را بهم بچسبانید تا نیاز به کد نویسی اضافه تری نباشد.
در رویداد کلیک Btn0 میتوان نوشت که اولا Btnt ها زیر آن بیاید و Btn1 و Btn2 در زیر Btnt ها قرار گیرد
()Private Sub Btn0_Click
Btn1.Top = Btn(Btn0) + Btnt4.Height
Btn2.Top = Btn1.Top + Btn1.Height
End Sub
()Private Sub Btn1_Click
Btn1.Top=Btn0.Top+Btn0.Height
(Btn2.Top=Btn(Btn1
End Sub
()Private Sub Btn2_Click
Btn1.Top = Btn0.Top + Btn0.Height
Btn2.Top=Btn1.Top+Btn0.Height
(Call Btn(Btn2
End Sub
تست شده طبق فایل GIF زیر ، نام ها در کپشن باتن ها نوشته شد تا گیج کننده نباشد.
با DrawIcon هم می توان آیکونی را در DC صفحه انداخت
EC_LEFTMARGIN =&H1 EC_RIGHTMARGIN =&H2
EM_SETMARGINS=&HD3
: lParam
The HIWORD specifies the new width of the right margin, in pixels. This value is ignoredif wParam does
.notinclude EC_RIGHTMARGIN
در 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 ارسال میشود
WParwm : LBUTTON Or RBUTTON
lParam
Lo مختصات x کرسر را مشخص میکند . مختصات مرتبط با گوشه چپ بالایی از منطقه Client
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area
ho مختصات y کرسر را مشخص میکند . مختصات مرتبط با گوشه چپ بالایی منطقه Client
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area
در کل مختصات x و y گوشه چپ بالایی منطقه Client را مشخص می نماید.
Case WM_MOUSEMOVE
Dim rw As RECT
Dim rc As RECT
Dim pp As POINTAPI
GetWindowRect BtnOk, rw
pp.x = rw.left
pp.y = rw.top
ClientToScreen BtnOk, pp
GetCursorPos pp
If Not PtInRect(rw, pp) Then'
' MsgBox "rt'
'End If'
SetWindowTextA hwnd, pp.x & "," & pp.y & "...." & rw.left & "," & rw.top
اگر ازGetClientRect استفاده کنید مختصات left و Topرا صفر میدهد.
dim rw As RECT
GetWindowRect hwndBtnOk,rw
dim pp as POINTAPI
(pp.x = LoWord(lParam
( pp.y = HiWord(lParam
MoveWindow hwndBtnOk, pp.x, pp.y, (rw.right - rw.left), (rw.bottom - rw.top), 1
allow to drag & move userform via control Label1)
Private Declare Function ReleaseCapture Lib "user32" () As Long Private Const WM_NCLBUTTONDOWN = &HA1 Private Const HTCAPTION = 2 Dim hWndForm As Long Private Sub UserForm_Initialize() hWndForm = FindWindow("ThunderDFrame", Me.Caption) End Sub Private Sub lb1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) If Button = xlPrimaryButton Then Call ReleaseCapture Call SendMessage(hWndForm, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&) End If End Sub
HWND CreateWindowExA
dwExStyle
lpClassName
lpWindowName
dwStyle
X
Y
nWidth
nHeight
hWndParent
hMenu
hInstance
lpParam
WS_EX_WINDOWEDGE=&H100
WS_EX_TOOLWINDOW=&H80
: Window Styles
WS_BORDER=&H800000
WS_CHILD=&H40000000
WS_POPUP=&H80000000
: Note
The windows is a pop-up window. This style cannot'be used with the WS_CHILDstyle
Case WM_CREATE/SHOWWINDOW
: case WM_CREATE
"hButton = CreateWindow("button","Label,
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
100, 200,
50 ,20,
hWnd,(HMENU) BUTTON_ID,
0,0,
تست شده
The WM_PAINT message is sent when the system or another application makes a request to paint a portion
of an application's window
The PAINTSTRUCT
structure contains information that can be used to paint the.client area of a window
حاوی اطلاعاتی برای استفاده در نقاشی ناحیه ی Client پنجره.
Case WM_PAINT
Dim ps As PAINTSTRUCT
( hdc = BeginPaint(lhwnd, ps
Dim rrc As RECT
GetClientRect lhwnd, rrc
(( FillRect hdc, rrc, CreateSolidBrush(RGB(100, 0, 100
SetTextColor hdc, vbRed
TextOutA hdc, 10, 10, "sa", 2
EndPaint lhwnd, ps
ReleaseDC lhwnd, hdc
البته غیر از پیام زیر میشود با پیام WM_CTLCOLORBTN هم رنگ باتن را تغییر داد که lParam میشود هندل باتن و wParam هم هندل DC میشود
Case WM_DRAWITEM
Dim pDIS As DRAWITEMSTRUCT
Dim state
(CopyMemory pDIS, ByVal lParam, Len(pDIS
( hdc = GetDC(pDIS.hdc
Dim p As RECT
p = pDIS.rcItem
state = pDIS.itemState
GetClientRect can, p
If pDIS.CtlID = 2 Then
If state = 272 Then
RoundRect hdc, p.Left, p.Top, p.Right, p.Bottom, 16, 16
ReleaseDC can, hdc
Else
RoundRect hdc, p.Left, p.Top, p.Right, p.Bottom, 4, 4
ReleaseDC can, hdc
End If
End If
(CopyMemory ByVal lParam, pDIS,Len(pDIS