top
Loading...
VB使用編程技巧三則
p>1、VB中實現動態移動控件

窗體中的控件如按鈕、文本框等一般在運行時位 置是固定不變的,但為了能給用戶更方便的功能,我們可以做到在運行時動態移動控件的 位置,比如我們可以允許用戶隨便將按鈕放到自己喜歡的位置,而并非界面中固定的位置。 其實這個功能實現起來是很容易的,只需要使用API函數SendMessage傳遞控件移動的消息 即可。

下面是一個例子,當用戶單擊按鈕后可以移動按 鈕的位置。

在窗體的總體聲明部分聲明SendMessage函數及 用到的兩個常量:

PrivateDeclareFunctionSendMessageLib"user32"Alias_"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,_ByValwParamAsLong,lParamAsAny)AsLongConstWM_SYSCOMMAND=&H112ConstSC_MOVE=&HF012

在窗體中添加一命令按鈕Command1,雙擊寫代碼 如下:

PrivateSubCommand1_Click()Dimretn%retn=SendMessage(Command1.hwnd,WM_SYSCOMMAND,SC_MOVE,0)EndSub

在窗體中添加命令按鈕Command2,雙擊寫如下代 碼:

PrivateSubCommand2_Click()unloadmeEndSub

運行此程序,單擊命令按鈕1,然后移動鼠標可以 發現按鈕的邊框跟隨鼠標移動,在新位置處單擊鼠標就可以按鈕移動過去了,單擊按鈕2可 結束程序。

2、保持窗口的比例不變。

WINDOWS下的窗口一般都可以通過鼠標拖動來擴 大,有些時候我們需要控制窗口的比例不變,以防窗口比例失調時造成界面的不協調。要做 到這一點,可以利用API函數CallWindwosProc,當得到用戶調整窗口的消息時,判斷X或Y方 向上的比例是否和原來的比例一樣,如果不一樣,則調整為一樣。下面是一個例子。

在窗體中加一個命令按鈕Command1,雙擊寫如下 代碼:

PrivateSubCommand1_Click()UnloadMeEndSub

雙擊窗體寫如下代碼:

PrivateSubForm_Load()OldWindowProc=SetWindowLong(hwnd,GWL_WNDPROC,_AddressOfNewWindowProc)EndSub

將下面的代碼放入一個模塊中:

OptionExplicitPublicOldWindowProcAsLon聲明API函數如下:DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"_(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValmsgAsLong,_ByValwParamAsLong,lParamAsWINDOWPOS)AsLongDeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"_(   alhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLongPublicConstGWL_WNDPROC=-4定義一個窗口位置數據類型TypeWINDOWPOShwndAsLonghWndInsertAfterAsLongxAsLongyAsLongcxAsLongcyAsLongflagsAsLongEndTypePublicConstWM_WINDOWPOSCHANGING=&H46PublicConstWM_WINDOWPOSCHANGED=&H47處理窗口變化的函數PublicFunctionNewWindowProc(ByValhwndAsLong,ByValmsgAsLong,_ByValwParamAsLong,lParamAsWINDOWPOS)AsLongStaticdone_beforeAsBooleanStaticaspectAsSingleDimnew_aspectAsSingleIfmsg=WM_WINDOWPOSCHANGINGThenIflParam.cy>0Then保存原來的比例IfNotdone_beforeThenaspect=lParam.cx/lParam.cydone_before=TrueEndIfnew_aspect=lParam.cx/lParam.cyIfnew_aspect>aspectThenlParam.cy=lParam.cx/aspectElselParam.cx=aspect*lParam.cyEndIfEndIfEndIfNewWindowProc=CallWindowProc(OldWindowProc,hwnd,msg,wParam,lParam)EndFunction

運行此程序,當用鼠標拉窗體的邊界擴大窗口時, 將會發現另一邊也相應地擴大,整個窗口的比例不變,單擊command1結束程序。

3、使用系統的“關于”對話框。

也許你在軟件中需要一個“關于”對話框,如果要 求不高的話,可以不必再用一個窗體做“關于”對話框,可利用系統的對話框,雖然其中含有 微軟的一些信息,但你還是可以添加自己的某些信息,系統提供的“關于”對話框還有內存、 資源等有關信息,你不需再為這些信息寫任何代碼。要使用系統的“關于”對話框,只需聲明API 函數ShellAbout,然后直接調用即可,例如:

聲明API函數PrivateDeclareFunctionShellAboutLib"shell32.dll"_Alias"ShellAbout"(ByValhwndAsLong,ByValszAppAsString,_ByValszOtherStuffAsString,ByValhIconAsLong)AsLong在需要的地方使用它:PrivateSubABOUTCd_Click()x=ShellAbout(Form1.hwnd,"人事管理軟件2.0",_"新天地軟件工作室",Form1.Icon)EndSub
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗