سلام
اينجا چند تا سوال بود كه فكر ميكنم بتونم جواب بدم.
اول مساله OnTop كردن يه فرم اينو به كد فرمتون اضافه كنيد :
[code:1]Option Explicit
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
' SetWindowPos() hwndInsertAfter values
Private Const HWND_TOP = 0 'Send To Front
Private Const HWND_BOTTOM = 1 'Send To Back
Private Const HWND_TOPMOST = -1 'Always On Top
Private Const HWND_NOTOPMOST = -2 'Normal
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering
Private mOnTop As Boolean
Public Property Get OnTop() As Boolean
OnTop = mOnTop
End Property
Public Property Let OnTop(ByVal vNewValue As Boolean)
mOnTop = vNewValue
Dim Temp As Long
Temp = IIf(mOnTop, HWND_TOPMOST, HWND_NOTOPMOST)
SetWindowPos hwnd, Temp, Left / Screen.TwipsPerPixelY, Top / Screen.TwipsPerPixelX, Width / Screen.TwipsPerPixelX, Height / Screen.TwipsPerPixelY, SWP_NOACTIVATE Or SWP_SHOWWINDOW
End Property[/code:1]
حالا هر وقت احتياج شد كه فرم OnTop بشه راحت بنويس :
ّForm1.OnTop=True
اين جواب اين سوال آخري هم بود.
در مورد فرمي كه مستطيل نباشه . تو ويندوز يه چيزي هست به نام Region و یه سری تابع برای خودش داره (یه سر بزن به MSDN) حالا من یه برنامه اینجا میذارم که فرمو گرد میکنه بعدم واسه اینکه فقط سوال جواب نداده باشم یه تیکه هم خودم اضافه میکنم که باعث میشه فرم رو بتونید با گرفتن کلیک موس روی هر کجای اون (نه فقط روی نوار عنوانش) جابجا کنید.
[code:1]
Option Explicit
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Const WM_CAPTURECHANGED = &H215
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub Form_Load()
Dim Temp As RECT
Dim Rgn As Long
GetWindowRect hwnd, Temp
With Temp
.Top = .Top - Top / Screen.TwipsPerPixelY
.Bottom = .Bottom - Top / Screen.TwipsPerPixelY
.Left = .Left - Left / Screen.TwipsPerPixelX
.Right = .Right - Left / Screen.TwipsPerPixelX
End With
Rgn = CreateEllipticRgnIndirect(Temp)
SetWindowRgn hwnd, Rgn, True
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
ReleaseCapture
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End If
End Sub[/code:1]
در مورد Region توابع دیگه ای هم هست که مثلا لبه های فرمو <پخ> میکنه یا اینکه فرمو چند ضلعی میکنه ولی چون این از همه راحت تر بود و منهم یک گلابی تنبل هستم راحتترینشونو انتخاب کردم و نوشتم.
دوستدار شما خرگوش کوچولو(گلابی خانواده)
تا بعد ....
( ;<
شرمنده گويا سوتي داده بودم. ولي خوب شد كه اول از همه خودم متوجه شدم(البته فكر ميكنم!)
اينجا چند تا سوال بود كه فكر ميكنم بتونم جواب بدم.
اول مساله OnTop كردن يه فرم اينو به كد فرمتون اضافه كنيد :
[code:1]Option Explicit
Private Declare Function SetWindowPos Lib "user32" _
(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
' SetWindowPos() hwndInsertAfter values
Private Const HWND_TOP = 0 'Send To Front
Private Const HWND_BOTTOM = 1 'Send To Back
Private Const HWND_TOPMOST = -1 'Always On Top
Private Const HWND_NOTOPMOST = -2 'Normal
' SetWindowPos Flags
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20 ' The frame changed: send WM_NCCALCSIZE
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200 ' Don't do owner Z ordering
Private mOnTop As Boolean
Public Property Get OnTop() As Boolean
OnTop = mOnTop
End Property
Public Property Let OnTop(ByVal vNewValue As Boolean)
mOnTop = vNewValue
Dim Temp As Long
Temp = IIf(mOnTop, HWND_TOPMOST, HWND_NOTOPMOST)
SetWindowPos hwnd, Temp, Left / Screen.TwipsPerPixelY, Top / Screen.TwipsPerPixelX, Width / Screen.TwipsPerPixelX, Height / Screen.TwipsPerPixelY, SWP_NOACTIVATE Or SWP_SHOWWINDOW
End Property[/code:1]
حالا هر وقت احتياج شد كه فرم OnTop بشه راحت بنويس :
ّForm1.OnTop=True
اين جواب اين سوال آخري هم بود.
در مورد فرمي كه مستطيل نباشه . تو ويندوز يه چيزي هست به نام Region و یه سری تابع برای خودش داره (یه سر بزن به MSDN) حالا من یه برنامه اینجا میذارم که فرمو گرد میکنه بعدم واسه اینکه فقط سوال جواب نداده باشم یه تیکه هم خودم اضافه میکنم که باعث میشه فرم رو بتونید با گرفتن کلیک موس روی هر کجای اون (نه فقط روی نوار عنوانش) جابجا کنید.
[code:1]
Option Explicit
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Const WM_CAPTURECHANGED = &H215
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub Form_Load()
Dim Temp As RECT
Dim Rgn As Long
GetWindowRect hwnd, Temp
With Temp
.Top = .Top - Top / Screen.TwipsPerPixelY
.Bottom = .Bottom - Top / Screen.TwipsPerPixelY
.Left = .Left - Left / Screen.TwipsPerPixelX
.Right = .Right - Left / Screen.TwipsPerPixelX
End With
Rgn = CreateEllipticRgnIndirect(Temp)
SetWindowRgn hwnd, Rgn, True
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
ReleaseCapture
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End If
End Sub[/code:1]
در مورد Region توابع دیگه ای هم هست که مثلا لبه های فرمو <پخ> میکنه یا اینکه فرمو چند ضلعی میکنه ولی چون این از همه راحت تر بود و منهم یک گلابی تنبل هستم راحتترینشونو انتخاب کردم و نوشتم.
دوستدار شما خرگوش کوچولو(گلابی خانواده)
تا بعد ....
( ;<
شرمنده گويا سوتي داده بودم. ولي خوب شد كه اول از همه خودم متوجه شدم(البته فكر ميكنم!)