如何模拟一个象窗体一样的控件(标题栏、焦点、拖动、
来源:互联网 发布:焊接仿真软件对比 编辑:程序博客网 时间:2024/05/01 22:30
用过SQL Server视图设计或Access查询设计的都见过这样的控件,控件外形象一个窗体,有边框、标题栏、图标、关闭按钮,可拖动、改变大小等等
我前一段时间在做一个自定义查询,想把界面做成象SQL Server的设计视图那样,终于在MSDN里面找到了一些资料
MSDN的一些URL(把msdn的安装路径改成你自己的路径):
一、添加一个User Control,控件结构如下
VERSION 5.00
Begin VB.UserControl TableView
AutoRedraw = -1 'True
ClientHeight = 4260
ClientLeft = 0
ClientTop = 0
ClientWidth = 3855
EditAtDesignTime= -1 'True
KeyPreview = -1 'True
ScaleHeight = 4260
ScaleWidth = 3855
Begin VB.PictureBox picTitle
BackColor = &H80000003&
BorderStyle = 0 'None
Height = 315
Left = 120
ScaleHeight = 315
ScaleWidth = 2715
TabIndex = 1
Top = 120
Width = 2715
Begin VB.Image imgClose
Height = 210
Index = 1
Left = 2400
Picture = "TableView.ctx":0000
Top = 0
Width = 240
End
Begin VB.Image imgTitle
Height = 180
Left = 60
Picture = "TableView.ctx":02E2
Top = 60
Width = 180
End
Begin VB.Image imgClose
Height = 210
Index = 0
Left = 1560
Picture = "TableView.ctx":04D4
Top = 0
Width = 240
End
Begin VB.Label lblTitle
BackColor = &H80000003&
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H8000000F&
Height = 255
Left = 240
TabIndex = 3
Top = 120
Width = 1995
End
End
Begin VB.ListBox lstColumn
Height = 1275
IntegralHeight = 0 'False
ItemData = "TableView.ctx":07B6
Left = 360
List = "TableView.ctx":07B8
OLEDragMode = 1 'Automatic
OLEDropMode = 1 'Manual
Style = 1 'Checkbox
TabIndex = 0
TabStop = 0 'False
Top = 600
Width = 2175
End
Begin VB.CommandButton cmdBack
Height = 2655
Left = 0
TabIndex = 2
TabStop = 0 'False
Top = 0
Width = 2895
End
End
Attribute VB_Name = "TableView"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
二、声明
' WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
Const HTERROR = (-2)
Const HTTRANSPARENT = (-1)
Const HTNOWHERE = 0
Const HTCLIENT = 1
Const HTCAPTION = 2
Const HTSYSMENU = 3
Const HTGROWBOX = 4
Const HTSIZE = HTGROWBOX
Const HTMENU = 5
Const HTHSCROLL = 6
Const HTVSCROLL = 7
Const HTMINBUTTON = 8
Const HTMAXBUTTON = 9
Const HTLEFT = 10
Const HTRIGHT = 11
Const HTTOP = 12
Const HTTOPLEFT = 13
Const HTTOPRIGHT = 14
Const HTBOTTOM = 15
Const HTBOTTOMLEFT = 16
Const HTBOTTOMRIGHT = 17
Const HTBORDER = 18
Const HTREDUCE = HTMINBUTTON
Const HTZOOM = HTMAXBUTTON
Const HTSIZEFIRST = HTLEFT
Const HTSIZELAST = HTBOTTOMRIGHT
Const WM_SIZE = &H5
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Const WM_CLOSE = &H10
Const WM_LBUTTONDOWN = &H201
Const MK_LBUTTON = &H1
Const WM_MOUSEMOVE = &H200
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 Sub picTitle_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
ReleaseCapture
SendMessage UserControl.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End If
End Sub
Private Sub UserControl_Resize()
On Error Resume Next
CloseBt = True
cmdBack.left = 0
cmdBack.width = UserControl.width
cmdBack.top = 0
cmdBack.height = UserControl.height
picTitle.left = 60
picTitle.top = 60
picTitle.width = UserControl.width - 150
picTitle.height = 255
imgClose(0).top = 30
imgClose(0).left = picTitle.width - 240
imgClose(0).Visible = CloseBt
imgClose(1).top = 30
imgClose(1).left = picTitle.width - 240
imgClose(1).Visible = (Not CloseBt)
lstColumn.left = 60
lstColumn.top = picTitle.height + 60
lstColumn.width = UserControl.width - lstColumn.left - 60
lstColumn.height = UserControl.height - lstColumn.top - 60
lblTitle.top = 60
lblTitle.left = 300
lblTitle.width = picTitle.width - 720
End Sub
Private Sub cmdBack_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim mvDir As Integer
If Button <> 1 Then Exit Sub
ReleaseCapture
If (X <= 60 And Y <= 60) Then
mvDir = HTTOPLEFT
ElseIf (cmdBack.width - X <= 60 And cmdBack.height - Y <= 60) Then
mvDir = HTBOTTOMRIGHT
ElseIf (X <= 60 And cmdBack.height - Y <= 60) Then
mvDir = HTBOTTOMLEFT
ElseIf (Y <= 60 And cmdBack.width - X <= 60) Then
mvDir = HTTOPRIGHT
ElseIf Y <= 60 And X > 60 And cmdBack.width - X > 60 Then
mvDir = HTTOP
ElseIf cmdBack.height - Y <= 60 And X > 60 And cmdBack.width - X > 60 Then
mvDir = HTBOTTOM
ElseIf X <= 60 And Y > 60 And cmdBack.height - Y > 60 Then
mvDir = HTLEFT
ElseIf cmdBack.width - X <= 60 And Y > 60 And cmdBack.height - Y > 60 Then
mvDir = HTRIGHT
End If
SendMessage UserControl.hwnd, WM_NCLBUTTONDOWN, mvDir, 0&
SendMessage UserControl.hwnd, WM_SIZE, 0, 0
UserControl_Resize
lstColumn.SetFocus
End Sub
Private Sub cmdBack_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (X <= 60 And Y <= 60) Then
cmdBack.MousePointer = 8
ElseIf (cmdBack.width - X <= 60 And cmdBack.height - Y <= 60) Then
cmdBack.MousePointer = 8
ElseIf (X <= 60 And cmdBack.height - Y <= 60) Then
cmdBack.MousePointer = 6
ElseIf (Y <= 60 And cmdBack.width - X <= 60) Then
cmdBack.MousePointer = 6
ElseIf Y <= 60 And X > 60 And cmdBack.width - X > 60 Then
cmdBack.MousePointer = 7
ElseIf cmdBack.height - Y <= 60 And X > 60 And cmdBack.width - X > 60 Then
cmdBack.MousePointer = 7
ElseIf X <= 60 And Y > 60 And cmdBack.height - Y > 60 Then
cmdBack.MousePointer = 9
ElseIf cmdBack.width - X <= 60 And Y > 60 And cmdBack.height - Y > 60 Then
cmdBack.MousePointer = 9
End If
End Sub
- 如何模拟一个象窗体一样的控件(标题栏、焦点、拖动、
- 如何拖动无标题栏窗体
- 一个拖动无标题栏窗体的方法 修正
- 窗体问题--拖动无标题栏的窗体
- 窗体标题栏外的拖动操作
- C#实现无标题栏窗体的拖动
- WPF:实现无标题栏窗体的拖动
- MFC 客户区 模拟标题栏 功能 ,实现窗体拖动
- 拖动无标题栏窗体
- 无标题栏窗体拖动
- 象QQ窗体一样隐藏
- 如何防止拖动窗体大小时控件闪烁的问题
- 窗体显示标题栏的时候,禁止鼠标拖动窗体
- C#拖动无标题栏窗体
- 非标题栏窗体拖动问题
- C#拖动无标题栏窗体
- Winform无标题栏拖动窗体
- 拖动无标题栏窗体 整理
- 使用JavaCard RMI接口
- 单元线程对象的生存周期
- JavaCard小应用程序结构
- MCI播放器在VB中实现
- JavaCard小应用程序简介
- 如何模拟一个象窗体一样的控件(标题栏、焦点、拖动、
- 在用ORACLE数据库和JSP连接时要注意的一些问题精粹
- 使用Windows消息控制Winamp(VB)
- 什么是J2ME及其基本慨念
- 看别人写的文件分割工具挺好用,也学着写了一个,附源
- Hibernate 的原理与配置快速入门
- 如何实现自己开发的网上实时电视广播系统?为你提供软
- Hibernate获得成功的十大理由
- ADO在MICROSOFT DATA ACCESS 中的角色