13. 无边框窗体的右键菜单 设计无边框窗体时,如果使用菜单编辑器,就会自动改变成有边框的窗体,此时,可以在另外一个窗体中(一般情况下你的程序应该不止一个窗体的吧,如果真的只有一个,可以利用其他人写的类,添加右键)编辑菜单(VISIBLE属性设为FALSE),然后在本窗体中调用。调用形式如下:
- Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
- If Button = 2 Then
- PopupMenu Form2.mymenu
- End If
- End Sub
复制代码 14.创建圆角无边框窗体 - Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Integer, ByVal Y1 _ As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal x3 As Integer, ByVal y3 As _ Integer) As Long
- Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
- Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hrgn As _ Long, ByVal bRedraw As Boolean) As Long
- Private Sub Form_Load()
- hround = CreateRoundRectRgn(0, 0, ScaleX(Form1.ScaleWidth, vbTwips, vbPixels), _ ScaleY(Form1.ScaleHeight, vbTwips, vbPixels), 20, 20)
- SetWindowRgn Me.hwnd, hround, True
- DeleteObject hround
- End Sub
复制代码 15.拖动没有标题栏的窗体 方法一:
- 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 HTCAPTION = 2
- Private Const WM_NCLBUTTONDOWN = &HA1
- Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
- Dim ncl As Long
- Dim rel As Long
- If Button = 1 Then
- i = ReleaseCapture()
- ncl = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
- End If
- End Sub
复制代码方法二:回调函数
- 'module:
- Public Const GWL_WNDPROC = (-4)
- Public Const WM_NCHITTEST = &H84
- Public Const HTCLIENT = 1
- Public Const HTCAPTION = 2
- Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal _ lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long
- Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As _
- Long, ByVal nIndex As Long) As Long
- Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As _
- Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- Public prevWndProc As Long
- Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal _Param As Long) As Long
- WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
- If Msg = WM_NCHITTEST And WndProc = HTCLIENT Then
- WndProc = HTCAPTION
- End If
- End Function
- 窗体中:
- Private Sub Form_Load()
- prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
- SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
- End Sub
- Private Sub Form_Unload(Cancel As Integer)
- SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
- End Sub
复制代码
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。