用过SQL Server视图设计或Access查询设计的都见过这样的控件,控件外形象一个窗体,有边框、标题栏、图标、关闭按钮,可拖动、改变大小等等 
     我前一段时间在做一个自定义查询,想把界面做成象SQL Server的设计视图那样,终于在MSDN里面找到了一些资料 
MSDN的一些URL(把msdn的安装路径改成你自己的路径): 
mk:@MSITStore:d:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001JAN\1033\winui.chm::/hh/winui/mousinpt_7ik4.htm 
mk:@MSITStore:d:\Program%20Files\Microsoft%20Visual%20Studio\MSDN\2001JAN\1033\winui.chm::/hh/winui/mousinpt_6085.htm 
一、添加一个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
   
 
  |