操作VB中的无边框窗体

2018-06-17 17:12:11来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素。这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体。但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦。本文介绍在VB中如何用API函数操作无边框窗体。

移动窗体

新建一标准工程,设置Form1的BorderStyle属性为0。此时运行程序后,无法移动窗体。为能移动窗体,在Form1的代码窗口声明下列函数和常数:

OptionExplicit

PrivateDeclareFunctionReleaseCaptureLib“user32”()AsLong

PrivateDeclareFunctionSendMessageLib“user32”Alias“SendMessageA”(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

ConstWM_SYSCOMMAND=&H112

ConstSC_MOVE=&HF012

在Form_MouseDown事件中输入以下代码:

PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

'按下鼠标左键

IfButton=vbLeftButtonThen

'为当前的应用程序释放鼠标捕获

ReleaseCapture

'移动窗体

SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0

EndIf

EndSub

注意:此时窗体上不能放置除Shape控件以外的任何控件,否则,在被控件遮住的地方点按鼠标还是无法移动窗体。要使点按控件也能移动窗体,需再添加一个该控件的MouseDown事件过程,代码与上述过程代码相似。

改变窗体的大小

为了改变窗体的大小,需要添加一个Timer控件,以定时捕获鼠标在窗体中的位置。当鼠标位于窗体边缘时,改变鼠标的形状,以通知用户可以进行改变大小的操作。为此,将Timer控件的Interval属性设为100(即每过100毫秒检测一下鼠标位置),其他取默认值。

在Form1的代码窗口中再添加下列两个函数,并定义两个自定义变量和一个字符串变量:

'取得窗体位置的函数

PrivateDeclareFunctionGetWindowRectLib“user32”(ByValhwndAsLong,lpRectAsRECT)AsLong

'取得鼠标位置的函数

PrivateDeclareFunctionGetCursorPosLib“user32”(lpPointAsPOINTAPI)AsLong

'鼠标位置变量

PrivateTypePOINTAPI

xAsLong

yAsLong

EndType

'窗体位置变量

PrivateTypeRECT

LeftAsLong

TopAsLong

RightAsLong

BottomAsLong

EndType

'所要执行的动作变量,是移动还是改变大小及从哪个方向改变大小

DimActionAsString

在Timer1控件的Timer事件过程中添加以下代码:

PrivateSubTimer1_Timer()

DimMyRectAsRECT

DimMyPointAsPOINTAPI

'MyRect返回当前窗口位置

CallGetWindowRect(Me.hwnd,MyRect)

'MyPoint返回当前鼠标位置

CallGetCursorPos(MyPoint)

SelectCaseTrue

'鼠标位于窗体左上方

CaseMyPoint.x<MyRect.Left+5AndMyPoint.y<MyRect.Top+5

Screen.MousePointer=vbSizeNWSE

Action=“LeftUp”

'鼠标位于窗体右下方

CaseMyPoint.x>MyRect.Right-5AndMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNWSE

Action=“RightDown”

'鼠标位于窗体右上方

CaseMyPoint.x>MyRect.Right-5AndMyPoint.y<MyRect.Top+5

'45度双向鼠标指针

Screen.MousePointer=vbSizeNESW

Action=“RightUp”

'鼠标位于窗体左下方

CaseMyPoint.x<MyRect.Left+5AndMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNESW

Action=“LeftDown”

'鼠标位于窗体左边

CaseMyPoint.x<MyRect.Left+5

'水平双向鼠标指针

Screen.MousePointer=vbSizeWE

Action=“Left”

'鼠标位于窗体右边

CaseMyPoint.x>MyRect.Right-5

Screen.MousePointer=vbSizeWE

Action=“Right”

'鼠标位于窗体上方

CaseMyPoint.y<MyRect.Top+5

'垂直双向鼠标指针

Screen.MousePointer=vbSizeNS

Action=“Up”

'鼠标位于窗体下方

CaseMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNS

Action=“Down”

'鼠标位于窗体其他位置

CaseElse

'默认鼠标指针

Screen.MousePointer=0

Action=“Move”

EndSelect

EndSub

当利用SendMessage函数由系统向窗口发送改变大小的信息时,只要将上面移动窗体的语句“SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0”中的第3个参数改为相应的常数即可。

VB中&HF001~&HF008分别是从左、右、上、左上、右上、下、左下、右下8个方向改变窗体大小的常数。结合移动窗体的代码,将上述Form_MouseDown事件的代码综合如下(也可以把这8个常数声明为自定义常数):

PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)

'按下鼠标左键

IfButton=vbLeftButtonThen

'为当前的应用程序释放鼠标捕获

ReleaseCapture

SelectCaseAction

Case“Left”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF001,0

Case“Right”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF002,0

Case“Up”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF003,0

Case“LeftUp”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF004,0

Case“RightUp”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF005,0

Case“Down”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF006,0

Case“LeftDown”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF007,0

Case“RightDown”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF008,0

Case“Move”

SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0

EndSelect

EndIf

EndSub

->

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:VB“超频”秘籍之给字符串提速

下一篇:用VB实现象Windows记事本的一些功能