My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual Basic > 用户界面
如何模拟一个象窗体一样的控件(标题栏、焦点、拖动、改变大小、关闭等等)
作者:sor 时间:2001-11-01 10:41 出处:互联网 责编:MyFAQ
              摘要:如何模拟一个象窗体一样的控件(标题栏、焦点、拖动、改变大小、关闭等等)

     用过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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有