您的位置:寻梦网首页编程乐园VB 编程乐园VB问题全功略

VB问题全功略(33)

上一页(33)下一页

161、如何移除 MDIForm 的 Max/Min Button?
162、如何防止 Form 被移动?
163、如何设定 ComboBox 之最大长度?
164、如何撰写没 Form 的程序?
165、别让 MsgBox 中断了一些 Background 的处理作业

161、如何移除 MDIForm 的 Max/Min Button?

不像其他的 Form 一样,MDIForm 并没有提供 MaxButton 及 MinButton 的属性来让我们移除最大化及最小化的按钮,如果您想移除 MDIForm 的最大化及最小化的按钮,您可以在 MDIForm 中加入以下的程序,但是如果您只想移除其中的一个,则只要将对应的程序码加上注解符号即可。

'请在 MDIForm 的声明区中加入以下声明

#If Win32 Then
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
#Else
Private Declare Function SetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "User" (ByVal hwnd As Integer, ByVal nIndex As Integer) As Long
#End If

Const WS_MINIMIZEBOX = &H20000 '最小化
Const WS_MAXIMIZEBOX = &H10000 '最大化
Const GWL_STYLE = (-16)

'在 MDIForm 的 MDIForm_Load 事件中加入以下程序码

Sub MDIForm_Load()
Dim lWnd As Long
lWnd = GetWindowLong(Me.hwnd, GWL_STYLE)
lWnd = lWnd And Not (WS_MINIMIZEBOX) '最小化
lWnd = lWnd And Not (WS_MAXIMIZEBOX) '最大化
lWnd = SetWindowLong(Me.hwnd, GWL_STYLE, lWnd)
End Sub

162、如何防止 Form 被移动?

有些应用程序,我们希望固定 Form 的位置,不希望使用者移动它,在 VB5 以上的版本,我们可以直接在属性表中设定 Form 的 Moveable 属性为 False 即可。

但是 VB4 以下的版本却没有这个功能,这时就得借助 API 的功能了!而我们实际要做的,就是移除系统功能表 ( ControlBox ) 中的【移动】的功能,您可以检查一下您现在使用的浏览器左上方的系统功能表,【移动】的位置是第二个,所以 Index = 1 ( index 由 0 算起 )。

'请在表单的声明区中加入以下声明

Private Declare Function GetSystemMenu Lib "User" (ByVal hWnd As Integer, ByVal bRevert As Integer) As Integer
Private Declare Function RemoveMenu Lib "User" (ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer

Const MF_BYPOSITION = &H400

'在 Form_Load 事件中加入以下程序码

Private Sub Form_Load()
SystemMenu% = GetSystemMenu(hWnd, 0)
Res% = RemoveMenu(SystemMenu%, 1, MF_BYPOSITION) <--- 第二个参数是 Index
End Sub

163、如何设定 ComboBox 之最大长度?

在文字框 (TextBox) 中,我们可以设定 MaxLength 属性来设定文字框可输入的最大长度,但是同样具有一个文字框的 ComboBox,却没有提供这样的功能!要做到这个功能,必须自己写程序来判断。

'下面就是一个范例程序:
'我们在 Key_Press 事件来处理,程序中假设最大长度为 10,并已将倒退键排除在外

Private Sub Combo1_KeyPress(KeyAscii As Integer)
Const MAXLENGTH = 10 '设定最大长度为 10
If Len(Combo1.Text) >= MAXLENGTH And KeyAscii <> vbKeyBack Then
KeyAscii = 0
End If
End Sub

164、如何撰写没 Form 的程序?

一般在撰写 VB 的程序时,由于一进入 VB 的环境时就会自动产生一个 Form1,而 VB 本身又是一种事件驱动程序,所以有些人一直认为 VB 的程序一定会有一个以上的 Form 存在。其实 VB 也可以撰写一些完全没有表单 (Form) 的程序。

撰写的方法如下:
1、启动一个新的工程 (Project)
2、移除 Form1
3、开启一个 Module (名称可自取,或使用 Default 名称 Module1)
4、在 Module 中加入一段名为 Main 的 SubRoutine (名称一定要取为 Main)

'例:下面的程序执行时会开启 c:\test.txt 并写入一个数字,然后直接结束,没有任何表单。

Public Sub Main()
Open "c:\test.txt" For Output As #3
Print #3, 6666
Close #3
End '可有可无,会自动结束
End Sub

165、别让 MsgBox 中断了一些 Background 的处理作业

在 VB 中,一旦您呼叫了 MsgBox,您正在执行的一些 Background 的处理作业,例如计数器或时钟...等,都会停下来,直到您回应了 MsgBox 之后,一切才会恢复正常!或许您并不希望如此,这也有可能造成一些不必要的错误!

要解决这个问题,您必须使用 Windows API 去呼叫 MessageBox Function,它的使用方法、外观和 MsgBox 的结果完全相同,但是它却不会中断一些 Background 的处理作业!

在以下的范例中,您要在 Form 中加入一个 Label、二个 CommandButton 及一个 Timer,不更改任何属性。

'在声明区中加入以下声明:

Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

'加入以下程序码:

Private Sub Command1_Click()
MsgBox "计时器停掉了!", 64, "VB 的讯息框"
End Sub

Private Sub Command2_Click()
MessageBox Me.hwnd, "注意!计时器还在跑!", "API 的讯息框", 64
End Sub

Private Sub Form_Load()
Timer1.Interval = 1000
Label1.Caption = "目前的时间是:" & Time
End Sub

Private Sub Timer1_Timer()
Label1.Caption = "目前的时间是:" & Time
End Sub

上一页(33)下一页