在Visual Basic中如何拖动窗体或控件
现在的许多Windows下的应用程序,都采用了图形化的界面,例如:WINAMP等!这样做的好处是可以使程序界面更漂亮生动,更具吸引力。但是在这样的界面下就不能使用Windows原来的标题条了,否则会影响界面的美观性。那么在没有标题条的情况下如何用鼠标拖动窗体呢?或者拖动其它的控件呢?
其实,采用API函数调用很容易实现,下面我们以拖动窗体(Form1)为例来具体讲一下实现方法:
1.新建立一个项目,名称为:test.vbp.
2. 填加一个模块,名称为:test.bas,并且在声明部分加入以下代码:
Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_SYSCOMMAND = &H112
Public Const SC_MOVE = &HF012
其中ReleaseCapture函数是用来释放鼠标捕获的,SendMessage函数是一个在WindowsAPI中非常重要的函数,在这里的作用是用来向Windows发送移动窗体的消息。WM_SYSCOMMAND是向Windows发送消息的常量。SC_MOVE是控制移动窗体的常量。请注意:这里SC_MOVE的赋值一定要是&HF012,它表示鼠标对象。
3.在窗体的MouseDown过程中加入以下代码:
ReleaseCapture
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
其中ReleaseCapture函数用来释放鼠标捕获,SendMessage函数向Windows发送移动窗体的消息。
4.保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动而移动。就和其它著名的应用程序一样。
以上讲述了如何在VB中用鼠标拖动窗体,其实,控件的拖动的原理是一样的。
例如以下代码可以实现图片框的拖动:
ReleaseCapture
SendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
其实,运用API函数可以实现许多你意想不到的功能。如果需要更多有关VB的其它经验与技巧。建议访问http://vb2000.kstar.com站点。
拖动无系统标准标题栏的窗口
吴斌
大家知道,在VB中可以通过设置Form的属性,制作无系统标题栏的窗口。可是,由于失去了系统标题栏,如何使用鼠标拖动窗口便成了一个棘手的问题。其实,借助API函数ReleaseCapture和SendMessage,这个问题便可迎刃而解了。
首先,在module文件中加入下列声明语句:
Declare Sub ReleaseCapture Lib"User"()
Declare Function SendMessage Lib"User"(ByVal hWnd _
As Integer,ByVal wMsg As Integer,ByVal wParam As Integer,_lParam As Any)As Long
Public Const WM_SYSCOMMAND=&H112
Public Const SC_MOVE=&HF010
Public Const HTCAPTION=2
然后,在Form的MouseDown事件中加入下列代码:
ReleaseCapture
Ret&=SendMessage(Me.hWnd,WM_SYSCOMMAND,_SC_MOVE+HTCAPTION,0)
……
程序运行后,只要当光标落在Form区域时按住鼠标左键,便可以拖动窗口了。在一些要求生动活泼的界面的程序设计中,开发者常常希望自制风格独特的标题栏,以满足整个界面的要求。通过这个方法,就可以使自制的标题栏达到乱真的地步。不过,用作自制标题栏的控件,必须具有MouseDown事件以摆放上述代码。
移动没有标题栏的窗口
我们一般是用鼠标按住窗口的标题栏,然后移动窗口,当窗口没有标题栏时,我们可以用下面的方法来移动窗口:
在 BAS 文件中声明:
Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1
然后,在 Form_MouseDown 事件中:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub
VB编程中窗体的控制技巧
在Visual Basic中,每个应用程序都是从窗体(Form)开始的,窗体是构成用户接口的所有控件的容器。录活运用窗体的各项属性和操作,可以为用户设计出赏心悦目的操作界面。
1.窗体以当前屏幕分辨率全屏显示
在应用程序的编制调试过程中,用于经常用到菜单、工具条和工具框等辅助工具,一般不将窗体设为全屏显示,以便于操作;另外,当屏幕分辨率改变时,窗体可能不能正常显示,可以在窗体的Load事件中插入下列代码,即可使窗体启动时以当前屏幕分辨率全屏显示:
Private Sub Form_Load()
Form1.top=0 ‘设置窗体上边界位置
Form1.left=0 ‘设置窗体左边界位置
Form1.Width=Screen.Width ‘设置窗体宽度为屏幕宽度
Form1.Height=Screen.Height ‘设置窗体高度为屏幕高度
End Sub
2.使窗体保持在最上层
有时应用程序需要一个信息或查询窗体总保持在最上层,即使用读书切换到其他窗体也能看到该窗体,如Microsoft Word中的Find窗体,这是通过调用Windows API函数SetWindowPos()实现的,示例如下:
Option Explicit
Private Declare Function SetWindowPos Lib“User32”(ByValhwnd As Long,ByVal h WndInsertAfter As Long,ByVal x As Long,ByVAl y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags As Long)As Long
Const HWND_TOPMOST=-1
Const SWP_SHOWWINDOW=&H40
Private Sub Form_load()
Dim retValue As Long
RetValue=setWindowPos(me.hwnd,HWND_TOPMOST,Me.CurrentX,Me.CurrentY,300,300,SWP_SHOWWINDOW)
End Sub
3.窗体装入速度慢的处理技巧
在缺省情况下,Visual Basic装入和显示项目的第一个窗体。如果窗体装入过程超过一秒,用户只好耐心等待,特别是在窗体中含有大型位图或许多控件时。其实,微软在OFFICE组件中已经很好地处理了这一问题。下面的程序演示了处理低速窗体的装入技巧,在应用程序启动时,首先启动一