VB以其易于学习、易于开发而深受广大开发人员的喜爱,但是在实际开发时,我们也会遇到很多问题,笔者总结了一些开发中常见的问题,给出了通用的解决方法,希望对VB开发人员有所帮助。
问:在VB应用程序中,如何实现窗体的简易移动?
答:如果你的窗体不需要标题栏,又希望能移动该窗体,像WinAmp一样简易移动,我们可以利用以下代码实现:
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
下面是将功能加入窗体的MouseDown事件中的代码,你也可将其加入其它控件的事件中:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&&&&
利用以上代码,我们就可实现窗体的简易移动。
问:如何在桌面上画图标?
答:下面一段程序利用了API函数在屏幕上实现画图标功能(注:p是图标的句柄,可以由ExtractIcon取得)。
deskhwnd = GetNextWindow(hwnd, GW_HWNDLAST)
'取最下面一个窗口
deskdc = GetWindowDC(deskhwnd)
'取窗口的情景设备
For i=0 To Screen.Width/32/15
'将屏幕坐标单位换算成“Pixel”,并计算可画的图标数
For j=0 To Screen.Height/32/15
DrawIcon deskdc, 32i, 32j, p
'在桌面上画图
Next j
Next i
用函数GetNextWindow取得其句柄,用函数GetWindowDC取出它的虚拟设备。需要注意的是,一旦窗口被覆盖,图标就会消失。
问:在VB应用程序中,如何取消窗体右上角的关闭功能?
答:如果你不想别人使用程序时直接用右上角的关闭功能来关闭程序,可用以下代码来实现该功能。
在Form_Unload事件中加入以下代码:
Private Sub Form_Unload(Cancel As Integer)
Cancel=True
End Sub
如果你想在关闭程序时提示是否关闭,可在Form_Unload事件中加入一个判断语句:
Private Sub Form_Unload(Cancel As Integer)
Cancel=True
Case Select msgbox "您真的想关闭吗?" ,VbOkCancel
Case VbOk
Cancel=False
Case Else
Cancel=True
End Select
End Sub
问:如何让VB应用程序中的连接具有超级链接效果?
答:我们以一个网址链接为例,讲解实现的方法。
首先我们新建一表单,在表单中加入一标签,Caption属性为http://ccidnet.com/,MouseIcon值为操作系统下Curors目录里的Hand.ico文件,MousePointer值为99。
在标签的MouseMove事件中加入如下代码:
Label1.ForeColor=&&&&HFF
在表单的MouseMove事件中加入如下代码:
Label1.ForeColor=&&&&HFF0000
在标签的Click事件中加入如下代码:
Dim a As String
a=Shell("Explorer.exe http://ccidnet.com/",3)
问:如何读取外部图标?
答:下面的一段程序就显示了如何读取程序中的图标,其中Picture1是一个图像框,dlgOpen是一个标准对话框,Command1是一个按钮;ExtractIcon函数有三个参数,第一个参数指定调用的应用程序,一般都用App.hInstance;第二个参数指定图标文件,可以是DLL、EXE和ICO;第三个参数的不同就决定了其返回值的不同,如果代入-1,就返回文件中包含的图标数,代入0则返回第一个图标的句柄,其余依此类推。
Private Sub Command1_Click()
Static total As Long,p(50) As Long,i As Integer
dlgOpen.Filter = "图标|.Exe;
.Ico;.Dll"
dlgOpen.ShowOpen
If Dir(dlgOpen.filename)<>"" Then
If ExtractIcon(App.hInstance, dlgOpen.filename, -1) = 0 Then '如果没有图标
MsgBox "No Icon!"
Else
total = ExtractIcon(App.hInstance, dlgOpen.filename, -1)
'取得总图标数
For i = 0 To total - 1
p(i) = ExtractIcon(App.hInstance, dlgOpen.filename, i) '读取每个图标
Next i
For i = 0 To total - 1 '依次显示每个图标
DrawIcon Picture1.hdc, 34 i, 0, p(i)
Next i
End If
End If
End Sub
……