VB编程俱乐部

Author: 庞一鸣 Date: 1999年 第14期 13版

    VB编程俱乐部推出以后,我们每天都会收到热心读者的来信,并且许多上互联网的朋友也加入到我们的网站中来相互讨论、交流。欢迎爱好编程的读者加入到VB编程俱乐部来,共同学习、共同进步。
    在提交问题或解答问题时,请使用 VBForums@126.com 或 VBForums@bigfoot.com这两个邮件地址,也可以通过网站http://VBForums.yeah.net 在 BBS上讨论。
    问题1:请问在VB中如何关闭别的应用程序窗口?我用API的FindWindow函数找到IE4的窗口,但用API的CloseWindow函数只使该窗口最小化,而不能关闭,应该怎样做?
    答:首先,建立一个类模块,利用 API察看器程序,将需要用到的常量定义和API函数粘贴过来,如:
    Public ConstWM_CLOSE = &H10
    Public Const WM_QUIT = &H12
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
    接下来,就可以利用FindWindow函数获取窗口句柄,然后向这个窗口发送WM_CLOSE或WM_QUIT信息让窗口自行关闭:
    Handle = FindWindow("IEFrame",vbNullString)
    PostMessage Handle,WM_CLOSE,0,0 或 PostMessage Handle,WM_QUIT,0,0 均可。
    问题2:我在Access97中建立了一个库存查询,由于有一种产品没有出库,只有入库,造成库存查询中没有这种产品的库存,请问怎样解决这个问题?
    答:Access 97支持三种连接方式:左连接、右连接、等值连接。你的问题主要是使用了等值连接!在等值连接方式下,只有两个表中键值相等的行才会出现在结果表中,其他行被放弃,所以出现了你所见到的情况。只要使用左连接或右连接就可以解决你的问题,例如使用以下SQL语句可以实现:
    SELECT 入库.产品编码,入库.名称,入库.数量AS入库数量,出库.数量 AS 出库数量 FROM 入库 LEFT JOIN 出库 ON 入库.产品编码 = 出库.产品编码
    这样,只要货物入库,无论是否出库,均可以查询出来。
    问题3:Windows 9x的文件拷贝既有动画,又有复制进度条显示,VB中如何实现?此动画能在Windows中提取出来吗?
    答:在 VB 中使用进度控件和AVI显示控件就可以做到像Windows 9x 那样的效果了。此AVI动画在 VB5 的光盘上可以找到。
    问题4:在Windows环境下如何用VB实现任务栏右下角的小图标?并通过该图标对应用程序进行控制?如果要用到API函数,应如何使用?用哪些API函数?还有无别的方法来实现?
    答:在VB光盘的tools\unsupport\systray目录下有一个例子,将此目录复制到硬盘,编译生成一个OCX控件,在自己的程序中使用此控件,可以实现将程序图标放于右下角系统图标区,这方法比调用API要简单得多。
    问题5:如何在VB中获取可执行文件及Windows 95快捷方式的图标?
    答:使用API函数 LoadImage 就可以实现图标的获取:
    Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long,ByVal lpsz As String,ByVal un1 As Long,ByVal n1 As Long, ByVal n2 As Long,ByVal un2 As Long) As Long
    通过LoadImage函数从指定的文件中读取ICON、BitMap、Cursor等资源。本函数的参数组合比较多,而且使用起来复杂,详细讨论请读者参与到VBForums 网站来中进行。
    问题6:怎样利用Mscomm32控件判断MODEM是否打开,或者正在工作,并且怎样判断拨号时是否遇忙音?
    答:用Mscomm32控件向接MODEM的串口发送“AT”命令,有回应“OK”就表示MODEM已打开,否则表示关闭。检测正在工作可用Mscomm32的CDHolding属性来判断(可参考VB帮助)。拨号后若MODEM返回“BUSY”,则表示忙音。在执行前,必须先设置好MODEM,并可查看一些关于MODEM的AT命令的资料!
    问题7:如何实现鼠标移到窗口上时变大,移出窗体时变小(如《东方快车》)?
    答:用Form 的 Mouse_Move事件来检查鼠标是否在窗口内:
    如果在窗口内就使窗口尺寸变大(Me.Height = 大窗口高度值);
    如果鼠标离开就使窗口尺寸变小(Me.Height = 大窗口高度值);
    但是,最好不要直接对窗口的尺寸进行增减,应该首先判断窗口尺寸是否已经是所需窗口的大小,最后设定窗口始终在最前方。下面附上代码,供参考:
    '首先应设置Form1.BorderStyle = 0
    Option Explicit
    Dim a As Long
    Dim b As Long
    Private Sub Form_Load()
    a = 3500
    b = 1000
    Form1.BackColor = vbMagenta
    Form1.Width = a
    Form1.Height = b
    End Sub
    '鼠标移动到窗口则窗口变大反之则变小
    Private Sub Form_MouseMove(Button As Integer,Shift As Integer, X As Single,Y As Single)
    Form1.Width = 8200
    Form1.Height = 2450
    If (X > 8000) or (Y > 2000) or (X < 200) or (Y < 200)Then '在理论上应取0<X<8200 or 0<Y<2450,考虑到读屏幕上的鼠标较慢会产生错误,这个范围可根据实际情况选取。
    Form1.Width = a
    Form1.Height = b
    End If
    End Sub