----1、VB中實現動態移動控件 ----窗體中的控件如按鈕、文本框等一般在運行時位置是固定不變的,但為了能給用戶更方便的功能,我們可以做到在運行時動態移動控件的位置,比如我們可以允許用戶隨便將按鈕放到自己喜歡的位置,而並非界面中固定的位置。其實這個功能實現起來是很容易的,只需要使用API函數SendMessage傳遞控件移動的消息即可。
----下面是一個例子,當用戶單擊按鈕後可以移動按鈕的位置。
----在窗體的總體聲明部分聲明SendMessage函數及用到的兩個常量:
PrivateDeclareFunctionSendMessage
Lib"user32"Alias_
"SendMessageA"(ByValhwndAs
Long,ByValwMsgAsLong,_
ByValwParamAsLong,lParamAsAny)AsLong
ConstWM_SYSCOMMAND=&H112
ConstSC_MOVE=&HF012
----在窗體中添加一命令按鈕Command1,雙擊寫代碼如下:
PrivateSubCommand1_Click()
Dimretn
retn=SendMessage(Command1.hwnd,
WM_SYSCOMMAND,SC_MOVE,0)
EndSub
----在窗體中添加命令按鈕Command2,雙擊寫如下代碼:
PrivateSubCommand2_Click()
unloadme
EndSub
----運行此程序,單擊命令按鈕1,然後移動鼠標可以發現按鈕的邊框跟隨鼠標移動,在新位置處單擊鼠標就可以按鈕移動過去了,單擊按鈕2可結束程序。
----2、保持窗口的比例不變。 ----WINDOWS下的窗口一般都可以通過鼠標拖動來擴大,有些時候我們需要控制窗口的比例不變,以防窗口比例失調時造成界面的不協調。要做到這一點,可以利用API函數CallWindwosProc,當得到用戶調整窗口的消息時,判斷X或Y方向上的比例是否和原來的比例一樣,如果不一樣,則調整為一樣。下面是一個例子。
----在窗體中加一個命令按鈕Command1,雙擊寫如下代碼:
PrivateSubCommand1_Click()
UnloadMe
EndSub
----雙擊窗體寫如下代碼:
PrivateSubForm_Load()
OldWindowProc=SetWindowLong(hwnd,GWL_WNDPROC,AddressOfNewWindowProc)
EndSub
----將下面的代碼放入一個模塊中:
OptionExplicit
PublicOldWindowProcAsLon
'聲明API函數如下:
DeclareFunctionCallWindowProcLib
"user32"Alias"CallWindowProcA"_
(ByVallpPrevWndFuncAsLong,ByVal
hwndAsLong,ByValmsgAsLong,_
ByValwParamAsLong,lParamAs
WINDOWPOS)AsLong
DeclareFunctionSetWindowLongLib
"user32"Alias"SetWindowLongA"_
(ByValhwndAsLong,ByValnIndex
AsLong,ByValdwNewLongAsLong)AsLong
PublicConstGWL_WNDPROC=-4
'定義一個窗口位置數據類型
TypeWINDOWPOS
hwndAsLong
hWndInsertAfterAsLong
xAsLong
yAsLong
cxAsLong
cyAsLong
flagsAsLong
EndType
PublicConstWM_WINDOWPOSCHANGING=&H46
PublicConstWM_WINDOWPOSCHANGED=&H47
'處理窗口變化的函數
PublicFunctionNewWindowProc
(ByValhwndAsLong,ByValmsgAsLong,_
ByValwParamAsLong,lParamAsWINDOWPOS)AsLong
Staticdone_beforeAsBoolean
StaticaspectAsSingle
Dimnew_aspectAsSingle
Ifmsg=WM_WINDOWPOSCHANGINGThen
IflParam.cy>0Then
'保存原來的比例
IfNotdone_beforeThen
aspect=lParam.cx/lParam.cy
done_before=True
EndIf
new_aspect=lParam.cx/lParam.cy
Ifnew_aspect>aspectThen
lParam.cy=lParam.cx/aspect
Else
lParam.cx=aspect*lParam.cy
EndIf
EndIf
EndIf
NewWindowProc=CallWindowProc
(OldWindowProc,hwnd,msg,wParam,lParam)
EndFunction
----運行此程序,當用鼠標拉窗體的邊界擴大窗口時,將會發現另一邊也相應地擴大,整個窗口的比例不變,單擊command1結束程序。
----3、使用系統的“關於”對話框。 ----也許你在軟件中需要一個“關於”對話框,如果要求不高的話,可以不必再用一個窗體做“關於”對話框,可利用系統的對話框,雖然其中含有微軟的一些信息,但你還是可以添加自己的某些信息,系統提供的“關於”對話框還有內存、資源等有關信息,你不需再為這些信息寫任何代碼。要使用系統的“關於”對話框,只需聲明API函數ShellAbout,然後直接調用即可,例如:
'聲明API函數
PrivateDeclareFunction
ShellAboutLib"shell32.dll"_
Alias"ShellAbout"(ByValhwnd
AsLong,ByValszAppAsString,_
ByValszOtherStuffAsString,
ByValhIconAsLong)AsLong
在需要的地方使用它:
PrivateSubABOUTCd_Click()
x=ShellAbout(Form1.hwnd,"VB編程樂園網站指南","博士電腦軟件工作室",Form1.Icon)
EndSub->