Private Sub Form_Load()
Labell.Caption=”请输入”
End Sub
Private Sub Gridl_KeyPress(KeyAscii As Integer)
Text1.StFocus
Textl.SelStart=0
If KeyAscii <> EnterAsc And KeyAscii <> TabAsc Then
SendKeys Chr(KeyAscii)
End IF
End Sub
Private Sub Gridl_RowColChange()
Textl.Text=Grid1.Text
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii=EnterAsc Then
Grid1.SetFocus
KeyAscii=0
End If
End Sub
Dim Returnvalue, I
Returnvalue = Shell("CALC.EXE", 1) ' 运行计算器。
AppActivate Returnvalue ' 激活计算器。
For I = 1 To 100 ' 设置计数循环。
SendKeys I & "{+}", True ' 按下按键给计算器
Next I' 将所有 I 值相加。
SendKeys "=", True ' 取得总和
SendKeys "%{F4}", True ' 按 ALT+F4 关闭计算器。
37,Q:ASP 编程中参数传递的几种方法:
A:
(1)、<form action=do.asp method=post>
<input name=var1>
<input type=submit>
</form>
在 do.asp 中用 request.form("var1") 取参数的值;
(2)、在 <form></form> 中 action=do.asp?var=参数值,或 <a href=do.asp=do.asp?var=参数值></a>
然后在 do.asp 中用 request.querystring("var") 取参数的值(这是一种明文传递方式);
(3)、使用 Cookies。设置 <%response.cookies("var")="参数值"%>,取值 <%=request.cookies("var")%>;
(4)、用 session 变量传递参数。设置<%Session("var")="参数值"%>,取值 <%=Session("var")%>
(注意:一旦使用了<% %> 的 ASP“标志”符号,该语句就必须保存在 ASP 文件中。)
38,Q:一次性清空本窗口内所有文本框(TextBox):
A:
Dim txt As Control
For Each txt In Me.Controls
If TypeOf txt Is TextBox Then
txt.Text = ""
End If
Next txt
(想一下:如果窗口中有几十个文本框,用传统的编程法要写多少行代码?体会一下面向对象编程的巨大威力吧!)
39,Q:怎样在 VB 程序中播放 Flash 动画?
A:要用到一个播放 Flash 动画的控件 Shockwave Flash。该控件在 Flash4 安装盘的 Plugins 目录下,安装文件是 InstallAXFlash.exe,安装后在 VB 部件中选定即可使用。该控件的主要属性和方法如下:
属性:Movie 动画文件
Playing True/False 是否自动播放
Loop True/False 是否循环播放
方法:Play 播放
Stop 停止
Forward 快进
Back 快退
Rewind 回放
GotoFrame(n) 绕到指定的帧播放
SetZoomRect(left,top,right,bottom) 设置放大时的位置
40,Q:怎样在 VB 程序中实现图象扫描功能?
A:同样要借用第三方提供的函数。在网站 http://www.twain.org/www/toolkit.html 可下载到 eztw32.dll 动态连接库文件,把它拷贝到 Windows 的 system 文件夹下就可以在 VB 中调用了。
41,Q:在 VB 编程中检测声卡是否存在?
A:
Option Explicit
Private Declare Function auxGetNumDevs Lib "winmm.dll" () As Long
Private Sub Form_Load()
Dim i As Integer
i = auxGetNumDevs()
If i > 0 Then 'There is at least one sound card on the system
MsgBox "A Sound Card has been detected."
Else 'auxGetNumDevs returns a 0 if there is no sound card
MsgBox "There is no Sound Card on this system."
End If
End Sub
42,Q:在 VB 中终止 Windows95 的运行:
A:在Visual Basic 程序中,可以使用 Windows API 的 ExitWindowsEx 函数来从程序中重新启动计算机系 统。 要使用该函数,需要将如下声明语句包含在窗体的通常声明部分中:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
ExitWindowsEx 函数需要 2 个参数,可以使用一个或多个下面的标识的组合来告诉 ExitWindowsEx 函 数希望进行哪种关机过程。
EWX_FORCE 所有进程都被强制终止
EWX_LOGOFF 所有的进程被强制止,并且用户退出登录(logged off)
EWX_POWEROFF 计算机系统被关机,并且如果支持节电特性则计算机被物理关机
EWX_REBOOT 计算机系统被关机并重新启动
EWX_SHUTDOWN 计算机被物理地安全地关机
下面的样例程序中使用了上面的三个标识的组合。该标识组合(EWX_LOGOFF,EWX_FORCE,以及EWX_REBOOT) 告诉 Windows 退出所有正在执行的进程,使用户退出网络登录,使计算机系统处于准备状态以供 用户关机。
样例程序的使用:
1,在 VB 中开始一个新的项目,采用缺省的方法建立 Form1;
2,将如下常量和声明语句添加到 Form1 的通常声明部分中(注意该声明语句需要书写在一行内):
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Const EWX_LOGOFF = 0
Const EWX_SHUTDOWN = 1
Const EWX_REBOOT = 2
Const EWX_FORCE = 4
Const EWX_POWEROFF = 8
Const EWX_RESET = EWX_LOGOFF + EWX_FORCE + EWX_REBOOT
3,在 Form1 上添加一个命令按钮控件,采用缺省的方法建立 Comand1, 将它的 Caption 属性设置为“ 重 新启动计算机”;
4,将如下代码添加到 Command1 的单击事件中:
Private Sub Command1_Click()
Dim X As Long
X = ExitWindowsEx(EWX_RESET, dwReserved)
End Sub
按下 F5 来运行上述样例程序,单击命令按钮,即可重新启动计算机系统。
43,Q:给一大段 VB 程序一次性加上注释符号:
A:VB 注释程序代码的符号是 ',只要在某行程序前面加上该符号就可以注释该行程序。但如果程序代码语句很多的时候,一行一行地注释就非常不方便。其实 VB 本身提供了一次性注释多条语句的功能:在主菜单“视图”选项的“工具栏”下,选中“编辑”,VB 的界面会出现一排工具按钮,其中就有用于“设置注释块”和“解除注释块”功能的按钮。选中一块语句,按该按钮即可。
44,Q:VB 中在一个窗体中执行另一个窗体中的代码:
A:可以用“窗体.代码”的模式去执行别的窗体的代码。假设要在窗体 frm1 里执行窗体 frm2 的Form_Click 代码,程序如下:
Private Sub Form_Click()
frm2.Form_Click() '在frm1 里执行 frm2 的 From_Click 代码
End Sub
45,Q:Visual Basic 5.0 支持类吗?
A:支持。您可以在 Visual Basic 5.0/6.0 的内部创建自己的类。具体说,您可以为各种类型的应用程序创建标准的基础类库,以便为具体类型的程序提供特定的功能,然后将这些类编译进您的应用程序中。这样做可以节省大量您在某一应用程序中重新编写一系列标准功能所需花费的时间。
46,Q:在 VB 5.0 中文版中,表单上最多允许有多少个控件?
A: Visual Basic 5.0 允许在表单上最多可以有 255 个控件。
47,Q:Visual Basic 能用来创建在 Windows CE 环境下运行的应用程序吗?
A:不能。目前情况下,您必须使用 Visual C++ 或其他与 Windows 95 兼容的 C/C++ 编译工具。
48,Q:Visual Basic5.0/6.0 能用来创建 Windows NT 服务吗?
A:不能。Windows NT 中的服务必须是完全用机器代码编译的可执行文件。Visual Basic 目前不具备这一功能。您必须使用 Visual C++ 4.x 或其他与 Windows NT 兼容的 C/C++ 编译工具来创建服务。有关编写 Windows NT 服务的信息,请参阅微软 MSDN 的有关内容。
49,Q:Microsoft Visual Basic 5 除了支持本机编译的代码外,还支持 p 代码吗?
A:支持。VB5.0 是第一个在将应用程序编译成 p 代码或本机代码方面提供了灵活操作可能性的 RAD 工具。编译成 p 代码可使应用程序的大小优化为最小。p 代码凭借这一最小化特性成为了低带宽条件下创建 Internet 应用程序的首选方式。本机代码编译极大地提高了速度(最高快 20 倍),但生成的可执行文件较大。 Visual Basic 是唯一既能够支持 RAD 的解释方式、编辑与连续、以及开发等,又能够支持从本机编译的 .EXE 文件的 RAD 工具。
50,Q:Microsoft Visual Basic 可以在 Macintosh 上使用吗?
A:VB4.0 引入了可移植的 VBA (Visual Basic for Applications)语言引擎。Microsoft Excel 5.0 最近已在 Macintosh 上发行,其中随附了 Excel 的 VBA 组件,因此在它上面就有这个语言引擎。微软目前似乎对 Macintosh 上的 Visual Basic 版没有任何承诺。
51,Q:Visual Basic 5.0/6.0 支持 16 位开发吗?
A:不支持。Visual Basic 5.0/6.0 只能创建 32 位可执行文件。开发 16 位 Windows 应用程序需要 Visual Basic 4.0。
52,Q:Visual Basic 5.0 中文版内的 Text Box 能存储 64K 以上的数据吗?
A:不能。VB5.0 中文版没有突破文本框的 64K 限制,因为它是由操作系统指定的。如果您需要存储 64K 以上的数据,应使用 Visual Basic 内含的多信息文本框。多信息文本框类似于多行文本控件,不同的是增加了个别字符和段落的格式编排功能。多信息文本框能够保存 64K 以上的文本,提供内置的 OLE 2.0 客户支持,主要特性包括:使一个段落内的文本左、右、居中对齐,可定义左制表位、字体样式、简单的项目符号、查找/替换、上标、下标、加删除线等格式编排。
53,Q:在 ASP 编程中统计查询结果的记录数:
A:
<%
Set theConn=Sever.CreateObject("ADODB.Connection")
Set theRs=Sever.CreateObject("ADODB.RecordSet")
theConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"
theRs.Open "SELECT COUNT(*) as Mycount FROM theTable",theConn
%>
共有<% =theRs("MyCount")%>条记录
<%
theRs.Close
theConn.Close
%>
54,Q:为何无法编译成 dll 文件?
A:无论是用 VB 还是 VJ++,在编译 Active dll 文件时都会发现无法重新编译成 dll 文件的问题。原因是第一次编译后 dll 文件已经被自动注册了。这时关闭 Web server 后即可再次编译,待编译完毕后再打开 Web server。
55,Q:资源文件有什么用处?
A:最重要的有两个地方:
1、国际发行:如果我们将 Application 中所有的文字从 Resource 中读取,那么,只要更动 Resource 文件的内容,就可以用不同语言的方式来显示;
2、管理资源:例如,我们的软件中用了数百张的图片或声音,不用 Resource 文档的话,在发行出去的软件中,就必需有数百个图形、声音文档,那似乎不太好,使用 Resource 文件,便可以将这些图形、声音放进一个 .Res 文档中。
56,Q:如何在 DOS 程序结束执行时,自动将其关闭?
A:在 VB 程序中启动 DOS 程序(或指令)的方法是:
Shell "DOS可执行文件名", vbNormalFocus
例如:Shell "Xcopy c:\temp\*.* d:\temp\*.*", vbNormalFocus
但是当以上的 Xcopy 程序结束执行时, 却会残留着 DOS 窗口没有被关闭,如果想要让 DOS 程序结束执行时, DOS 窗口自动被关闭, 则应该使用以下方法来启动 DOS 程序:
Shell "Command.com /C DOS可执行文件名", vbNormalFocus
例如:Shell "Command.com /C Xcopy c:\temp\*.* d:\temp\*.*", vbNormalFocus
57,Q:VB 编程中打开默认网址和 Email 的更简单的方法:
A:打开网址:Call Shell("start http://www.alchemydev.com", vbHide)
打开 Email:Call Shell("start mailto:admin@alchemydev.com", vbHide)
58,Q:我用 VB6.0 的 ActiveX dll 工程开发了一个在 ASP 中调用的 dll 类型库,里面有好多封装的函数,我能不能在 VB 的 EXE 工程中利用它们?
A:当然可以! 这正是微软 COM 模型的具体应用之一。具体用法是:在 VB 的 EXE 工程的 IDE 界面中,引用你建立的类库文件,然后在“对象浏览器”里就可以看到你的所有类及其函数。比方你的类 myobj 中有函数 myfun(),则调用语句是:
dim theobj as new myobj
ret = theobj.myfun() 'ret 为函数返回值
当然如果你要在别的机器上使用你的组件,就必须先进行注册:regsvr32 <你的组件名>
59,Q:“我爱你”病毒传播的秘密:
A:千禧年五月分大面积流行的 "ILOVEYOU" 病毒至今让人记忆尤新。这种病毒是一种通过电子邮件流行的典型的蠕虫病毒。她是通过调用 Outlook 的应用程序对象的属性和方法进行信件发送的,其发送邮件的基本代码如下:
Set OlApp = CreateObject("outlook.application")
Set Oitem = OlApp.CreateItem(olMailItem)
With Oitem
.Subject = "邮件主题"
.To = "收件人"
.Body = "邮件正文"
.attachments.Add "path:附件" ' 添加附件
.Send ' 发送邮件
End With
60,Q:在 PowerBuilder 中使用 RichTextEdit 控件,属性中没用 Font,我想设置字体怎么办(如果不设字体,读入一个文本文件,缺省的字体对不齐)?
A:RichTextEdit 没有 Font 属性,在 Document 属性页中选择 Toolbar,使用的时候可以自行选择字体。
61,Q:在一个 PowerBuilder 程序中,我想用 RichTextEdit 控件从本地取文本文件显示,可是在我的机器上 RTE 只能显示出少量英文和乱码,程序并没有编错,因为相同的程序在其他人的机器上显示出的是正确的文本,不知是什么原因?
A:应该是默认的类型不正确,导入的时候指定类型为 FileTypeText 试试。
62,Q:如何在 PowerBuilder 的 BLOB 字段中写入大于 1M 的文件(数据库为MSSQL 7.0)?
A:源文件分块写。
63,Q:用程序控制电脑说英语?
A:现在,应用 Microsoft 提供的一套文字朗读引擎(Text-To-Speech Engine,简称 TTS),可以在程序中编写代码来使安装了声卡的电脑流畅的朗读英文。如果安装了“金山词霸2000”,那么 Windows 文件夹下会有一个 Speech 文件夹,里面的文件 vtxtauto.tlb 文件就包含了有关的类型库和函数,我们完全可以在我们的程序中调用它们,使电脑开口说话。TTS 包含在“金山词霸2000”的安装盘上,文件名为 mstts.exe 和 spchapi.exe。要在 VB 程序中调用 TTS,必须首先引用 vtxtauto.tlb 文件中的“VoiceText 1.0 Type Library”类型库,然后参考以下代码,电脑就可以说话了:
Option Explicit
Private Sub Form_Load()
Call VTxtAuto.VTxtAuto.Register(Space(1), Space(1))
VTxtAuto.VTxtAuto.Speed = 170 '设置语速(170 为正常语速,值越小语速越慢)
Dim strTxt
strTxt = "I love you very much.Do you love me? "
On Error GoTo ErrorHandler
Call VTxtAuto.VTxtAuto.Speak(strTxt, vtxtsp_VERYHIGH + vtxtst_READING)
MsgBox "OK!"
End
ErrorHandler:
' 错误处理语句
End
End Sub
至于语速、频率等的控制,大家可以在“对象浏览器”里参看相关的控制属性。
(站长话题:什么时候能够让电脑说一口流利的中国普通话甚至是方言呢?
但愿不会让我们等待太久!
但愿生产厂家能够像微软一样把技术公布给普通用户!)
64,Q:怎样判断、防止程序重复执行?
A:
Private Sub Form_load()
'判断程序是否已经运行
If App.PrevInstance Then
MsgBox "本程序已经运行!", vbInformation Or vbOKOnly, "提示信息"
Unload Me
Exit Sub
End If
'以下是主要程序
' ……
End Sub
附:另一个例子:
Option Explicit
Public Sub CheckExist(fm As Form) '防止程序重复执行
Dim title As String
If App.PrevInstance Then
title = App.title
Call MsgBox("这程序已执行", vbCritical)
App.title = "" '如此才不会 Avtivate 到自己
fm.Caption = ""
AppActivate title 'activate 先前就已运行的程序
End ' 结束
End If
End Sub
Private Sub Form_Load()
Call CheckExist(Me)
End Sub
65,Q:如何结束 Shell 所启动的程序?
A:如果被 Shell 所启动的程序还没有结束,我们就想主动结束它,该怎么做呢? 此时应调用的 Windows API 是 TerminateProcess, 细节如下:
1. API 的声明:
Const SYNCHRONIZE = &H100000
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
(注1:如果以上的声明放在「一般模块」底下,应将 Declare 之前的 Private 保留字去掉,并且在 Const 之前加上 Public 保留字。)
2. Shell 的程序范例:(以执行 MS-DOS 为例)
Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
pId = Shell("Command.com", vbNormalFocus) ' Shell 传回 Process Id
pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
Call TerminateProcess( pHnd, 0 ) ' TerminateProcess 所传入的是 Process Handle
Call CloseHandle( pHnd )
(注2:以上的方案只适用于 Shell 所启动的程序,ShellExecute 则不适用,原因是 ShellExecute 函数是通过资源管理器来启动程序,而资源管理器启动程序之后,并没有将 Process ID 或 Process Handle 传回来。
注3:以上程序在 Windos98、VB6.0 下调试通过。)
66,Q:用 VB5.0 创建 Windows 程序组中的快捷方式:
A:
'API 函数声明:要在 VB5.0 中创建 Windows 的快捷方式,需要用到一个动态链接库 Vb5stkit.dll。在该动态链接库中提供了三个函数 OSfCreateShellGroup、OSfCreateShellLink、OSfRemoveShellLink,分别用于创建快捷方式程序组、快捷方式、删除快捷方式。这三个函数的声明形式分别如下:
Private Declare Function OSfCreateShellGroup Lib "Vb5stkit.dll" Alias "fCreateShellFolder" (ByVal lpstrDirName As String) As Long
Private Declare Function OSfCreateShellLink Lib "Vb5stkit.dll" Alias "fCreateShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String,ByVal lpstrLinkPath As String, ByVal lpstrLinkArguments As String) As Long
Private Declare Function OSfRemoveShellLink Lib "Vb5stkit.dll" Alias "fRemoveShellLink" (ByVal lpstrFolderName As String, ByVal lpstrLinkName As String) As Long
'实现的语句:
Dim lresult As Long
lresult = OSfCreateShellGroup("Test") '在程序菜单中添加一个名为 Test 的程序组
lresult = OSfCreateShellLink("test", "记事本", "c:\Windows\notepad.exe", "")
'在程序菜单的Test程序组下创建记事本的快捷方式
lresult = OSfRemoveShellLink("Test", "记事本") '删除 Test 程序组下的快捷方式
(注:在 Windows98/NT4.0、VB5.0 下可以正常运行。但创建桌面快捷方式和 Start Menu 快捷方式有些问题。在 VB6.0 中也有些问题(是否要安装 SP3?)。)
67,Q:VB 中使 TextBox 按 Mouse 右键时只出现自定 PopUp Menu?
A:一般我们可能在 TextBox 的 MouseDown Event 中 Check 是否按右键,若是,则设定出现 Popup Menu 程式如下:
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu MyMenu
End If
End Sub
可是出现的还是原先内定的 Popup Menu,之后再按一次右键,才出现我们自定的 menu。很奇怪吧?如果用 API 来解决,那便是要拦截 Mouse 的按键(使用 SubClassing 的技巧),但是有人发现了以下的方式便可以解决(也是一个十分实作性的经验):
Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
Text1.Enabled = False : Text1.Enabled = True
PopupMenu MyMenu
End If
End Sub
68,Q:用 VB 实现拖放功能:
A:拖放是用鼠标拖动一个对象到其它对象的活动。在图形操作过程中,拖放是最常用的功能之一,下面我们来看看怎样用 VB 实现拖放功能。
首先介绍与拖放有关的控件:
1.属性:DragMode 决定拖动操作的初始化是人工方式还是自动方式,DragIcon 确定在拖动过程中显示的指针的图标形状;
2.方法:Drag 开始,结束或取消拖动控件;
3.事件:MouseDown 事件发生于用户按下鼠标按钮时,DragOver 事件发生于拖动操作完成时,DragDrop 事件发生于拖动操作正在进行时。
然后编写一个小程序,这个程序能实现在窗口中或窗口间拖动图标的功能。建立窗口 Form1 和 Form2,在窗口中都加入 Image1,为它们设置初始显示的图片。键入以下代码(本程序在 VB5.0/6.0,Window95/98/NT4.0 环境下通过):
' Form1 下程序代码为:
Option Explicit
Dim dragx As Single
Dim dragy As Single
Const BEGIN_DRAG=1
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Image1.Picture=Source 'Sourse为被拖动的控件
Form2.Image1.Picture=LoadPicture("")
Image1.Move(X-dragx),(Y-dragy) ' X,Y为鼠标所在目标窗体或控件的当前坐标
End Sub
Private Sub Form_Load()
Load Form2
Form2.Show 0
End Sub
Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
dragx=X
dragy=Y
Image1.Drag BEGIN_DRAG '开始拖动操作
Image1.DragIcon = LoadPicture("按下鼠标时想显示的光标")
End Sub
' Form2 下程序代码为:
Option Explicit
Dim dragx As Single
Dim dragy As Single
Const BEGIN_DRAG=1
Private Sub Form_DragDrop(Source As Control,X As Single,Y As Single)
Image1.Picture=Source
Form1.Image1.Picture=LoadPicture("")
Image1.Move(X-dragx),(Y-dragy)
End Sub
Private Sub Image1_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)
dragx=X
dragy=Y
Image1.Drag BEGIN_DRAG
Image1.DragIcon=LoadPicture("按下鼠标时想显示的光标")
End Sub
69,Q:用 VB 程序如何改变桌面的墙纸图片?
A:此一问题需调用 SystemParametersInfo API 函数,细节如下:
1. API 的声明:
Const SPI_SETDESKWALLPAPER = 20
Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
注:如果以上的声明放在「一般模块」底下,应在 Const 之前加上 Public 保留字,并且将 Private 保留字去掉。
2. 程序范例:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称, SPIF_UPDATEINIFILE)
例如:
' 1. 将桌面图片设定成 c:\windows\setup.bmp:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_UPDATEINIFILE)
' 2. 将桌面图片清掉:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "", SPIF_UPDATEINIFILE)
程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, BMP图档名称, SPIF_UPDATEINIFILE)
但以上程序设定图片之后,必须等到下次 Windows 重新启动时才生效,如果希望设定之后立刻生效,则程序须修改如下:
Const SPIF_UPDATEINIFILE = &H1
Const SPIF_SENDWININICHANGE = &H2
Const SPI_SETDESKWALLPAPER = 20
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
此外希望只有本次使用 Windows 时改变桌面图片(下次开机时还原原状),则程序如下:
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "c:\windows\setup.bmp", SPIF_SENDWININICHANGE) ' 去掉 SPIF_UPDATEINIFILE
70,Q:用 VB 程序捕捉屏幕图像:
A:在 Form1 上添加一个 Picture 和 Command 控件,代码如下(Windows98/NT、VB6.0):
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateDC Lib "gdi32" Alias "CreateDCA" (ByVal lpDriverName As String, ByVal lpDeviceName As String, ByVal lpOutput As String, lpInitData As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Sub Command1_Click()
Form1.Visible = False
ScrnCap 0, 0, 640, 480
Form1.Visible = True
Picture1 = Clipboard.GetData()
End Sub
71,Q:测试表中的记录总数又一法(笨而准确):
A:
Dim db As Database ' DAO
Dim rs As Recordset
Dim theRecordNum As Long
Set db = OpenDatabase(App.Path & "\mylib.mdb")
Set rs = db.OpenRecordset("test") '测试表 test 中记录数
theRecordNum = 0
rs.MoveFirst
Do While Not rs.EOF()
theRecordNum = theRecordNum + 1
rs.MoveNext
Loop
Debug.Print theRecordNum ' 在监视窗口中输出
72,Q:如何判断生成的记录集是“空集”(记录数为 0)?
A:如果记录集的 eof 为真,则记录集是“空集”:
if AdoRS.EOF=true then
' ……
EndIf
73,Q:VB 编程中如何使窗口右上角的关闭按钮(X)失效?
A:用以下两个过程中的一个即可:
1、Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = True
End Sub
2、Private Sub Form_Unload(Cancel As Integer)
Cancel = True
End Sub
74,Q:用 VB 实现超级链接功能:
A:声明 ShellExecute 函数;在 form 上建立 label、line 控件各一个(myHttp、Line1),再仿照以下代码,即可打开浏览器登录 http://why100000.at.china.com 网站。
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub myHttp_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = False
End Sub
Private Sub myHttp_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = True
End Sub
Private Sub Form_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Visible = False
End Sub
Private Sub myHttp_Click()
Dim HttpJump
Dim MyUrl As String
MyUrl = "http://why100000.at.china.com"
HttpJump = ShellExecute(0&, vbNullString, MyUrl, vbNullString, vbNullString, vbNormalFocus)
End Sub
75,Q:在 VB 安装程序中加入“卸载”功能:
A:在制作安装盘的过程中,在建立程序项的时候,建立一个名为“卸载”的程序项,“目标”文本框中填入命令:
$(WinPath)\st6unst.exe -n "$(AppPath)\st6unst.log"
这样安装后的程序就会有卸载功能了。
76,Q:怎样在 VC++ 中产生闪烁的光标
A:先调用函数 CreateCaret(),然后再调用函数 ShowCaret()。例如:
if(CreateCaret(hWnd,NULL,2,20))
{
SetCaretPos(0,0);
ShowCaret(hWnd);
}
77,Q:VFP 程序编译成 .EXE 文件后运行,为在什么屏幕上一闪而过就结束了?
A:这是初学 VFP 的人易犯的一个错误,只要在主文件中加入 read events 语句,在退出程序中加入 clear events 即可。
78,Q:VB 中如何在保存并覆盖文件时让其出现对话框,询问是否替换
A:用 CommonDailog 控件,在 CommonDialog 控件 Flags 属性设定中添加 cdlOFNOverwritePrompt,如:
CommonDialog1.Flags=CommonDialog1.Flags Or cdlOFNOverwritePrompt
CommonDialog1.ShowSave
79,Q:VB6 中的字体出现乱码怎么办?
A:这是 VB 的 Bug。引起的原因是系统中安装了 Word2000 或 IE5.x 以及繁体支持,将繁体支持删除,或者安装 VB6 的 SP3 或 SP4 就可以解决问题。
80,Q:怎样用 VB 编写多线程程序
A:尽管 VB5.0 是单线程的,但用 addressof 加上一些 API 函数,就可以非常容易的做多线程程序。每一个线程约占用 20 毫秒的时间片。
VB5 有一个主线程,我们可以另外加一个工作线程。对于不清楚什么是单/多线程的程序员,我们用一个简单的列子来说明一下:
在 Form 里加上两个 timer 控件,把 interval 属性设成 5000(5秒),然后在两个 timer1_timer 事件中放一个大 Loop,如 for 10000 next, 运行。你会看到第二个 timer 控件不会在五秒后执行,除非 timer1 的for-next 结束。同样,如果你的程序中有大量的数据库读写,你的用户界面可能被“冻”。这时,我们就需要用多线程来改进程序了。(当然你可以用 DoEvents 来避免被冻,但用 DoEvents 有很多副作用-这里不提。)
我们用的第一个 API 是 CreateThread,VB 的格式是:
private declare function CreateThread Lib "kernel32" (byval pThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long
CreateThread 的参数指出你将要创立的线程是什么样子的,CreateThread 的返回值是一个线程的 handle。以下是
VB 的多线程初始化程序:
Public Sub Initialize(lpfnBasFunc as long)
dim dwStackSize as long
dim dwCreationFlags as long
dim lpThreadId as long
dim lpParameter as long
dim myNull as long
myNull = 0& 'create a null pointer
dwStackSize = 0 '0 表示用 exe stack size
dwCreationFlags = 4 '用 4 表示初始化后先不激活,让别人来激活
Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags,lpThreadId)
If Me.Thread = myNull then
Msgbox "create thread failed"
End if
End Sub
下面是两个 API 用来激活/暂停该线程:
private declare function ResumeThread lib "kernel32"(byval hThread as long)as long
private declare function SuspendThread lib "kernel32"(byval hThread as long)as long
让我们来用一个变量表示当前线程的状态:
public ThreadStatus as boolean
在 VB 里,可用 property 来实现 ThreadStatus 的管理。
Public property Let Enabled(byval vNewvalue as boolean)
if vNewvalue = true and Me.ThreadStatus = false then
ResumeThread Me.Thread
Me.ThreadStatus = True
elseif Me.ThreadStatus = true then
SuspendThread Me.Thread
Me.ThreadStatus = False
end if
End Property
这个简单的类可以用 New Object 来引用:
'make new thread object
dim myThread as New clsThreads '创建县城 Foo
myThread.Initialize AddressOf Foo '激活县城
myThread.Enabled = True
执行后,你可以用 PVIEW95.EXE 看到你的线程。你还可以提高你的线程的优先级:
SetThreadPriority '设优先级
GetThreadPriority '查优先级
你把以上的程序加入 timer 例子,就会看到两个 timer 同时运行。
这里要提醒一下,VB5 的开发环境是单线程的,如果你的程序写错,或中断后试图恢复,往往会出错,有时是严重出错。总之,用 VB 的多线程可以写出和 VC++ 一样快的程序,而且开发容易的多,开发效率也快得多。
81,Q:加快 Delphi5.0 启动速度
A:Delphi5.0 的启动确实有点慢,既要显示快闪窗口,又要读注册表设置,对于配置低的机器简直是一种折磨,实际上我们可以通过启动参数来控制它:
建立一个快捷方式,目标为:C:\DELPHI5\Delphi5\Bin\delphi32.exe /ns /np (假设 delphi 装在C:\delphi5 目录下),ns 表示 no splash,即不显示快闪屏幕,np 表示 no project,即不加载工程。
82,Q:观察 Delphi5.0 内存堆分配情况:
A:建立一快捷方式,目标为:C:\DELPHI5\Delphi5\Bin\delphi32.exe /hm /hv
此后每启动此快捷方式就可看到 Delphi5.0 的标题栏上不停变化的堆分配字节数。
83,Q:Delphi 中如何在打印或打印预览前获取报表页数
A:有时需要在打印前获取报表的打印页数,比如我们需要在页眉或页脚中打印“共 xx 页 第 xx 页”,如何实现呢?QuickReport 生成 Report 之前,我们是无法得知报表页数的,而 QuickReport 是在打印或打印预览时才生成报表,换言之我们只有在打印或打印预览前先将报表生成一次才能获取打印页数。生成报表的方法是 Prepare,请参考以下的例子:
...
var nPageCount:integer;
begin
{...}
QuickRep1.Prepare;
nPageCount:=QuickRep1.QRPrinter.PageCount;
QuickRep1.QRPrinter.Free;
QuickRep1.QRPrinter:=nil;
{在此修改QuickRep1,实现在页眉或页脚中打印“共 xx 页 第 xx 页” ... }
QuickRep1.PreView;
{...}
End;
84,Q:如何在 Delphi 中实现普通文件的拷贝?
A:示例代码如下:
procedure TForm1.btnCopyClick(Sender: TObject);
var
sfile,dfile : String;
begin
sfile :='a.txt'; //被copy的文件
dfile :='b.txt'; //copy后的文件名
CopyFile(pchar(sfile),pchar(dfile),false);
第三个参数为 false,如果 b.txt 已经存在,则覆盖;如果为 true,则不进行操作。
85,Q:用 Delphi 编写支持多国语言的程序
A:使用 Delphi5.0 的 Integrated Translation Environment(ITE) 可以轻易完成这个工作。
创建一个示意性的工程 MultiLanguage,在 Form 上放一个 Label 和一个 Button,分别把 Caption 赋值为“English Label”和“English Button”。
选择菜单 Project|anguages|Add ...,Delphi 显示 Add Languages 对话框, 选择 Next。
从语言列表中选中“英语(美国)”和“中文(中国)”,选择 Next。
ITE 会根据所选的语言创建子目录,目录名称是语言的缩写,选择 Next。
第一次增加语言时,Update Mode 为 Create new, 选择 Next。选择 Finish。
Delphi 会自动创建支持不同语言的资源动态库。Delphi 还会自动创建一个工程组,其中包括原有的 MultiLanguages.EXE,还包括新建的两个资源动态库(MultiLanguages.enu,MultiLanguages.chs)。保存工程组。
Delphi 启动 Translation Manager,左边是需要翻译的语言,右边是完成百分比。选择“中文(中国)”|Forms|Unit1,在右边第 15 行和 20 行填写翻译后的中文。保存并关闭。
打开 Project Manager,编译 MultiLanguages.enu 和 MultiLanguages.chs,Delphi 会在相应的子目录生成资源动态库,但后缀不是 DLL 而是 ENU 和 CHS。
86,Q:在 SQL Server 中怎么样恢复数据的存储?
A:在 SQL Server 中提供了这种恢复方式的存储过程。
一个数据库包括两个文件,mdf 数据库文件和 ldf 日志文件
1.sp_attach_db [@dbname =] 'dbname',[@filename1 =] 'filename_n'
给系统添加一个数据库,在 dbname 指定数据库名称,filename_n 指定数据库的文件和日志文件。比如我有一个 ji 的库,停止SQL Server 服务备份 ji_data.mdf,ji_log.ldf,启动SQL server,删除掉这个库,然后再把这两个文件拷到 sql server DATA 目录中,在 Query Analyzer 中执行如下语句:
EXEC sp_attach_db @dbname = N'ji',
@filename1 = N'd:\mssql7\data\ji_data.mdf',
@filename2 = N'd:\mssql7\data\ji_log.ldf'
就会把这个库加入到 SQL Server Group 中。
87,Q:Asp 中无 DSN 法连接 SQL Server 数据库的方法及其注意问题
A:无 DSN 法连接 SQL Server 数据库的方法示例如下:
'Less-DSN 法连接 SQLServer 服务器
set conn=server.createObject("adodb.connection")
conn.Open "driver={SQL Server};server=mysqlserver; database=jspcs; uid=sa; pwd=sql"
其中服务器名为 mysqlserver(ip=192.168.0.1),数据库为 jspcs,用户名为 sa,口令为 sql。由于使用了 TCP/IP 协议,所以 server=mysqlserver 语句段还可以写成指向安装 SQL Server 的机器的 IP 地址,即 server=192.168.0.1,注意该 IP 地址必须是网卡的默认(基本) IP 地址。同时,如果在 Client 端设置 SQL Server ODBC,也可以把服务器名输成 SQL Server 的 IP 地址。
88,Q:Delphi 中判断系统是否已经安装了声卡
A:要判断系统是否安装了声卡,调用 Winmm.dll 中的 waveOutGetNumDevs 和 midiOutGetNumDevs 函数就可以了。这两个函数在 Var 部分的说明如下:
function waveOutGetNumDevs: longint; stdcall; external 'winmm.dll' name 'waveOutGetNumDevs';
function midiOutGetNumDevs: longint; stdcall; external 'winmm.dll' name 'midiOutGetNumDevs';
//判断声卡是否存在
Function IsSoundcardInstalled : Boolean;
Var
WaveOutPutDeviceCount : Integer;
MidiOutPutDeviceCount : Integer;
Begin
Result := False;
WaveOutPutDeviceCount := waveOutGetNumDevs;
MidiOutPutDeviceCount := midiOutGetNumDevs;
if (WaveOutPutDeviceCount>0) and (MidiOutPutDeviceCount>0) Then
Result := True
Else
Result := False;
End;
procedure TForm1.Button1Click(Sender: TObject);
Begin
if IsSoundcardInstalled Then
ShowMessage('系统已经安装了声卡.')
Else
ShowMessage('系统没有安装声卡.');
end;
89,Q:用 ASP 打开 Web 服务器上的应用程序
A:
<%
dim wsh
set wsh = createobject("WScript.Shell")
response.write wsh.run("command.com")
set wsh = nothing
%>
90,Q:一个用进度条表示的时钟
A:在 Form 上拖 3 个进度条,命名为 h、m、s,分别表示时、分、秒,再放一个 Timer 控件,然后键入以下代码:
Private Sub Form_Load()
h.Orientation = ccOrientationVertical
h.Scrolling = ccScrollingSmooth
h.Max = 24: h.Min = 0
m.Orientation = ccOrientationVertical
m.Scrolling = ccScrollingSmooth
m.Max = 60: m.Min = 0
s.Orientation = ccOrientationVertical
s.Scrolling = ccScrollingSmooth
s.Max = 60: s.Min = 0
End Sub
Private Sub Timer1_Timer()
h.value = Format$(Now, "hh")
m.value = Minute(Now)
s.value = Format$(Now, "ss")
End Sub
91,Q:Delphi 中实现对日期数据的有效性检验
A:函数如下:
function isdate(s:string):boolean;
begin
result:=false;
try
strtodate(s);
result:=true;
except
on econverterror do
result:=false;
end;
end;
92,Q:PHP4 的 CGI 版本和 ISAPI 版本有什么区别?
A:1、CGI 方式是以 php.exe 来解释 .PHP 文件的,ISAPI 方式是以 php4ts.dll 来解释 .PHP 文件的;
2、ISAPI 会快一些;
3、ISAPI 据说可以支持 HTTP 认证等功能;
4、ISAPI 方式没有 CGI 方式稳定,也不大好配置;
5、ISAPI 方式只有 WIN32 下才有,而且在 ISAPI 方式下和 CGI 方式下的一些全局变量的值会不一样。
93,Q:VFP6.0 一条语句有多长?
A:VFP6 的参考中说,每条语句中字符数的最大值是 8192个,但命令编辑器每行最多只能键入 255 个字符,对于超过 255 个字符的命令行,可以用分号将语句分成多行,每行都不长过 250 个字符即可。注意如果是字符串常量跨行,则后续行应以编辑器本行的第一个位置为基准,否则字符串中间会无端地加许多空格。
94,Q:Delphi 中调用 Windows API 函数 ShellExecute 实现打开 IE 和 Outlook 应用程序?
A:在 uses 单元加入 Shellapi 引用,然后应用以下语句(函数):
打开 IE:ShellExecute(Handle,'open','http://www……',nil,nil,SW_SHOWNORMAL);
打开 IE:ShellExecute(Handle,'open','mailto:who@mail.addr?subject=…&body=…',nil,nil,SW_SHOWNORMAL);
如果以上函数的返回值小于或等于 32,则表明发生网络错误。
95,Q:用一条 SQL 语句找出“相同的客户代码中序号最大”的那些数据:
A: Select * from meney_in_list WHERE 序号 IN (select MAX(序号) from meney_in_list Group by 客户代码)
96,Q:在 Delphi5.0 中怎么找不到 Html 组件?
A: Html 组件在 Delphi4.0 中有,在 Delphi5.0 中已经升级为 TWebBrowser 组件,且功能有所加强,比如支持图片。
97,Q:在 Delphi 中实现控件焦点转移?
A:要在 Delphi 中实现按回车后控件焦点的转移,可以调用 Windows API 消息发送函数 PostMessage,做法如下:
把 Form1 的 KeyPreview 属性设为 True,在 Edit 和 Memo 的 onKeyPress 事件中加入以下代码:
if Key=#13 then
if not (ActiveControl is TMemo) then
PostMessage(Handle,WM_KERYDOWN,VK_TAB,0);
98,Q:在 Delphi 中判断本程序是否已经运行?
A:要判断实例是否运行,必须在程序的消息循环之前,在 Delphi 中,是在 Application.Initialize 之前。实现本功能, Delphi 使用的主要函数是 CreateMutex。这个函数用来生成一个 Mutex 对象的句柄,这个句柄具有操作系统的全局命名空间。
Delphi 例子程序的部分代码如下:
const MB_MINE = MB_OK or MB_ICONINFORMATION or MB_TASKMODAL;
var
hMutex: DWORD;
begin
hMutex := CreateMutex(nil, TRUE, 'MyMutex'); //TRUE 标明该进程拥有此 Mutex 对象
if (GetLastError = ERROR_ALREADY_EXISTS) then //Mutex 对象是否存在
begin
ReleaseMutex(hMutex);
Exit; //退出程序
end
else
if hMutex = ERROR_INVALID_HANDLE then //检查"mymutex"这个名字是否被其他诸如文件映射、信号灯和事件等对象占用
MessageBox(0, 'The name matched with a existing object!', 'Information',MB_MINE)
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
ReleaseMutex(hMutex); //释放 Mutex 对象
end;
99,Q:Delphi 与 VB、ASP 带变量参数 SQL 语句的比较
A:在 SQL 语句的 where 条件表达式中要带字符串变量 s 和数值变量 v,在 Delphi 中为:
strSQL:='select * from a_table where a_f1='+''''+s+''''+' and a_f2='+'v';
在 VB 和 Asp 中为:
strSQL="select * from a_table where a_f1='" & s & "' and a_f2=" & v
100,Q:Delphi 实现渐变窗口背景
A:创建一个应用程序,在 Form1 的 OnPaint 事件里面添加如下一段代码:
procedure TForm1.FormPaint(Sender: TObject);
var
i:word;
dy,y:real;
begin
dy:=clientheight/256;
y:=0;
for i:=255 downto 0 do
begin
canvas.brush.color:=$00000000+i*$10000;
canvas.fillrect(rect(0,round(y),clientwidth,round(y+dy)));
y:=y+dy;
end;
end;
101,Q:用 Visual Basic 保存 BMP 文件:
A: 在用VB编制绘图程序时,有时需要将窗体或图片框上的绘图结果形成一个定制的图形文件保存起来,以便以后浏览或修改。这一功能可以用 VB 本身带有的 SavePicture 语句来完成。
SavePicture语句将窗体、图象控件或图片框中的图形图象保存到磁盘上的一个文件中,这些图象可以是使用画图方法(Line,Circle,Pset)产生出来的,也可以存储那些通过设置窗体或图片框的图片属性或者通过PaintPicture 方法或 Load Picture 函数载入的图象。这些载入的图象可以是 BMP、ICO 或 WMF 图形文件。
SavePicture 语句的语法格式如下:
SavePicture picture,stringexpression
参数 picture 为窗体或图片框的 picture 或 image 属性;参数 strngexpression 为保存的文件名。
下面举一个具体的程序来说明定制图象文件的过程:
1、创建一个新的项目文件,在 Forml 中加入一个图象控件 Picture1,将Picture1 的 AutoRedraw 属性设置为 True;
2、在Form_Load() 事件中,加入如下代码:
Private Sub Form-Load()
Dim CX As Integer
Dim CY As Integer
Dim Limit As Integer
Dim Radius As Integer
CX=1000
CY=1000
For Radius=0 To Limit
Picturel.Circle(CX,CY),Radius,RGB(Rnd*255,Rnd*255,Rnd*255)
Next Radius
SavePicture Picturel.Image,"c:\custom.bmp"
End Sub
执行此程序就会把图片框 Picture1 上的图象保存在 C: 盘根目录下 custom.bmp 图象文件中。
最后有两点需要指出:
1、在使用 SavePicture 语句之前,必须先将窗体或图片框的 AutoRedraw 属性设为 True,否则保留的将是一张空图;
2、使用 Image 属性保存的用画图命令(如 Line,Cirele,Pset 或 Print)画出来的图形总是以 BMP 文件格式保存。但在程序设计时如果使用窗体或图片框的 Picture 属性载入或在程序运行时通过 LoadPicture 函数载入的图象,使用 SavePicture 语句存储时,存储的文件格式同其载入前的文件格式一样(如 ICO 格式等)。
102,Q:在 Visual Basic 中如何拖动窗体或控件?
A:现在的许多 windows 下的应用程序,都采用了图形化的界面,但是在这样的界面下就不能使用 Windows 原来的标题条了,否则会影响界面的美观。那么在没有标题条的情况下如何用鼠标拖动窗体或者其它的控件呢?
其实,采用 API 函数调用很容易实现,下面我们以拖动窗体 Form1 为例来具体讲一下实现方法:
1、新建立一个项目,名称为 test.vbp;
2、填加一个模块,名称为 test.bas,并且在声明部分加入以下代码:
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 WM_SYSCOMMAND = &H112
Public Const SC_MOVE = &HF012
其中 ReleaseCapture 函数是用来释放鼠标捕获的,SendMessage 函数是一个在 Windows API 中非常重要的函数,在这里的作用是用来向 Windows 发送移动窗体的消息。WM_SYSCOMMAND 是向 Windows 发送消息的常量。SC_MOVE 是控制移动窗体的常量。请注意:这里 SC_MOVE 的赋值是 &HF012,表示鼠标对象。
3、在窗体的 MouseDown 过程中加入以下代码:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Sub
其中 ReleaseCapture 函数用来释放鼠标捕获,SendMessage 函数向 Windows 发送移动窗体的消息。
4、保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动而移动。
以上讲述了如何在 VB 中用鼠标拖动窗体,其实,控件的拖动的原理是一样的。例如以下代码可以实现图片框的拖动:
ReleaseCapture
SendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
(注:以上程序在 Windows98、VB5.0/6.0 下调试通过。在 NT4.0、VB6.0 下不能运行。)
103,Q:用 Delphi5.0 编程实现 Windows 桌面的隐藏和显示
A:实现原理是调用 Windows 的 API 函数。程序代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var hDesktop:Thandle;
begin
hDesktop:=FindWindow('Progman',nil);
ShowWindow(hDesktop,SW_HIDE); //隐藏桌面
end;
procedure TForm1.Button2Click(Sender: TObject);
var hDesktop:Thandle;
begin
hDesktop:=FindWindow('Progman',nil);
ShowWindow(hDesktop,SW_SHOW); //显示桌面
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end
104,Q:应用 Microsoft TTS 语音引擎的 Delphi 语言实例
A:建立一个单窗体工程,添加一个 Edit 和 2 个 Button 控件,分别命名为 Edit1、btnSpeak、btnStop。然后安装引用 TTS 的 vtxtauto.tlb 类库文件,方法是点击菜单“工程-Import Type Library”,点“add”按钮,然后选中 Windows\speech 下的 Vtxtauto.tlb 文件,放入安装包后,再将其添加成 Delphi 的一个 Unit,自动产生的名字为“VTxtAuto_TLB”。然后,在主 Unit 的 Uses 里引用 VTxtAuto_TLB,即在 Uses 后添加字串“VTxtAuto_TLB”。最后参考以下代码:
……
procedure TfrmSpeech.FormCreate(Sender: TObject);
begin
vtxt:=CoVTxtAuto_.Create;
vtxt.Register('','Speech');
Edit1.Text:='I am a chinese, I love my homeland very much, and you?'
end;
procedure TfrmSpeech.btnSpeakClick(Sender: TObject);
begin
vtxt.Speed:=100;
vtxt.Speak(trim(Edit1.Text),10);
end;
procedure TfrmSpeech.btnStopClick(Sender: TObject);
begin
vtxt.StopSpeaking;
end;