- <数据>
  <名称>制作垂直标题栏的窗体下</名称> 
  <类别>窗体</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-10&nbsp;12:36:46</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>垂直</关键字1> 
  <关键字2>窗体</关键字2> 
  <关键字3>标题栏</关键字3> 
  <内容简介 /> 
  <内容>Form1&nbsp;<br> <br> Private&nbsp;Sub&nbsp;Form_Load()<br> prevWndProc&nbsp;=&nbsp;GetWindowLong(Me.hwnd,&nbsp;GWL_WNDPROC)<br> SetWindowLong&nbsp;Picture1.hwnd,&nbsp;GWL_WNDPROC,&nbsp;AddressOf&nbsp;WndProc<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Form_Unload(Cancel&nbsp;As&nbsp;Integer)<br> SetWindowLong&nbsp;Picture1.hwnd,&nbsp;GWL_WNDPROC,&nbsp;prevWndProc<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Picture1_Paint()<br> Dim&nbsp;font&nbsp;As&nbsp;LOGFONT,&nbsp;hOldFont&nbsp;As&nbsp;Long,&nbsp;hFont&nbsp;As&nbsp;Long<br> Dim&nbsp;w&nbsp;As&nbsp;Integer,&nbsp;h&nbsp;As&nbsp;Integer,&nbsp;r&nbsp;As&nbsp;RECT<br> <br> With&nbsp;Picture1<br> <br> RtlMoveMemory&nbsp;font.lfFaceName(0),&nbsp;_<br> ByVal&nbsp;CStr(.font.Name),&nbsp;_<br> LenB(StrConv(.font.Name,&nbsp;vbFromUnicode))&nbsp;+&nbsp;1<br> font.lfHeight&nbsp;=&nbsp;(.font.Size&nbsp;*&nbsp;-20)&nbsp;/&nbsp;Screen.TwipsPerPixelY<br> font.lfEscapement&nbsp;=&nbsp;2700<br> font.lfWeight&nbsp;=&nbsp;IIf(.font.Bold,&nbsp;700,&nbsp;400)<br> font.lfItalic&nbsp;=&nbsp;.font.Italic<br> font.lfUnderline&nbsp;=&nbsp;.font.Underline<br> font.lfStrikeOut&nbsp;=&nbsp;.font.Strikethrough<br> font.lfCharSet&nbsp;=&nbsp;DEFAULT_CHARSET<br> hFont&nbsp;=&nbsp;CreateFontIndirect(font)<br> hOldFont&nbsp;=&nbsp;SelectObject(.hDC,&nbsp;hFont)<br> <br> r.Left&nbsp;=&nbsp;0:&nbsp;r.Top&nbsp;=&nbsp;0<br> DrawText&nbsp;Me.hDC,&nbsp;.Tag,&nbsp;LenB(StrConv(.Tag,&nbsp;vbFromUnicode)),&nbsp;r,&nbsp;DT_CALCRECT<br> w&nbsp;=&nbsp;r.Right<br> h&nbsp;=&nbsp;r.Bottom<br> <br> .Cls<br> <br> .CurrentX&nbsp;=&nbsp;.ScaleWidth&nbsp;-&nbsp;h&nbsp;/&nbsp;2<br> .CurrentY&nbsp;=&nbsp;cmdClose.Height&nbsp;+&nbsp;15<br> Picture1.Print&nbsp;.Tag<br> <br> SelectObject&nbsp;.hDC,&nbsp;hOldFont<br> DeleteObject&nbsp;hFont<br> End&nbsp;With<br> End&nbsp;Sub</内容> 
  </数据>
- <数据>
  <名称>用API函数控制光驱的开关</名称> 
  <类别>VBAPI</类别> 
  <数据来源>yesky</数据来源> 
  <来源时间>2001-11-24&nbsp;22:09:12</来源时间> 
  <保存时间>2002-01-05&nbsp;22:14:01</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>光驱</关键字2> 
  <关键字3>开关</关键字3> 
  <内容简介>NULL</内容简介> 
  <内容>使用API函数CDdoor&nbsp;来控制光驱门的开和关程序十分简单,由于&nbsp;CDdoor&nbsp;函数自身包含了对异常错误的处理机制,因此这个程序的通用性很高,你可以把这段代码移植到你的程序中,实现某些多媒体播放器所常用的开关光驱的功能。&nbsp;<br> 以下是源代码:<br> <br>   -------------------------------------------<br>   &nbsp;利用API函数控制光驱的开和关<br>   -------------------------------------------<br>   程序说明:<br>   &nbsp;本例使用API函数&nbsp;CDdoor&nbsp;来控制光驱门的开和关<br>   程序十分简单,由于&nbsp;CDdoor&nbsp;函数自身包含了对异常<br>   错误的处理机制,因此这个程序的通用性很高,你可<br>   以把这段代码移植到你的程序中,实现某些多媒体播<br>   放器所常用的开关光驱的功能。<br>   -------------------------------------------<br> <br> Option&nbsp;Explicit<br> <br>   说明:CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;CDdoor&nbsp;Lib&nbsp;"winmm.dll"&nbsp;Alias&nbsp;"mciSendStringA"&nbsp;_<br> (&nbsp;_<br> ByVal&nbsp;lpstrCommand&nbsp;As&nbsp;String,&nbsp;_<br> ByVal&nbsp;lpstrReturnString&nbsp;As&nbsp;String,&nbsp;_<br> ByVal&nbsp;uReturnLength&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;hwndCallback&nbsp;As&nbsp;Long&nbsp;_<br> )&nbsp;As&nbsp;Long&nbsp;<br> <br>   CDOpen用来标示光驱开与关的状态<br> <br> Dim&nbsp;CDOpen&nbsp;As&nbsp;Boolean<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> On&nbsp;Error&nbsp;Resume&nbsp;Next<br> &nbsp;<br> <br>   如果关闭则打开,并且按钮做相应变化<br> <br> If&nbsp;CDOpen&nbsp;=&nbsp;False&nbsp;Then<br> Call&nbsp;CDdoor("set&nbsp;CDAudio&nbsp;door&nbsp;open",&nbsp;0,&nbsp;0,&nbsp;0)<br> CDOpen&nbsp;=&nbsp;True<br> Command1.Caption&nbsp;=&nbsp;"点击关闭光驱"<br> Else&nbsp;<br> <br>   否则关闭<br> <br> Call&nbsp;CDdoor("set&nbsp;CDAudio&nbsp;door&nbsp;closed",&nbsp;0,&nbsp;0,&nbsp;0)<br> CDOpen&nbsp;=&nbsp;False<br> Command1.Caption&nbsp;=&nbsp;"点击打开光驱"<br> End&nbsp;If<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Form_Load()<br> CDOpen&nbsp;=&nbsp;False<br> Call&nbsp;CDdoor("set&nbsp;CDAudio&nbsp;door&nbsp;closed",&nbsp;0,&nbsp;0,&nbsp;0)<br> End&nbsp;Sub<br> &nbsp;<br> <br>   CDdoor函数是安装WINDOWS时所自带的winmm.dll文件中包含的函数,我们只须先加入如下的声明后就能引用这个API函数:<br> <br>   Private&nbsp;Declare&nbsp;Function&nbsp;CDdoor&nbsp;Lib&nbsp;"winmm.dll"&nbsp;Alias&nbsp;"mciSendStringA"&nbsp;_&nbsp;<br>    (&nbsp;_&nbsp;<br>    ByVal&nbsp;lpstrCommand&nbsp;As&nbsp;String,&nbsp;_&nbsp;      String,这是控制命令参数<br>    ByVal&nbsp;lpstrReturnString&nbsp;As&nbsp;String,&nbsp;_    String,这是返回值<br>    ByVal&nbsp;uReturnLength&nbsp;As&nbsp;Long,&nbsp;_       Long,返回值长度参数<br>    ByVal&nbsp;hwndCallback&nbsp;As&nbsp;Long&nbsp;_<br>    )&nbsp;As&nbsp;Long<br> <br>   引用的语法是:Call&nbsp;CDdoor("set&nbsp;CDAudio&nbsp;door&nbsp;closed",&nbsp;0,&nbsp;0,&nbsp;0)  用以关闭光驱门&nbsp;         Call&nbsp;CDdoor("set&nbsp;CDAudio&nbsp;door&nbsp;open",&nbsp;0,&nbsp;0,&nbsp;0)   用以打开光驱门<br> &nbsp;<br> <br>   程序中使用了一个布尔型变量来标示当前光驱门开与关的状态。<br> <br>   如果配合检测光驱是否存在的函数一起使用,此程序的通用性会更高。而关于检测驱动器信息的函数请参看&nbsp;GetDriveType,GetLogicalDrives的用法。</内容> 
  </数据>
- <数据>
  <名称>如何映射/中断网络磁盘</名称> 
  <类别>网络</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-05&nbsp;23:13:34</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>映射</关键字1> 
  <关键字2>网络磁盘</关键字2> 
  <关键字3>中断</关键字3> 
  <内容简介 /> 
  <内容>下面的程序段可以模拟【网上邻居】及【我的电脑】中的【映射&nbsp;/&nbsp;中断网络磁盘】,就是出现【映射&nbsp;/&nbsp;中断网络磁盘】的问话框,让使用者根据自己电脑的情形,来决定要连接的网络磁盘要映射到自己的那一个磁盘?要中断的又是那一个对应的磁盘?<br> <br>   请在声明区中加入以下声明及模组:<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;WNetConnectionDialog&nbsp;Lib&nbsp;"mpr.dll"&nbsp;_<br> (ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwType&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Private&nbsp;Declare&nbsp;Function&nbsp;WNetDisconnectDialog&nbsp;Lib&nbsp;"mpr.dll"&nbsp;_<br> (ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwType&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Sub&nbsp;ShowMapDrives(hwnd&nbsp;As&nbsp;Long)<br>  WNetConnectionDialog&nbsp;hwnd,&nbsp;1<br> End&nbsp;Sub<br> <br> Sub&nbsp;ShowUnMapDrives(hwnd&nbsp;As&nbsp;Long)<br>  WNetDisconnectDialog&nbsp;hwnd,&nbsp;1<br> End&nbsp;Sub<br> <br> '程序中使用方式如下:<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br>  '出现&nbsp;映射网络磁盘&nbsp;问话框<br>  ShowMapDrives&nbsp;Me.hwnd&nbsp;<br> End&nbsp;Sub<br> <br> <br> Private&nbsp;Sub&nbsp;Command2_Click()<br>  '出现&nbsp;中断网络磁盘&nbsp;问话框<br>  ShowUnMapDrives&nbsp;Me.hwnd&nbsp;<br> End&nbsp;Sub</内容> 
  </数据>
- <数据>
  <名称>制作垂直标题栏的窗体上</名称> 
  <类别>窗体</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-10&nbsp;16:12:52</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>垂直</关键字1> 
  <关键字2>窗体</关键字2> 
  <关键字3>标题栏</关键字3> 
  <内容简介 /> 
  <内容>源代码如下:<br> <br> <br> Module1<br> <br> Option&nbsp;Explicit&nbsp;<br> Public&nbsp;Const&nbsp;GWL_WNDPROC&nbsp;=&nbsp;(-4)<br> <br> Public&nbsp;Const&nbsp;WM_LBUTTONDOWN&nbsp;=&nbsp;&H201<br> Public&nbsp;Const&nbsp;WM_NCHITTEST&nbsp;=&nbsp;&H84<br> Public&nbsp;Const&nbsp;WM_NCLBUTTONDOWN&nbsp;=&nbsp;&HA1<br> Public&nbsp;Const&nbsp;HTCLIENT&nbsp;=&nbsp;1<br> Public&nbsp;Const&nbsp;HTCAPTION&nbsp;=&nbsp;2<br> <br> Public&nbsp;Const&nbsp;LF_FACESIZE&nbsp;=&nbsp;32<br> Public&nbsp;Const&nbsp;DEFAULT_CHARSET&nbsp;=&nbsp;1<br> Public&nbsp;Const&nbsp;DT_CALCRECT&nbsp;=&nbsp;&H400<br> <br> Type&nbsp;LOGFONT<br> lfHeight&nbsp;As&nbsp;Long<br> lfWidth&nbsp;As&nbsp;Long<br> lfEscapement&nbsp;As&nbsp;Long<br> lfOrientation&nbsp;As&nbsp;Long<br> lfWeight&nbsp;As&nbsp;Long<br> lfItalic&nbsp;As&nbsp;Byte<br> lfUnderline&nbsp;As&nbsp;Byte<br> lfStrikeOut&nbsp;As&nbsp;Byte<br> lfCharSet&nbsp;As&nbsp;Byte<br> lfOutPrecision&nbsp;As&nbsp;Byte<br> lfClipPrecision&nbsp;As&nbsp;Byte<br> lfQuality&nbsp;As&nbsp;Byte<br> lfPitchAndFamily&nbsp;As&nbsp;Byte<br> lfFaceName(0&nbsp;To&nbsp;LF_FACESIZE&nbsp;-&nbsp;1)&nbsp;As&nbsp;Byte<br> End&nbsp;Type<br> <br> Declare&nbsp;Function&nbsp;SelectObject&nbsp;Lib&nbsp;"gdi32"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hObject&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;DeleteObject&nbsp;Lib&nbsp;"gdi32"&nbsp;(ByVal&nbsp;hObject&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;CreateFontIndirect&nbsp;Lib&nbsp;"gdi32"&nbsp;Alias&nbsp;"CreateFontIndirectA"&nbsp;(lpLogFont&nbsp;As&nbsp;LOGFONT)&nbsp;As&nbsp;Long<br> Declare&nbsp;Sub&nbsp;RtlMoveMemory&nbsp;Lib&nbsp;"KERNEL32"&nbsp;(lpvDest&nbsp;As&nbsp;Any,&nbsp;lpvSource&nbsp;As&nbsp;Any,&nbsp;ByVal&nbsp;cbCopy&nbsp;As&nbsp;Long)<br> Declare&nbsp;Function&nbsp;DrawText&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"DrawTextA"&nbsp;(ByVal&nbsp;hDC&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpStr&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;nCount&nbsp;As&nbsp;Long,&nbsp;lpRect&nbsp;As&nbsp;RECT,&nbsp;ByVal&nbsp;wFormat&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Type&nbsp;RECT<br> Left&nbsp;As&nbsp;Long<br> Top&nbsp;As&nbsp;Long<br> Right&nbsp;As&nbsp;Long<br> Bottom&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> <br> Declare&nbsp;Function&nbsp;GetWindowRect&nbsp;Lib&nbsp;"user32"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;lpRect&nbsp;As&nbsp;RECT)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;GetClientRect&nbsp;Lib&nbsp;"user32"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;lpRect&nbsp;As&nbsp;RECT)&nbsp;As&nbsp;Long<br> <br> Declare&nbsp;Function&nbsp;CallWindowProc&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"CallWindowProcA"&nbsp;(ByVal&nbsp;lpPrevWndFunc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Msg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;GetWindowLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"GetWindowLongA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nIndex&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;SetWindowLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SetWindowLongA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nIndex&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwNewLong&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;prevWndProc&nbsp;As&nbsp;Long<br> <br> Function&nbsp;WndProc(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Msg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> If&nbsp;Msg&nbsp;=&nbsp;WM_LBUTTONDOWN&nbsp;Then<br> SendMessage&nbsp;Form1.hwnd,&nbsp;WM_NCLBUTTONDOWN,&nbsp;HTCAPTION,&nbsp;ByVal&nbsp;0&<br> Else<br> WndProc&nbsp;=&nbsp;CallWindowProc(prevWndProc,&nbsp;hwnd,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam)<br> End&nbsp;If<br> End&nbsp;Function</内容> 
  </数据>
- <数据>
  <名称>实现隐藏和显示桌面图标</名称> 
  <类别>VBAPI</类别> 
  <数据来源>NULL</数据来源> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-05&nbsp;22:30:34</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>隐藏和显示</关键字2> 
  <关键字3>桌面图标</关键字3> 
  <内容简介>NULL</内容简介> 
  <内容>源代码如下:&nbsp;<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;FindWindow&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"FindWindowA"&nbsp;(ByVal&nbsp;lpClassName&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;lpWindowName&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long<br> Private&nbsp;Declare&nbsp;Function&nbsp;ShowWindow&nbsp;Lib&nbsp;"user32"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nCmdShow&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Private&nbsp;Const&nbsp;SW_HIDE&nbsp;=&nbsp;0<br> Private&nbsp;Const&nbsp;SW_RESTORE&nbsp;=&nbsp;9&nbsp;&nbsp;<br> <br> 隐藏桌面图标<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> Dim&nbsp;Hwd&nbsp;As&nbsp;Long<br> Dim&nbsp;rtn&nbsp;As&nbsp;Long<br> Hwd&nbsp;=&nbsp;FindWindow("Progman",&nbsp;vbNullString)<br> rtn&nbsp;=&nbsp;ShowWindow(Hwd,&nbsp;SW_HIDE)<br> End&nbsp;Sub&nbsp;<br> <br> 显示桌面图标<br> <br> <br> <br> Private&nbsp;Sub&nbsp;Command2_Click()<br> Dim&nbsp;Hwd&nbsp;As&nbsp;Long<br> Dim&nbsp;rtn&nbsp;As&nbsp;Long<br> Hwd&nbsp;=&nbsp;FindWindow("Progman",&nbsp;vbNullString)<br> rtn&nbsp;=&nbsp;ShowWindow(Hwd,&nbsp;SW_RESTORE)<br> End&nbsp;Sub</内容> 
  </数据>
- <数据>
  <名称>VB托盘程序详解下</名称> 
  <类别>界面</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-05&nbsp;23:10:32</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>托盘</关键字2> 
  <关键字3 /> 
  <内容简介 /> 
  <内容>这样我们就取得并处理了来自托盘图标的消息,现在的问题是在鼠标右键菜单弹出后,怎么控制程序主窗体的状态,这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息,具体的代码实现如下,其中HWnd是主窗体的句柄,WM_SYSCOMMAND表示发送的是系统控制类的消息,SC_MOVE、SC_SIZE、SC_RESTORE便是要发送的消息了:<br> <br>    '托盘图标右键菜单上的“移动”项被点击时<br>    Private&nbsp;Sub&nbsp;mnuTrayMove_Click()&nbsp;<br>      SendMessage&nbsp;HWnd,&nbsp;WM_SYSCOMMAND,&nbsp;SC_MOVE,&nbsp;0&&nbsp;<br>    End&nbsp;Sub&nbsp;<br>    '托盘图标右键菜单上的“恢复”项被点击时&nbsp;<br>    Private&nbsp;Sub&nbsp;mnuTrayRestore_Click()&nbsp;<br>      SendMessage&nbsp;HWnd,&nbsp;WM_SYSCOMMAND,&nbsp;SC_RESTORE,&nbsp;0&&nbsp;<br>    End&nbsp;Sub&nbsp;<br>    '托盘图标右键菜单上的“退出”项被点击时&nbsp;<br>    Private&nbsp;Sub&nbsp;mnuTraySize_Click()&nbsp;<br>      SendMessage&nbsp;HWnd,&nbsp;WM_SYSCOMMAND,&nbsp;SC_SIZE,&nbsp;0&&nbsp;<br>    End&nbsp;Sub&nbsp;&nbsp;<br> <br>   最后要提醒你,在程序退出时一定要把窗口过程的地址恢复为默认值,同时把托盘图标移去哦。</内容> 
  </数据>
- <数据>
  <名称>妙用GetSystemMetrics函数</名称> 
  <类别>VBAPI</类别> 
  <数据来源>yesky</数据来源> 
  <来源时间>2001-11-24&nbsp;22:09:12</来源时间> 
  <保存时间>2002-01-05&nbsp;22:15:17</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>函数</关键字2> 
  <关键字3>NULL</关键字3> 
  <内容简介>NULL</内容简介> 
  <内容>在Windows9x编程过程中,我们经常需要了解当前系统的运行状态。例如,如果Win9x运行于安全模式,那么多媒体等部件可能无法正确运行。程序中有必要对此做相应处理,以提高程序安全性,增强系统的适应能力。VB中没有直接提供此类控制或函数,但是我们可以通过API函数GetSystemMetrics轻松地实现对Win运行模式的判断。<br> <br>   GetSystemMetrics函数原型如下:<br> &nbsp;&nbsp;<br> <br> <br> <br>   Public&nbsp;Declare&nbsp;Function&nbsp;GetSystemMetrics&nbsp;Lib&nbsp;“user32”&nbsp;(ByVal&nbsp;nIndex&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br>   其中nIndex的不同取值可以使该函数实现不同的功能。例如返回Win桌面中各种显示单元的宽度和高度、是否安装了鼠标、是否调换了鼠标左右键的定义等。<br> <br>   当nIndex&nbsp;=&nbsp;67(SM_CLEANBOOT)时,该函数的返回值表示Windows9x的当前运行模式。<br> <br>   在以下的示例中我们可以看到GetSystemMetrics函数的用法和作用。首先在BAS模块文件中做如下说明:<br> <br>   Option&nbsp;Explicit<br>   Public&nbsp;Const&nbsp;SM_CLEANBOOT&nbsp;=&nbsp;67<br>   Public&nbsp;Declare&nbsp;Function&nbsp;GetSystemMetrics&nbsp;Lib&nbsp;“user32”&nbsp;(ByVal&nbsp;nIndex&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> <br>   在窗体中添加标签Label1和命令按钮Command1,设置如下代码:<br> <br>   Private&nbsp;Sub&nbsp;Command1_Click()<br>   &nbsp;Select&nbsp;Case&nbsp;GetSystemMetrics(SM_CLEANBOOT)&nbsp;<br> <br>   &nbsp;Case&nbsp;0:Label1=“系统运行于正常模式”<br>   &nbsp;Case&nbsp;1:Label1=“系统运行于安全模式”<br>   &nbsp;Case&nbsp;2:Label1=“系统运行于网络环境下的安全模式”<br>   &nbsp;End&nbsp;Select<br>   End&nbsp;Sub</内容> 
  </数据>
- <数据>
  <名称>利用API和注册表获取系统信息上</名称> 
  <类别>DelphiAPI</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-08&nbsp;12:01:30</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>注册表</关键字2> 
  <关键字3>系统信息</关键字3> 
  <内容简介 /> 
  <内容>在开发应用程序时,增加一项显示计算机系统信息的功能,例如已安装的软盘、硬盘、光驱、网络驱动器,硬盘的容量和剩余空间,显示器分辨率、键盘类型、鼠标的键数,内存大小、CPU类型,Windows的版本号、产品标识、注册用户单位名和用户名、当前操作用户名等(见运行图示),当然还有更多的信息,这样会使你的程序更友好。其实,有很多应用程序就是这样做的。<br> <br>   通过调用Windows的API函数和访问Windows注册表,可以获取大量的系统信息。Delphi为绝大多数WindowsAPI函数提供了调用接口(可参见DELPHI3\SOURCE\RTL\WIN\windows.pas文件),并提供了一个功能全面的TRegistry类,使我们可以方便的调用WindowsAPI函数和访问注册表,例如:<br> <br>   1、function&nbsp;GetDriveType(lpRootPathName:&nbsp;PChar):&nbsp;UINT;返回指定驱动器的类型。<br> <br>   2、function&nbsp;GetDiskFreeSpace(lpRootPathName:&nbsp;PChar;&nbsp;var&nbsp;lpSectorsPerCluster,&nbsp;lpBytesPerSector,&nbsp;lpNumberOfFreeClusters,&nbsp;lpTotalNumberOfClusters:&nbsp;DWORD):&nbsp;BOOL;返回指定驱动器的总簇数、剩余簇数及每簇扇区数、每扇区字节数,从而可以计算出总容量和剩余空间。<br> <br>   3、function&nbsp;GetSystemMetrics(SM_CXSCREEN或&nbsp;SM_CYSCREEN):&nbsp;Integer;返回显示器分辨率。<br> <br>   4、function&nbsp;GetSystemMetrics(SM_CMOUSEBUTTONS):&nbsp;Integer;返回鼠标的按键数目。<br> <br>   5、&nbsp;在windows&nbsp;注&nbsp;册&nbsp;表&nbsp;的HKEY_LOCAL_MACHINE\&nbsp;software\microsoft\windows\currentversion&nbsp;\RegisteredOwner主键下存放着Windows安装时输入的用户名,可用以下语句读取。&nbsp;<br> <br> myreg:=Tregistry.Create;&nbsp;<br> file://必须在程序单元的uses部分加入Registry<br> myreg.RootKey:=HKEY_LOCAL_MACHINE;<br> if&nbsp;myreg.openkey('software\microsoft&nbsp;\windows\currentversion',false)&nbsp;then<br>  memo1.lines.add('&nbsp;注册用户名:&nbsp;'+myreg.readstring('RegisteredOwner'));<br>  myreg.closekey;&nbsp;<br> <br>   以上仅举几例,获取其他一些信息的方法与此类似,详见源程序。<br> <br>   本程序在Pwin95、Delphi3下调试通过。<br> <br>   附:源程序清单。<br> <br> unit&nbsp;Unit1;<br> interface<br> uses&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,&nbsp;Dialogs,&nbsp;StdCtrls,Registry;<br> <br> type<br> TForm1&nbsp;=&nbsp;class(TForm)<br> Button1:&nbsp;TButton;<br> Memo1:&nbsp;TMemo;<br> procedure&nbsp;Button1Click(Sender:&nbsp;TObject);<br> private<br> {&nbsp;Private&nbsp;declarations&nbsp;}<br> public<br> {&nbsp;Public&nbsp;declarations&nbsp;}<br> end;<br> <br> var<br> Form1:&nbsp;TForm1;<br> <br> implementation<br> {$R&nbsp;*.DFM}</内容> 
  </数据>
- <数据>
  <名称>利用API和注册表获取系统信息中</名称> 
  <类别>DelphiAPI</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-08&nbsp;12:01:39</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>注册表</关键字2> 
  <关键字3>系统信息</关键字3> 
  <内容简介 /> 
  <内容>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br> var&nbsp;<br> i,x,y:integer;<br> ch:char;&nbsp;file://驱动器字符'A'~'Z'<br> buffer:string;<br> cpuinfo:TSYSTEMINFO;&nbsp;file://存放系统信息的记录类型,在Windows.pas中查到详细内容。<br> meminfo:TMemoryStatus;&nbsp;file://存放系统内存信息的记录类型。<br> computername,username:pchar;&nbsp;file://计算机名称、用户名<br> spc,bps,nofc,tnoc:longint;&nbsp;file://用于存放磁盘容量的变量<br> myreg:Tregistry;&nbsp;file://用于访问注册表的TRegistry变量<br> begin<br> memo1.Lines.Clear;<br> <br> for&nbsp;ch:='A'&nbsp;to&nbsp;'Z'&nbsp;do&nbsp;begin<br> i:=getdrivetype(pchar(ch+':\'));<br> buffer:='&nbsp;'+ch+':&nbsp;';<br> case&nbsp;i&nbsp;of<br> DRIVE_UNKNOWN&nbsp;:&nbsp;buffer:=buffer+'未知类型';<br> DRIVE_REMOVABLE:&nbsp;buffer:=buffer+'软盘';<br> DRIVE_FIXED&nbsp;:&nbsp;begin<br> buffer:=buffer+'硬盘';<br> if&nbsp;getdiskfreespace(pchar(ch+':\'),spc,bps,nofc,tnoc)&nbsp;then&nbsp;<br> begin<br> buffer:=buffer+'总容量:&nbsp;'+inttostr((spc*bps*tnoc)&nbsp;div&nbsp;(1024*1024))+'MB';<br> buffer:=buffer+'剩余:&nbsp;'+inttostr((spc*bps*nofc)&nbsp;div&nbsp;(1024*1024))+'MB';<br> end;<br> end;<br> DRIVE_REMOTE&nbsp;:&nbsp;buffer:=buffer+'网络驱动器';<br> DRIVE_CDROM&nbsp;:buffer:=buffer+'CD-ROM驱动器';<br> DRIVE_RAMDISK:buffer:=buffer+'RAM虚拟驱动器';<br> end;<br> if&nbsp;(ch&nbsp;>'D')&nbsp;and&nbsp;(i=1)&nbsp;then&nbsp;break;<br> if&nbsp;i<&nbsp;>1&nbsp;then&nbsp;memo1.Lines.Add(buffer);<br> end;<br> <br> case&nbsp;getkeyboardtype(0)&nbsp;of&nbsp;file://获取键盘类型<br> 1:&nbsp;buffer:='&nbsp;键盘:&nbsp;IBM&nbsp;PC/XT或兼容类型(83键)';<br> 2:&nbsp;buffer:='&nbsp;键盘:&nbsp;Olivetti&nbsp;"ICO"(102键)';<br> 3:&nbsp;buffer:='&nbsp;键盘:&nbsp;IBM&nbsp;PC/AT(84键)';<br> 4:&nbsp;buffer:='&nbsp;键盘:&nbsp;IBM增强型(101或102键)';<br> 5:&nbsp;buffer:='&nbsp;键盘:&nbsp;Nokia&nbsp;1050';<br> 6:&nbsp;buffer:='&nbsp;键盘:&nbsp;Nokia&nbsp;9140';<br> 7:&nbsp;buffer:='&nbsp;键盘:&nbsp;Japanese';<br> end;<br> memo1.lines.add(buffer);<br> <br> file://获取键盘功能键数目<br> memo1.lines.add('&nbsp;功能键数目:&nbsp;'+inttostr(getkeyboardtype(2)));<br> <br> memo1.Lines.add('显示器分辨率:&nbsp;'+inttostr(getsystemmetrics(SM_CXSCREEN))&nbsp;+'x'+<br> inttostr(getsystemmetrics(SM_CYSCREEN)));<br> file://获取鼠标按键数目<br> memo1.Lines.add('&nbsp;鼠标:&nbsp;'+inttostr(getsystemmetrics(SM_CMOUSEBUTTONS))+'键');<br> <br> globalmemorystatus(meminfo);&nbsp;file://获取系统内存数量<br> memo1.lines.add('&nbsp;物理内存:&nbsp;'+inttostr(meminfo.dwTotalPhys&nbsp;div&nbsp;1024)+'&nbsp;KB');<br> <br> i:=getsystemmetrics(SM_CLEANBOOT);<br> case&nbsp;i&nbsp;of<br> 0:buffer:='系统启动模式:正常模式';<br> 1:buffer:='系统启动模式:保护模式';<br> 2:buffer:='系统启动模式:网络保护模式';<br> end;<br> memo1.lines.add(buffer);<br> <br></内容> 
  </数据>
- <数据>
  <名称>利用API和注册表获取系统信息下</名称> 
  <类别>DelphiAPI</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-08&nbsp;12:01:46</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>注册表</关键字2> 
  <关键字3>系统信息</关键字3> 
  <内容简介 /> 
  <内容>x:=getsystemmetrics(SM_ARRANGE);&nbsp;<br> file://获取系统最小化窗口的起始位置和排列方式<br> y:=x;<br> x:=x&nbsp;and&nbsp;3;<br> y:=y&nbsp;and&nbsp;12;<br> case&nbsp;x&nbsp;of<br> ARW_BOTTOMLEFT&nbsp;:&nbsp;buffer:='&nbsp;最小化窗口:自左下角';<br> ARW_BOTTOMRIGHT&nbsp;:&nbsp;buffer:='&nbsp;最小化窗口:自右下角';<br> ARW_TOPLEFT&nbsp;:&nbsp;buffer:='&nbsp;最小化窗口:自左上角';<br> ARW_TOPRIGHT&nbsp;:&nbsp;buffer:='&nbsp;最小化窗口:自右上角';<br> end;<br> case&nbsp;y&nbsp;of<br> ARW_LEFT&nbsp;:&nbsp;buffer:=buffer+'横向排列';<br> ARW_UP&nbsp;:&nbsp;buffer:=buffer+'纵向排列';<br> ARW_HIDE&nbsp;:&nbsp;buffer:=buffer+'隐藏';<br> end;<br> memo1.lines.add(buffer);<br> <br> getmem(computername,255);&nbsp;file://获取计算机名称和用户名<br> getmem(username,255);<br> i:=255;<br> getcomputername(computername,i);<br> memo1.lines.add('&nbsp;计算机名称:&nbsp;'+computername);<br> getusername(username,i);<br> memo1.lines.add('&nbsp;用户名:&nbsp;'+username);<br> freemem(computername);<br> freemem(username);<br> <br> getsysteminfo(cpuinfo);&nbsp;file://获取CPU类型<br> case&nbsp;cpuinfo.dwProcessorType&nbsp;of<br> 386&nbsp;:&nbsp;buffer:='&nbsp;CPU类型:&nbsp;386';<br> 486&nbsp;:&nbsp;buffer:='&nbsp;CPU类型:&nbsp;486';<br> 586&nbsp;:&nbsp;buffer:='&nbsp;CPU类型:&nbsp;Pentium';<br> end;<br> memo1.Lines.add(buffer);<br> <br> file://从注册表中获取CPU标识,Windows版本,<br> 产品标识,注册单位名称及用户名<br> myreg:=Tregistry.Create;<br> myreg.RootKey:=HKEY_LOCAL_MACHINE;<br> if&nbsp;myreg.OpenKey('hardware\descriptionsystem\centralprocessor\0',false)&nbsp;then<br> memo1.lines.add('&nbsp;CPU标识:<br> '+myreg.ReadString('VendorIdentifier'));<br> myreg.closekey;<br> if&nbsp;myreg.openkey('software\microsoft\&nbsp;windows\currentversion',false)&nbsp;then&nbsp;<br> begin<br> memo1.lines.add('&nbsp;windows版本:&nbsp;'+myreg.ReadString('Version'));<br> memo1.lines.add('&nbsp;版本号:&nbsp;'+myreg.ReadString('VersionNumber')+'&nbsp;'+myreg.ReadString('Subversionnumber'));<br> memo1.lines.add('&nbsp;产品标识:&nbsp;'+myreg.Readstring('ProductID'));<br> memo1.lines.add('注册单位名称:&nbsp;'+myreg.readstring('RegisteredOrganization'));<br> memo1.lines.add('&nbsp;注册用户名:&nbsp;'+myreg.readstring('RegisteredOwner'));<br> end;<br> myreg.CloseKey;<br> myreg.Free;<br> end;<br> end</内容> 
  </数据>
- <数据>
  <名称>百叶窗图形特效</名称> 
  <类别>动画</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-05&nbsp;23:09:56</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>图形特效</关键字2> 
  <关键字3>百叶窗</关键字3> 
  <内容简介 /> 
  <内容>在Powerpoint这样的软件中,各种各样的图形特效层出不穷,其中“百叶窗”的切换效果尤为新颖奇特。在VB中实现这样的图形特效十分简单方便。其方法是调用WINDOWS的API函数Bitblt。BitBlt函数就类似于C语言中的getimage、putimage两个函数的组合运用。BitBlt原意是“Bit&nbsp;Block&nbsp;Transfer”,其主要用途是位图的复制。用BitBlt函数显示图形特效,其原理十分简单,制作时先在表单中绘制两个图片框,将图片存入一个图片框,同时将另一个图片框设为空,然后调用BitBlt函数将第一个图片框中的图形一部分一部分地复制到第二个图片框中,这样就可以实现千奇百怪的图形特效。其步骤如下:<br> <br>   在VB环境中新建一个窗体,绘制两个图片框picSour和picDest,两个命令按钮cmdShow和cmdExit。首先在窗体的通用过程中声明BitBlt函数即所需要的常量名,在载入窗体同时在picSour中载入图片,在按钮cmdShow的事件中调用BitBlt函数。程序如下:<br> API函数声明:<br> <br> Declare&nbsp;Function&nbsp;BitBlt&nbsp;Lib″GDI″(ByVal&nbsp;hDestDC&nbsp;As&nbsp;Integer,ByVal&nbsp;X&nbsp;As&nbsp;Integer,ByVal&nbsp;Y&nbsp;As&nbsp;Integer,ByVal&nbsp;nWidth&nbsp;AS&nbsp;Integer,ByVal&nbsp;nHeight&nbsp;As&nbsp;Integer,ByVal&nbsp;hSrcDC&nbsp;As&nbsp;Integer,ByVal&nbsp;xSrc&nbsp;As&nbsp;Integer,ByVal&nbsp;ySrc&nbsp;As&nbsp;Integer,ByVal&nbsp;dwRop&nbsp;As&nbsp;Long)As&nbsp;Integer&nbsp;<br> <br>   Const&nbsp;COPY-PUT=&HCC0020′BitBlt的15种算法之一,表示直接拷贝<br>   载入图片:<br> <br> Sub&nbsp;Form-Load()<br> picsour.Picture=LoadPicture(″c:\windows\LEAVES.bmp″)<br> picsour.ScaleMode=3′以象素为单位<br> End&nbsp;Sub&nbsp;<br> <br> 显示“百叶窗”的切换效果:<br> <br> Sub&nbsp;Comshow-Click()<br> H%=picsour.ScaleHeight<br> W%=picsour.ScaleWidth<br> scanlines=4<br> For&nbsp;i=0&nbsp;To(scanlines-1)<br> For&nbsp;j=i&nbsp;To&nbsp;H%&nbsp;Step&nbsp;scanlines<br> s%=BitBlt%(picdest.hDC,0,j,W%,1,picsour.hDC,0,j,copy-Put)<br> delay&nbsp;500′延时<br> Next&nbsp;j<br> Next&nbsp;i<br> End&nbsp;Sub&nbsp;<br> <br>   其中delay是一个通用子过程,用于延时,以便于能看清楚切换效果。代码如下:&nbsp;<br> <br> Sub&nbsp;delay(delaytime&nbsp;As&nbsp;Integer)<br> For&nbsp;i=1&nbsp;To&nbsp;delaytime<br> Next&nbsp;i<br> End&nbsp;Sub&nbsp;<br> <br>   通过这样简单的程序就可以实现“百叶窗”的切换特效,其实,只要有合适的算法,运用BitBlt函数能够实现的图形特效是无穷的。有兴趣的读者可以查阅有关VB的参考书。</内容> 
  </数据>
- <数据>
  <名称>实现平面工具栏下</名称> 
  <类别>控件特效</类别> 
  <数据来源 /> 
  <来源时间>NULL</来源时间> 
  <保存时间>2002-01-08&nbsp;18:13:17</保存时间> 
  <删除>False</删除> 
  <删除时间>NULL</删除时间> 
  <关键字1>API</关键字1> 
  <关键字2>工具栏</关键字2> 
  <关键字3>平面</关键字3> 
  <内容简介 /> 
  <内容>【参数表】<br> hWnd1&nbsp;----------&nbsp;Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找)&nbsp;<br> <br> hWnd2&nbsp;----------&nbsp;Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索&nbsp;<br> <br> lpsz1&nbsp;----------&nbsp;String,欲搜索的类名。零表示忽略&nbsp;<br> <br> lpsz2&nbsp;----------&nbsp;String,欲搜索的类名。零表示忽略&nbsp;<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;FindWindowEx&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"FindWindowExA"&nbsp;_<br> (ByVal&nbsp;hWnd1&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;hWnd2&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;lpsz1&nbsp;As&nbsp;String,&nbsp;_<br> ByVal&nbsp;lpsz2&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long&nbsp;<br> <br> <br> 【VB声明】&nbsp;<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long&nbsp;&nbsp;<br> <br> 【说明】<br> 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum,<br> SendMessageByString是该函数的“类型安全”声明形式&nbsp;<br> <br> 【返回值】<br> Long,由具体的消息决定&nbsp;<br> <br> 【参数表】<br> hwnd&nbsp;-----------&nbsp;Long,要接收消息的那个窗口的句柄&nbsp;<br> <br> wMsg&nbsp;-----------&nbsp;Long,消息的标识符&nbsp;<br> <br> wParam&nbsp;---------&nbsp;Long,具体取决于消息&nbsp;<br> <br> lParam&nbsp;---------&nbsp;Any,具体取决于消息&nbsp;<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;_<br> "SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wParam&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long&nbsp;<br> 设置工具栏为新的样式&nbsp;<br> <br> Private&nbsp;Sub&nbsp;SetToolbar(tBar&nbsp;As&nbsp;Toolbar)<br> Dim&nbsp;lngResult&nbsp;As&nbsp;Long<br> Dim&nbsp;lngHWND&nbsp;As&nbsp;Long<br> Dim&nbsp;lngStyle&nbsp;As&nbsp;Long&nbsp;&nbsp;<br> <br> 得到Toolbar的句柄&nbsp;<br> <br> lngHWND&nbsp;=&nbsp;FindWindowEx(tBar.hwnd,&nbsp;0&,&nbsp;"ToolbarWindow32",&nbsp;vbNullString)&nbsp;<br> <br> 得到原有的Toolbar的样式<br> <br> lngStyle&nbsp;=&nbsp;SendMessage(lngHWND,&nbsp;TB_GETSTYLE,&nbsp;0&,&nbsp;0&)&nbsp;&nbsp;<br> <br> 设置一个图形在上、文字在下的平面工具栏&nbsp;<br> <br> lngStyle&nbsp;=&nbsp;lngStyle&nbsp;Or&nbsp;TBSTYLE_FLAT&nbsp;&nbsp;<br> <br> 用API函数实现工具栏的新样式&nbsp;<br> <br> lngResult&nbsp;=&nbsp;SendMessage(lngHWND,&nbsp;TB_SETSTYLE,&nbsp;0,&nbsp;lngStyle)&nbsp;&nbsp;<br> <br> 刷新工具栏&nbsp;<br> <br> tBar.Refresh<br> End&nbsp;Sub&nbsp;<br> <br> Private&nbsp;Sub&nbsp;exitfile_Click()<br> Unload&nbsp;Me<br> End&nbsp;Sub&nbsp;<br> <br> Private&nbsp;Sub&nbsp;Form_Load()&nbsp;&nbsp;<br> <br> 调用函数改变工具栏&nbsp;<br> <br> Call&nbsp;SetToolbar(Me.Toolbar1)&nbsp;<br> <br> End&nbsp;Sub</内容> 
  </数据>

解决方案 »

  1.   


    总共是6xx kb可惜没有办法写了
      

  2.   

    我帮你U P 一下,你就可以接着发了,要不发到我信箱里[email protected]
      

  3.   

    好像是用记事本打开了一个PowerPoint文件吧!
      

  4.   

      继续贴:<数据>
      <名称>模拟Windows的资源回收站</名称> 
      <类别>系统</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:17:23</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>回收站</关键字1> 
      <关键字2>Win系统</关键字2> 
      <关键字3>模拟</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>您现在将屏幕上所有的视窗全部缩小,找到资源回收站,按鼠标右键,选择【属性】,便会出现【资源回收站】的属性问话框。<br> <br> <br> 其中有几个选项如下:<br> <br> 1、不要将文件移到资源回收站,删除时立即移除文件。<br> 2、显示删除确认对话框?<br> <br> 根据以上之状况,文件之删除有三种情形:<br> <br> 1、删除文件,出现确认对话框,文件移到资源回收站。<br> 2、删除文件,出现确认对话框,文件不移到资源回收站。<br> 3、删除文件,不出现确认对话框,文件也不移到资源回收站。<br> <br> 模拟程序如下:<br> <br> ′在模组的声明区中加入以下声明:<br> <br> Public&nbsp;Type&nbsp;SHFILEOPSTRUCT<br> hwnd&nbsp;As&nbsp;Long<br> wFunc&nbsp;As&nbsp;Long<br> pFrom&nbsp;As&nbsp;String<br> pTo&nbsp;As&nbsp;String<br> fFlags&nbsp;As&nbsp;Integer<br> fAnyOperationsAborted&nbsp;As&nbsp;Long<br> hNameMappings&nbsp;As&nbsp;Long<br> lpszProgressTitle&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> <br> Public&nbsp;Declare&nbsp;Function&nbsp;SHFileOperation&nbsp;Lib&nbsp;"shell32.dll"&nbsp;Alias&nbsp;_<br> "SHFileOperationA"&nbsp;(lpFileOp&nbsp;As&nbsp;SHFILEOPSTRUCT)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Const&nbsp;FO_DELETE&nbsp;=&nbsp;&H3<br> Public&nbsp;Const&nbsp;FOF_ALLOWUNDO&nbsp;=&nbsp;&H40&nbsp;′可以还原<br> Public&nbsp;Const&nbsp;FOF_NOCONFIRMATION&nbsp;=&nbsp;&H10&nbsp;′不出现确认对话框<br> Public&nbsp;Const&nbsp;FOF_SILENT&nbsp;=&nbsp;&H4<br> <br> ′在程序中之使用方法如下:&nbsp;<br> ′以下之例子会出现确认对话框,文件也会移到资源回收站。<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> Dim&nbsp;SHop&nbsp;As&nbsp;SHFILEOPSTRUCT<br> Dim&nbsp;strFile&nbsp;As&nbsp;String&nbsp;′要删除的文件(含全路径)<br> strFile&nbsp;=&nbsp;"c:\test.txt"<br> <br> With&nbsp;SHop<br> .wFunc&nbsp;=&nbsp;FO_DELETE<br> .pFrom&nbsp;=&nbsp;strFile<br> .fFlags&nbsp;=&nbsp;FOF_ALLOWUNDO<br> End&nbsp;With<br> <br> SHFileOperation&nbsp;SHop<br> End&nbsp;Sub<br> <br> ′若要调整,只要更改&nbsp;fFlags&nbsp;之值即可,如下:<br> .fFlags&nbsp;=&nbsp;FOF_SILENT&nbsp;′删除文件,出现确认对话框,文件不移到资源回收站。<br> .fFlags&nbsp;=&nbsp;FOF_NOCONFIRMATION&nbsp;′删除文件,不出现确认对话框,文件也不移到资源回收站。</内容> 
      </数据>
    - <数据>
      <名称>四角形以外其他形状的Form</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:18:39</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>Form</关键字1> 
      <关键字2>形状</关键字2> 
      <关键字3>四角形</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>这个问题,您一定无法想像有多容易,您可以产生任何形状的&nbsp;Form,但必须借助&nbsp;CreateEllipticRgn&nbsp;及&nbsp;SetWindowRgn&nbsp;二个&nbsp;API&nbsp;,例如:&nbsp;<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;CreateEllipticRgn&nbsp;Lib&nbsp;"gdi32"&nbsp;(ByVal&nbsp;X1&nbsp;As&nbsp;_<br> Long,&nbsp;ByVal&nbsp;Y1&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;X2&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Y2&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SetWindowRgn&nbsp;Lib&nbsp;"user32"&nbsp;(ByVal&nbsp;hWnd&nbsp;_<br> As&nbsp;Long,&nbsp;ByVal&nbsp;hRgn&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;bRedraw&nbsp;As&nbsp;Boolean)&nbsp;As&nbsp;Long<br> <br> Private&nbsp;Sub&nbsp;Form_Load()<br> Dim&nbsp;lReturn&nbsp;As&nbsp;Long<br> Me.Show<br> lReturn&nbsp;=&nbsp;SetWindowRgn(hWnd,&nbsp;CreateEllipticRgn(10,&nbsp;10,&nbsp;340,&nbsp;150),&nbsp;True)<br> End&nbsp;Sub<br> <br> 执行结果图片<br> <br> CreateEllipticRgn&nbsp;之四个参数说明如下:<br> X1:椭圆中心点之X轴位置,但以&nbsp;Form&nbsp;的实№边界为限。<br> Y1:椭圆中心点之Y轴位置,但以&nbsp;Form&nbsp;的实№边界为限。<br> X2:椭圆长边的长度<br> Y2:椭圆短边的长度的<br> <br> 25、如何让一个&nbsp;Form&nbsp;出现在另一个非&nbsp;MDIForm&nbsp;的&nbsp;Form&nbsp;中?<br> <br> 假设要将&nbsp;Form2&nbsp;放在&nbsp;Form1&nbsp;中,请在宣告区中宣告:&nbsp;<br> <br> Declare&nbsp;Function&nbsp;SetParent&nbsp;Lib&nbsp;"user32"&nbsp;(ByVal&nbsp;hWndChild&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;hWndNewParent&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> 在&nbsp;Form2&nbsp;中的&nbsp;Form_Load&nbsp;中加入&nbsp;SetParent(Me.hWnd,&nbsp;Form1.hWnd)&nbsp;即可。<br> <br> 但有一点要注意的是,在&nbsp;Unload&nbsp;Form1&nbsp;之前一定要先&nbsp;Unload&nbsp;Form2</内容> 
      </数据>
    - <数据>
      <名称>移除Form右上方之X按钮</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:20:25</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>Form</关键字1> 
      <关键字2>按钮</关键字2> 
      <关键字3>关闭</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>其实&nbsp;Form&nbsp;右上方之三个按钮分别对应到&nbsp;Form&nbsp;左上方控制盒&nbsp;(ControlBox)&nbsp;中的几个选项&nbsp;(缩到最小&nbsp;/&nbsp;放到最大&nbsp;/&nbsp;关闭),而其中的最大化&nbsp;(MaxButton)&nbsp;及最小化&nbsp;(Minbutton)&nbsp;都可以直接在&nbsp;Form&nbsp;的属性中设定,但是&nbsp;VB&nbsp;并没有提供设定『X』按钮的功能!要达到这个功能,必须借助&nbsp;API:&nbsp;<br> <br> 由于『X』按钮对应到&nbsp;ControlBox&nbsp;的关闭选项,所以我们只要移除系统&nbsp;Menu&nbsp;(就是ControlBox)&nbsp;的关闭选项即可!您自己可以先看看您现在使用的&nbsp;Browser&nbsp;左上方的系统&nbsp;Menu,【关闭】选项是在第几个,不是第&nbsp;6&nbsp;个!是第&nbsp;7&nbsp;个,分隔线也算一个!分隔线才是第&nbsp;6&nbsp;个!<br> <br> 当我们移除了关闭选项之後,会留下一条很奇怪的分隔线,所以最好连分隔线也一并移除。而&nbsp;Menu&nbsp;的&nbsp;Index&nbsp;是从&nbsp;0&nbsp;开始,分隔线是第&nbsp;6&nbsp;个,所以&nbsp;Index&nbsp;=&nbsp;5。<br> <br> 修正:为了让程序码在&nbsp;Windows&nbsp;NT&nbsp;也能运作正常,将各&nbsp;Integer&nbsp;型态改成&nbsp;Long。&nbsp;89.05.04<br> <br> ′抓取系统&nbsp;Menu&nbsp;的&nbsp;hwnd<br> Private&nbsp;Declare&nbsp;Function&nbsp;GetSystemMenu&nbsp;Lib&nbsp;"user32"&nbsp;_<br> Alias&nbsp;"GetSystemMenu"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;bRevert&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> ′移除系统&nbsp;Menu&nbsp;的&nbsp;API<br> Private&nbsp;Declare&nbsp;Function&nbsp;RemoveMenu&nbsp;Lib&nbsp;"user32"&nbsp;_<br> Alias&nbsp;"RemoveMenu"&nbsp;(ByVal&nbsp;hMenu&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;nPosition&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wFlags&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> ′第一个参数是系统&nbsp;Menu&nbsp;的&nbsp;hwnd<br> ′第二个参数是要移除选项的&nbsp;Index</内容> 
      </数据>
    - <数据>
      <名称>如何加长加宽ComboBox的下拉选单</名称> 
      <类别>界面</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:24:22</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>选单</关键字1> 
      <关键字2>下拉</关键字2> 
      <关键字3>加长</关键字3> 
      <内容简介 /> 
      <内容>Combo&nbsp;预设的下拉长度只有&nbsp;5,6&nbsp;个选项,当选项很多时,要卷老半天才能找到资料,很不方便!要加长&nbsp;ComboBox&nbsp;的下拉选单,方法如下:&nbsp;<br> <br> 在声明区中放入以下声明及&nbsp;Subroutine<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;MoveWindow&nbsp;Lib&nbsp;"user32"&nbsp;_<br> (ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;x&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;y&nbsp;As&nbsp;_<br> Long,&nbsp;ByVal&nbsp;nWidth&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nHeight&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;bRepaint&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Sub&nbsp;SetComboHeight(oComboBox&nbsp;As&nbsp;ComboBox,&nbsp;lNewHeight&nbsp;As&nbsp;Long)<br> Dim&nbsp;oldscalemode&nbsp;As&nbsp;Integer&nbsp;<br> ′&nbsp;This&nbsp;procedure&nbsp;does&nbsp;not&nbsp;work&nbsp;with&nbsp;frames:&nbsp;you<br> ′&nbsp;cannot&nbsp;set&nbsp;the&nbsp;ScaleMode&nbsp;to&nbsp;vbPixels,&nbsp;because<br> ′&nbsp;the&nbsp;frame&nbsp;does&nbsp;not&nbsp;have&nbsp;a&nbsp;ScaleMode&nbsp;Property.<br> ′&nbsp;To&nbsp;get&nbsp;round&nbsp;this,&nbsp;you&nbsp;could&nbsp;set&nbsp;the&nbsp;parent&nbsp;control<br> ′&nbsp;to&nbsp;be&nbsp;the&nbsp;form&nbsp;while&nbsp;you&nbsp;run&nbsp;this&nbsp;procedure.<br> If&nbsp;TypeOf&nbsp;oComboBox.Parent&nbsp;Is&nbsp;Frame&nbsp;Then&nbsp;Exit&nbsp;Sub<br> ′&nbsp;Change&nbsp;the&nbsp;ScaleMode&nbsp;on&nbsp;the&nbsp;parent&nbsp;to&nbsp;Pixels.<br> oldscalemode&nbsp;=&nbsp;oComboBox.Parent.ScaleMode<br> oComboBox.Parent.ScaleMode&nbsp;=&nbsp;vbPixels<br> ′&nbsp;Resize&nbsp;the&nbsp;combo&nbsp;box&nbsp;window.<br> MoveWindow&nbsp;oComboBox.hwnd,&nbsp;oComboBox.Left,&nbsp;_<br> oComboBox.Top,&nbsp;oComboBox.Width,&nbsp;lNewHeight,&nbsp;1<br> ′&nbsp;Replace&nbsp;the&nbsp;old&nbsp;ScaleMode<br> oComboBox.Parent.ScaleMode&nbsp;=&nbsp;oldscalemode<br> End&nbsp;Sub<br> <br> 在任何时候&nbsp;(不一定是&nbsp;Form_Load&nbsp;或&nbsp;Combo_DropDown),想要加长&nbsp;ComboBox&nbsp;的下拉选单时,只要加入以下程序即可:<br> <br> Call&nbsp;SetComboHeight(Combo1,&nbsp;270)&nbsp;′设定的单位是&nbsp;Pixels<br> 如何加宽&nbsp;ComboBox&nbsp;的下拉选单?<br> <br> 和&nbsp;ListBox&nbsp;一样,&nbsp;ComboBox&nbsp;也会有宽度不够的情形,&nbsp;Combo&nbsp;下拉之后资料看不完整,当&nbsp;Form&nbsp;上的物件不多时,还可以拉长一点,但有时候也没办法!这时候,还是得靠&nbsp;API&nbsp;了!&nbsp;<br> <br> 在声明区中放入以下声明及&nbsp;Subroutine<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;_<br> Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;_<br> lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Const&nbsp;CB_SETDROPPEDWIDTH&nbsp;=&nbsp;&H160<br> <br> Public&nbsp;Sub&nbsp;SetComboWidth(oComboBox&nbsp;As&nbsp;ComboBox,&nbsp;lWidth&nbsp;As&nbsp;Long)<br> ′&nbsp;lWidth&nbsp;是宽度,单位是&nbsp;pixels<br> SendMessage&nbsp;oComboBox.hwnd,&nbsp;CB_SETDROPPEDWIDTH,&nbsp;lWidth,&nbsp;0<br> End&nbsp;Sub<br> <br> 在任何时候&nbsp;(不一定是&nbsp;Form_Load&nbsp;或&nbsp;Combo_DropDown),想要加宽&nbsp;ComboBox&nbsp;的下拉选单时,只要加入以下程序即可&nbsp;(若设定的宽度小于&nbsp;Combo&nbsp;原来的宽度则无效):<br> <br> Call&nbsp;SetComboWidth(Combo1,&nbsp;270)&nbsp;′设定的单位是&nbsp;Pixels</内容> 
      </数据>
    - <数据>
      <名称>获得某一台网络打印机有几份等待打印的报表</名称> 
      <类别>打印</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:29:39</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>打印机</关键字1> 
      <关键字2>网络</关键字2> 
      <关键字3>报表</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>当我们要打印报表时,如果打印机是本机的打印机的话,当然马上就会将报表打印出来,反正打印机就只有您一个人在使用而已!但是如果是在一个人数很多的公司或企业时,往往就必须很多人来分享某一部打印机了,而且打印机也不一定就放在举目可及之处!<br> <br> 当您将报表丢到网络打印机之后,由于不一定看得到打印机,您必须特别到摆放打印机的地方去拿报表,这时候您最关心的,就是报表印了没有,如果还没有的话,那还有几份还没打印的报表排在您的报表之前呢?<br> <br> 下面这一段程序,可以让您知道某一台网络打印机尚有几份等待打印的报表?在您的程序丢出报表的同时,您可以告诉您的&nbsp;User,他的报表排在第几份!<br> <br> ′在&nbsp;.bas&nbsp;文件中加入以下声明及模组:<br> <br> ′Constants&nbsp;Definition<br> Public&nbsp;Const&nbsp;CCHDEVICENAME&nbsp;=&nbsp;32<br> Public&nbsp;Const&nbsp;CCHFORMNAME&nbsp;=&nbsp;32<br> Public&nbsp;Const&nbsp;PRINTER_ACCESS_ADMINISTER&nbsp;=&nbsp;&H4<br> Public&nbsp;Const&nbsp;PRINTER_ACCESS_USE&nbsp;=&nbsp;&H8<br> <br> ′Types&nbsp;Definition<br> Public&nbsp;Type&nbsp;DEVMODE<br> dmDeviceName&nbsp;As&nbsp;String&nbsp;*&nbsp;CCHDEVICENAME<br> dmSpecVersion&nbsp;As&nbsp;Integer<br> dmDriverVersion&nbsp;As&nbsp;Integer<br> dmSize&nbsp;As&nbsp;Integer<br> dmDriverExtra&nbsp;As&nbsp;Integer<br> dmFields&nbsp;As&nbsp;Long<br> dmOrientation&nbsp;As&nbsp;Integer<br> dmPaperSize&nbsp;As&nbsp;Integer<br> dmPaperLength&nbsp;As&nbsp;Integer<br> dmPaperWidth&nbsp;As&nbsp;Integer<br> dmScale&nbsp;As&nbsp;Integer<br> dmCopies&nbsp;As&nbsp;Integer<br> dmDefaultSource&nbsp;As&nbsp;Integer<br> dmPrintQuality&nbsp;As&nbsp;Integer<br> dmColor&nbsp;As&nbsp;Integer<br> dmDuplex&nbsp;As&nbsp;Integer<br> dmYResolution&nbsp;As&nbsp;Integer<br> dmTTOption&nbsp;As&nbsp;Integer<br> dmCollate&nbsp;As&nbsp;Integer<br> dmFormName&nbsp;As&nbsp;String&nbsp;*&nbsp;CCHFORMNAME<br> dmUnusedPadding&nbsp;As&nbsp;Integer<br> dmBitsPerPel&nbsp;As&nbsp;Long<br> dmPelsWidth&nbsp;As&nbsp;Long<br> dmPelsHeight&nbsp;As&nbsp;Long<br> dmDisplayFlags&nbsp;As&nbsp;Long<br> dmDisplayFrequency&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> <br> Public&nbsp;Type&nbsp;PRINTER_DEFAULTS<br> pDatatype&nbsp;As&nbsp;String<br> pDevMode&nbsp;As&nbsp;DEVMODE<br> DesiredAccess&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> <br> ′API&nbsp;Declarations<br> Public&nbsp;Declare&nbsp;Function&nbsp;OpenPrinter&nbsp;Lib&nbsp;"winspool.drv"&nbsp;Alias&nbsp;"OpenPrinterA"&nbsp;_<br> (ByVal&nbsp;pPrinterName&nbsp;As&nbsp;String,&nbsp;phPrinter&nbsp;As&nbsp;Long,&nbsp;_<br> pDefault&nbsp;As&nbsp;PRINTER_DEFAULTS)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Declare&nbsp;Function&nbsp;EnumJobs&nbsp;Lib&nbsp;"winspool.drv"&nbsp;Alias&nbsp;"EnumJobsA"&nbsp;_<br> (ByVal&nbsp;HPrinter&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;FirstJob&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;NoJobs&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;Level&nbsp;As&nbsp;Long,&nbsp;pJob&nbsp;As&nbsp;Byte,&nbsp;ByVal&nbsp;cdBuf&nbsp;As&nbsp;Long,&nbsp;_<br> pcbNeeded&nbsp;As&nbsp;Long,&nbsp;pcReturned&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Declare&nbsp;Function&nbsp;CloseHandle&nbsp;Lib&nbsp;"kernel32"&nbsp;(ByVal&nbsp;hObject&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> <br> ′取得指定的打印机,目前有多少&nbsp;Jobs&nbsp;(最大值为&nbsp;128)<br> ′打印机的名称可以是&nbsp;mapping&nbsp;的网络路径名称,例如:&nbsp;"\\myserver\myprinter"<br> Function&nbsp;GetPrinterQueue(PrinterName&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long<br> Dim&nbsp;PrinterStruct&nbsp;As&nbsp;PRINTER_DEFAULTS<br> Dim&nbsp;HPrinter&nbsp;As&nbsp;Long<br> Dim&nbsp;ret&nbsp;As&nbsp;Boolean<br> Dim&nbsp;JobStruct(0&nbsp;To&nbsp;127)&nbsp;As&nbsp;Byte<br> Dim&nbsp;pcbNeeded&nbsp;As&nbsp;Long<br> Dim&nbsp;pcReturned&nbsp;As&nbsp;Long<br> Dim&nbsp;TempByte&nbsp;As&nbsp;Byte<br> <br> ′设定&nbsp;Printer&nbsp;structure&nbsp;初值<br> PrinterStruct.pDatatype&nbsp;=&nbsp;vbNullString<br> PrinterStruct.pDevMode.dmSize&nbsp;=&nbsp;Len(PrinterStruct.pDevMode)<br> PrinterStruct.DesiredAccess&nbsp;=&nbsp;PRINTER_ACCESS_USE<br> ′取得打印机的&nbsp;Handle<br> ret&nbsp;=&nbsp;OpenPrinter(PrinterName,&nbsp;HPrinter,&nbsp;PrinterStruct)<br> ′取得打印机的&nbsp;active&nbsp;jobs<br> ret&nbsp;=&nbsp;EnumJobs(HPrinter,&nbsp;0,&nbsp;127,&nbsp;1,&nbsp;TempByte,&nbsp;0,&nbsp;pcbNeeded,&nbsp;pcReturned)<br> If&nbsp;pcbNeeded&nbsp;=&nbsp;0&nbsp;Then<br> GetPrinterQueue&nbsp;=&nbsp;0<br> Else<br> ret&nbsp;=&nbsp;EnumJobs(HPrinter,&nbsp;0,&nbsp;127,&nbsp;1,&nbsp;JobStruct(0),&nbsp;pcbNeeded,&nbsp;pcbNeeded,&nbsp;pcReturned)<br> GetPrinterQueue&nbsp;=&nbsp;pcReturned<br> End&nbsp;If<br> ′关闭打印机<br> ret&nbsp;=&nbsp;CloseHandle(HPrinter)<br> End&nbsp;Function&nbsp;<br> <br> ′在表单中放一个&nbsp;CommandButton,程序码如下:<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> ′测试预设打印机的&nbsp;Queue&nbsp;(Printer.DeviceName)<br> Msgbox&nbsp;"打印机中尚有&nbsp;"&nbsp;&&nbsp;GetPrinterQueue(Printer.DeviceName)&nbsp;&&nbsp;"&nbsp;份报表",&nbsp;64,&nbsp;"讯息"<br> End&nbsp;Sub</内容> 
      </数据>
    - <数据>
      <名称>ZOrder的使用</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:32:33</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ZOrder</关键字1> 
      <关键字2>坐标</关键字2> 
      <关键字3>使用</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>ZOrder&nbsp;拆开以后就是&nbsp;Z&nbsp;及&nbsp;Order,其意义说明如下:<br> Z:这里是指三度空间中的&nbsp;Z&nbsp;座标轴&nbsp;(注一),而不是指英文字母的第&nbsp;26&nbsp;个字母。<br> Order:排列顺序。<br> 所以&nbsp;ZOrder&nbsp;就是指在&nbsp;Z&nbsp;座标轴上的排列顺序!<br> <br> ZOrder&nbsp;语法如下:<br> <br> object.ZOrder&nbsp;position&nbsp;<br> <br> ---------------------------------------------------------------------------<br> <br> object&nbsp;选择性引数。物件运算式,用来指定「适用于」清单中的物件。<br> 如果省略&nbsp;object,则假设具有驻点的&nbsp;Form&nbsp;物件为&nbsp;object。&nbsp;<br> Position&nbsp;选择性引数。整数,用以指示&nbsp;object&nbsp;相对于同一&nbsp;object&nbsp;其它执行个体的位置。<br> 如果&nbsp;position&nbsp;为&nbsp;0&nbsp;或省略,则&nbsp;object&nbsp;放置在&nbsp;z-&nbsp;顺序前面&nbsp;(上方)。<br> 如果&nbsp;position&nbsp;为&nbsp;1,则&nbsp;object&nbsp;放置在&nbsp;z-&nbsp;顺序后面&nbsp;(下方)。&nbsp;<br> <br> ---------------------------------------------------------------------------<br> <br> 在设计阶段选取快显功能表中的「移至顶层」或「移至底层」功能表指令,可以设定物件的&nbsp;z-&nbsp;顺序。<br> <br> ZOrder&nbsp;用在不同的地方,有二种不同的意义:<br> 1、用于&nbsp;MDIForm&nbsp;中的&nbsp;Child&nbsp;Form&nbsp;时,指的是每一个&nbsp;Child&nbsp;Form&nbsp;的上下位置关系。<br> 2、用于每一个&nbsp;Form&nbsp;中的所有控制项时,指的是每一个控制项间的上下位置关系。&nbsp;(注二)<br> <br> 注一:一般我们的二度平面座标轴是指&nbsp;X&nbsp;座标轴&nbsp;(东西向)及&nbsp;Y&nbsp;座标轴&nbsp;(南北向),<br>    二个轴构成一个平面,再加上垂直的&nbsp;Z&nbsp;座标轴,就构成了三度立体空间了!<br>    所以&nbsp;ZOrder&nbsp;指的就是物件在垂直的&nbsp;Z&nbsp;座标轴上的上下位置关系。<br> <br> 注二:虽然&nbsp;ZOrder&nbsp;指的是物件在垂直的&nbsp;Z&nbsp;座标轴上的上下位置关系。<br>    但是很多人搞不清楚,为什么他已经设定了&nbsp;ZOrder&nbsp;了,为什么在某些控制项中是无效的?<br> <br>    原因是对单一&nbsp;Form&nbsp;或&nbsp;单一&nbsp;Container&nbsp;而言,在垂直的&nbsp;Z&nbsp;座标轴上又分成三个层次:<br>    最下一层:显示图形方法结果的绘图空间。<br>    中间一层:用来显示图形物件(例如&nbsp;Image)&nbsp;和&nbsp;Label&nbsp;控制项。<br>    上面一层:显示所有非图形控制项,例如&nbsp;CommandButton、CheckBox&nbsp;或&nbsp;ListBox。<br>    而&nbsp;ZOrder&nbsp;只对单一层次内的控制项有效而已!<br> <br>    例如:您如果设定&nbsp;Label&nbsp;及&nbsp;Image&nbsp;的&nbsp;ZOrder&nbsp;是有效的,因为它们都在中间一层!<br>       您如果设定&nbsp;Label&nbsp;及&nbsp;CommandButton&nbsp;的&nbsp;ZOrder&nbsp;是无效的,因为它们在不同层!<br> <br>    最重要的是:不管&nbsp;ZOrder&nbsp;如何设定,<br>          在上面一层的物件永远会在中间一层的物件的上方!<br>          在中间一层的物件永远会在最下一层的物件的上方!&nbsp;</内容> 
      </数据>
    - <数据>
      <名称>算出TextBox中目前光标位置</名称> 
      <类别>文本处理</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:34:53</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>光标</关键字1> 
      <关键字2>位置</关键字2> 
      <关键字3>TextBox</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>在很多文字编辑器中,都可以告诉您,目前您的光标是在文字编辑器的第几行,我们也来实作一下!<br> <br> 在&nbsp;Form&nbsp;中放入一个&nbsp;TextBox&nbsp;并将&nbsp;Multiline&nbsp;属性设为&nbsp;True,放入一个&nbsp;Label&nbsp;用来显示目前光标所在的行数,在表单声明区中加入以下声明及模组:<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessageLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;_<br> (ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Const&nbsp;EM_LINEFROMCHAR&nbsp;=&nbsp;&HC9<br> <br> Function&nbsp;LineNo(txthwnd&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> On&nbsp;Local&nbsp;Error&nbsp;Resume&nbsp;Next<br> LineNo&nbsp;=&nbsp;SendMessageLong(txthwnd,&nbsp;EM_LINEFROMCHAR,&nbsp;-1&,&nbsp;0&)&nbsp;+&nbsp;1<br> LineNo&nbsp;=&nbsp;Format$(lineno,&nbsp;"##,###")<br> End&nbsp;Function<br> <br> ′呼叫这个模组时要导入的是&nbsp;TextBox&nbsp;的&nbsp;hwnd<br> ′实际使用时,必须在&nbsp;TextBox&nbsp;的以下几个事件中呼叫这个模组,才会完全正确:<br> ′1.&nbsp;Change事件:输入资料时可侦测计算<br> ′2.&nbsp;Click&nbsp;事件:用鼠标移动光标时可侦测计算<br> ′3.&nbsp;KeyUp&nbsp;事件:用上下左右键移动光标时可侦测计算<br> <br> Sub&nbsp;Text1_Change()<br> Label1&nbsp;=&nbsp;LineNo(Text1.hwnd)<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Text1_Click()<br> Label1&nbsp;=&nbsp;LineNo(Text1.hwnd)<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Text1_KeyUp(KeyCode&nbsp;As&nbsp;Integer,&nbsp;Shift&nbsp;As&nbsp;Integer)<br> Label1&nbsp;=&nbsp;LineNo(Text1.hwnd)<br> End&nbsp;Sub</内容> 
      </数据>
    - <数据>
      <名称>动态新增、移除ODBC&nbsp;DSN</名称> 
      <类别>数据库</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:37:06</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>动态</关键字1> 
      <关键字2>DSN</关键字2> 
      <关键字3>新增移除</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>一般我们建立&nbsp;Client&nbsp;端&nbsp;DSN&nbsp;都是在使用者的机器上进入【控制台】【ODBC&nbsp;资料来源管理员】去建立,但是如果我们开发的&nbsp;APP&nbsp;使用者很多时,这就有点累人了,所以我们可以将这个动作放在程序中!<br> <br> 新增&nbsp;DSN&nbsp;的方法有二种:<br> 1、使用&nbsp;DBEngine&nbsp;物件的&nbsp;RegisterDatabase&nbsp;方法<br> 2、呼叫&nbsp;SQLConfigDataSource&nbsp;API<br> <br> 不管使用以上任何一种方法新增&nbsp;DSN,一共会写入二个地方,一个是注册表,一个是&nbsp;ODBC.INI。<br> <br> 而删除&nbsp;DSN&nbsp;的方法同上面的第二种方法,呼叫&nbsp;SQLConfigDataSource&nbsp;API。<br> <br> 以下之模组以&nbsp;Oracle73&nbsp;Ver&nbsp;2.5&nbsp;为例,在&nbsp;Form&nbsp;的声明区中加入以下声明及模组:<br> <br> Private&nbsp;Const&nbsp;ODBC_ADD_DSN&nbsp;=&nbsp;1&nbsp;′&nbsp;Add&nbsp;data&nbsp;source<br> Private&nbsp;Const&nbsp;ODBC_CONFIG_DSN&nbsp;=&nbsp;2&nbsp;′&nbsp;Configure&nbsp;(edit)&nbsp;data&nbsp;source<br> Private&nbsp;Const&nbsp;ODBC_REMOVE_DSN&nbsp;=&nbsp;3&nbsp;′&nbsp;Remove&nbsp;data&nbsp;source<br> Private&nbsp;Const&nbsp;vbAPINull&nbsp;As&nbsp;Long&nbsp;=&nbsp;0&&nbsp;′&nbsp;NULL&nbsp;Pointer<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;SQLConfigDataSource&nbsp;Lib&nbsp;"ODBCCP32.DLL"&nbsp;_<br> (ByVal&nbsp;hwndParent&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;fRequest&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;lpszDriver&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;lpszAttributes&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Sub&nbsp;CreateDSN(sDSN&nbsp;As&nbsp;String)<br> Dim&nbsp;nRet&nbsp;As&nbsp;Long<br> Dim&nbsp;sDriver&nbsp;As&nbsp;String<br> Dim&nbsp;sAttributes&nbsp;As&nbsp;String<br> sDriver&nbsp;=&nbsp;"Oracle73&nbsp;Ver&nbsp;2.5"<br> sAttributes&nbsp;=&nbsp;"Server=Oracle8"&nbsp;&&nbsp;Chr$(0)<br> sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"DESCRIPTION="&nbsp;&&nbsp;sDSN&nbsp;&&nbsp;Chr$(0)<br> ′sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"DSN="&nbsp;&&nbsp;sDSN&nbsp;&&nbsp;Chr$(0)<br> sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"DATABASE=DBFinance"&nbsp;&&nbsp;Chr$(0)<br> sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"Userid=Scott"&nbsp;&&nbsp;Chr$(0)<br> ′sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"PWD=myPassword"&nbsp;&&nbsp;Chr$(0)<br> DBEngine.RegisterDatabase&nbsp;sDSN,&nbsp;sDriver,&nbsp;True,&nbsp;sAttributes&nbsp;′注一<br> ′nRet&nbsp;=&nbsp;SQLConfigDataSource(vbAPINull,&nbsp;ODBC_ADD_DSN,&nbsp;sDriver,&nbsp;sAttributes)&nbsp;′注二<br> End&nbsp;Sub<br> <br> Public&nbsp;Sub&nbsp;DeleteDSN(sDSN&nbsp;As&nbsp;String)<br> Dim&nbsp;nRet&nbsp;As&nbsp;Long<br> Dim&nbsp;sDriver&nbsp;As&nbsp;String<br> Dim&nbsp;sAttributes&nbsp;As&nbsp;String<br> sDriver&nbsp;=&nbsp;"Oracle73&nbsp;Ver&nbsp;2.5"<br> sAttributes&nbsp;=&nbsp;sAttributes&nbsp;&&nbsp;"DSN="&nbsp;&&nbsp;sDSN&nbsp;&&nbsp;Chr$(0)<br> nRet&nbsp;=&nbsp;SQLConfigDataSource(vbAPINull,&nbsp;ODBC_REMOVE_DSN,&nbsp;sDriver,&nbsp;sAttributes)<br> End&nbsp;Sub<br> <br> ′假设要产生的&nbsp;DSN&nbsp;为&nbsp;Test,实际使用范例如下:<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> CreateDSN&nbsp;"Test"<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Command2_Click()<br> DeleteDSN&nbsp;"Test"<br> End&nbsp;Sub<br> <br> ′而写到系统的资料如下:<br> <br> 1、ODBC.INI<br> <br> [ODBC&nbsp;32&nbsp;bit&nbsp;Data&nbsp;Sources]<br> Test=Oracle73&nbsp;Ver&nbsp;2.5&nbsp;(32&nbsp;bit)<br> <br> [Test]<br> Driver32=C:\ORAWIN95\ODBC250\sqo32_73.dll<br> <br> 2、注册表<br> <br> 机码:HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC&nbsp;Data&nbsp;Sources<br> 名称:Test&nbsp;资料:Oracle73&nbsp;Ver&nbsp;2.5<br> <br> 机码:HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Test<br> 名称:Description&nbsp;资料:Test<br> 名称:Driver&nbsp;资料:C:\ORAWIN95\ODBC250\sqo32_73.dll<br> 名称:Server&nbsp;资料:Oracle8<br> 名称:UserId&nbsp;资料:Scott<br> <br> ※注一及注二可任选一种,只要将不使用的方法&nbsp;Mark&nbsp;起来即可!<br> ※若您想使用其他之资料库,只要将以上模组稍作修改即可!</内容> 
      </数据>
    - <数据>
      <名称>取消TextBox鼠标右键的弹出菜单功能</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:41:09</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>TextBox</关键字1> 
      <关键字2>PopupMenu</关键字2> 
      <关键字3>鼠标</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>自从&nbsp;Microsoft&nbsp;Windows&nbsp;进入&nbsp;Windows95&nbsp;之后,有一个很方便的功能,很多软件都有提供,就是鼠标右键的&nbsp;PopupMenu&nbsp;功能,它确实很方便,但是有时却是梦魇,那就是您不需要它的时候,它还是会自动出现!本例中的&nbsp;TextBox&nbsp;就是明显的例子。<br> <br> 但是这个梦魇从&nbsp;VB5.0&nbsp;以后就可以解决了,因为&nbsp;VB5.0&nbsp;提供了&nbsp;AdressOf&nbsp;这个运算子,可以做回呼(callback)处理!<br> <br> 请将以下的程序码放在&nbsp;.bas&nbsp;模组中,呼叫&nbsp;Hook&nbsp;这个&nbsp;Sub&nbsp;并传入&nbsp;TextBox&nbsp;的&nbsp;hWnd&nbsp;当作参数,但是切记您在&nbsp;Unload&nbsp;Form&nbsp;之前一定要呼叫&nbsp;UnHook&nbsp;这个&nbsp;Sub,否则会产生一个&nbsp;General&nbsp;Protection&nbsp;Fault!<br> <br> Declare&nbsp;Function&nbsp;CallWindowProc&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;_<br> "CallWindowProcA"&nbsp;(ByVal&nbsp;lpPrevWndFunc&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;hWnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Msg&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Declare&nbsp;Function&nbsp;SetWindowLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;_<br> "SetWindowLongA"&nbsp;(ByVal&nbsp;hWnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nIndex&nbsp;_<br> As&nbsp;Long,&nbsp;ByVal&nbsp;dwNewLong&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Const&nbsp;GWL_WNDPROC&nbsp;=&nbsp;-4<br> Public&nbsp;Const&nbsp;WM_RBUTTONUP&nbsp;=&nbsp;&H205<br> Public&nbsp;lpPrevWndProc&nbsp;As&nbsp;Long<br> Private&nbsp;lngHWnd&nbsp;As&nbsp;Long<br> <br> Public&nbsp;Sub&nbsp;Hook(hWnd&nbsp;As&nbsp;Long)<br> lngHWnd&nbsp;=&nbsp;hWnd<br> lpPrevWndProc&nbsp;=&nbsp;SetWindowLong(lngHWnd,&nbsp;GWL_WNDPROC,&nbsp;_<br> AddressOf&nbsp;WindowProc)<br> End&nbsp;Sub<br> <br> Public&nbsp;Sub&nbsp;UnHook()<br> Dim&nbsp;lngReturnValue&nbsp;As&nbsp;Long<br> lngReturnValue&nbsp;=&nbsp;SetWindowLong(lngHWnd,&nbsp;GWL_WNDPROC,&nbsp;_<br> lpPrevWndProc)<br> End&nbsp;Sub<br> <br> Function&nbsp;WindowProc(ByVal&nbsp;hw&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;uMsg&nbsp;As&nbsp;Long,&nbsp;_<br> ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Select&nbsp;Case&nbsp;uMsg<br> Case&nbsp;WM_RBUTTONUP<br> ′Do&nbsp;nothing<br> ′Or&nbsp;popup&nbsp;you&nbsp;own&nbsp;menuCase&nbsp;Else<br> WindowProc&nbsp;=&nbsp;CallWindowProc(lpPrevWndProc,&nbsp;_<br> hw,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam)<br> End&nbsp;Select<br> End&nbsp;Function<br> <br> 在&nbsp;Form_Load&nbsp;事件中加入以下程序码:<br> <br> Call&nbsp;Hook(Text1.hWnd)<br> <br> 在&nbsp;Form_Unload&nbsp;中加入以下程序码:<br> <br> Call&nbsp;UnHook</内容> 
      </数据>
    - <数据>
      <名称>让ComboBox自动下拉</名称> 
      <类别>控件特效</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:43:52</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ComboBox</关键字1> 
      <关键字2>自动</关键字2> 
      <关键字3>API</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>以下状况假设我在&nbsp;Form_Load&nbsp;中自动下拉&nbsp;Combo1.&nbsp;<br> <br> ′以下声明用于16位<br> Const&nbsp;WM_USER&nbsp;=&nbsp;&H400<br> Const&nbsp;CB_SHOWDROPDOWN&nbsp;=&nbsp;(WM_USER&nbsp;+&nbsp;15)<br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"User"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Integer,&nbsp;_<br> ByVal&nbsp;wMsg&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Integer,&nbsp;lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long&nbsp;<br> <br> ′以下声明用于32位<br> Const&nbsp;CB_SHOWDROPDOWN&nbsp;=&nbsp;&H14F<br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;_<br> (ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,&nbsp;_<br> lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long&nbsp;<br> <br> Private&nbsp;Sub&nbsp;Form_Load()<br> Combo1.AddItem&nbsp;"11111"<br> Combo1.AddItem&nbsp;"22222"<br> Combo1.AddItem&nbsp;"33333"<br> Combo1.AddItem&nbsp;"44444"<br> Combo1.AddItem&nbsp;"55555"<br> Combo1.AddItem&nbsp;"66666"<br> ′Form_Load&nbsp;即自动下拉&nbsp;Combo1<br> Dim&nbsp;nret&nbsp;As&nbsp;Long<br> nret&nbsp;=&nbsp;SendMessage(Combo1.hwnd,&nbsp;CB_SHOWDROPDOWN,&nbsp;1,&nbsp;ByVal&nbsp;0&)<br> End&nbsp;Sub</内容> 
      </数据>
      

  5.   

    <数据>
      <名称>实现网络连通检测</名称> 
      <类别>网络</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:22:10</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>网络</关键字1> 
      <关键字2>连通</关键字2> 
      <关键字3>监测</关键字3> 
      <内容简介>下面是实现网络连通检测的VB&nbsp;6代码:&nbsp;</内容简介> 
      <内容>Private&nbsp;Sub&nbsp;Form_Load()&nbsp;<br> If&nbsp;IsConnected&nbsp;=&nbsp;TRUE&nbsp;Then&nbsp;<br> MsgBox&nbsp;(“您已经连通了Internet!”)&nbsp;<br> End&nbsp;If&nbsp;<br> If&nbsp;IsConnected&nbsp;=&nbsp;FALSE&nbsp;Then&nbsp;<br> MsgBox&nbsp;(“您还没有连通&nbsp;Internet!”)&nbsp;<br> End&nbsp;If&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Option&nbsp;Explicit&nbsp;<br> /*有关的API声明和定义*/&nbsp;<br> Public&nbsp;Declare&nbsp;Function&nbsp;RasEnumConnections&nbsp;Lib&nbsp;“RasApi32.dll”&nbsp;Alias&nbsp;“RasEnumConnectionsA”&nbsp;(lpRasCon&nbsp;As&nbsp;Any,&nbsp;lpcb&nbsp;As&nbsp;Long,&nbsp;lpcConnections&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br>  &nbsp;<br> Public&nbsp;Declare&nbsp;Function&nbsp;RasGetConnectStatus&nbsp;Lib&nbsp;“RasApi32.dll”&nbsp;Alias&nbsp;“RasGetConnectStatusA”&nbsp;(ByVal&nbsp;hRasCon&nbsp;As&nbsp;Long,&nbsp;lpStatus&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long&nbsp;<br>  &nbsp;<br> /*常数和变量的设定*/&nbsp;<br> Public&nbsp;Const&nbsp;RAS95_MaxEntryName&nbsp;=&nbsp;256&nbsp;<br> Public&nbsp;Const&nbsp;RAS95_MaxDeviceType&nbsp;=&nbsp;16&nbsp;<br> Public&nbsp;Const&nbsp;RAS95_MaxDeviceName&nbsp;=&nbsp;32&nbsp;<br> Public&nbsp;Type&nbsp;RASCONN95&nbsp;<br> dwSize&nbsp;As&nbsp;Long&nbsp;<br> hRasCon&nbsp;As&nbsp;Long&nbsp;<br> szEntryName(RAS95_MaxEntryName)&nbsp;As&nbsp;Byte&nbsp;<br> szDeviceType(RAS95_MaxDeviceType)&nbsp;As&nbsp;Byte&nbsp;<br> szDeviceName(RAS95_MaxDeviceName)&nbsp;As&nbsp;Byte&nbsp;<br> End&nbsp;Type&nbsp;<br> Public&nbsp;Type&nbsp;RASCONNSTATUS95&nbsp;<br> dwSize&nbsp;As&nbsp;Long&nbsp;<br> RasConnState&nbsp;As&nbsp;Long&nbsp;<br> dwError&nbsp;As&nbsp;Long&nbsp;<br> szDeviceType(RAS95_MaxDeviceType)&nbsp;As&nbsp;Byte&nbsp;<br> szDeviceName(RAS95_MaxDeviceName)&nbsp;As&nbsp;Byte&nbsp;<br> End&nbsp;Type&nbsp;<br>  &nbsp;<br> /*函数IsConnected返回连通的状态,如果为True则表示已连通*/&nbsp;<br> Public&nbsp;Function&nbsp;IsConnected()&nbsp;As&nbsp;Boolean&nbsp;<br> Dim&nbsp;TRasCon(255)&nbsp;As&nbsp;RASCONN95&nbsp;<br> Dim&nbsp;lg&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;lpcon&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;RetVal&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;Tstatus&nbsp;As&nbsp;RASCONNSTATUS95&nbsp;<br> TRasCon(0).dwSize&nbsp;=&nbsp;412&nbsp;<br> lg&nbsp;=&nbsp;256&nbsp;*&nbsp;TRasCon(0).dwSize&nbsp;<br> RetVal&nbsp;=&nbsp;RasEnumConnections(TRasCon(0),&nbsp;lg,&nbsp;lpcon)&nbsp;<br> If&nbsp;RetVal&nbsp;<>&nbsp;0&nbsp;Then&nbsp;<br> MsgBox&nbsp;“错误”&nbsp;<br> Exit&nbsp;Function&nbsp;<br> End&nbsp;If&nbsp;<br> Tstatus.dwSize&nbsp;=&nbsp;160&nbsp;<br> RetVal&nbsp;=&nbsp;RasGetConnectStatus(TRasCon(0)&nbsp;<br> .hRasCon,Tstatus)&nbsp;<br> If&nbsp;Tstatus.RasConnState&nbsp;=&nbsp;&H2000&nbsp;Then&nbsp;<br> IsConnected&nbsp;=&nbsp;TRUE&nbsp;<br> Else&nbsp;<br> IsConnected&nbsp;=&nbsp;FALSE&nbsp;<br> End&nbsp;If&nbsp;<br> End&nbsp;Function</内容> 
      </数据>
    - <数据>
      <名称>启动拨号网络中的连接</名称> 
      <类别>网络</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:22:57</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>拨号网络</关键字1> 
      <关键字2>连接</关键字2> 
      <关键字3>NULL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>由于拨号网络不是一个可执行文件,&nbsp;所以要启动拨号网络,需要借助&nbsp;explorer.exe&nbsp;。但若是要启动拨号网络中的某一个连接,则要借助rundll.exe&nbsp;和&nbsp;rnaui.dll两个文件。启动方法如下(假定此连接名称为163):&nbsp;<br> Shell&nbsp;“rundll&nbsp;rnaui.dll,RnaDial&nbsp;163”,vbNormalFocus&nbsp;<br> 上面假定了连接名称,但在实际编程中我们是不知道连接名称的。在窗体上放置一个命令按钮(cmdCallConnect),在其单击事件中进行连接处理。下面的代码介绍如何取得默认的连接名称并启动它:&nbsp;<br> Option&nbsp;Explicit&nbsp;<br> /*有关的API声明*/&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegOpenKeyEx&nbsp;Lib&nbsp;“advapi32”&nbsp;Alias&nbsp;“RegOpenKeyExA”&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpSubKey&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;ulOptions&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;samDesired&nbsp;As&nbsp;Long,&nbsp;phkResult&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br>  &nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegQueryValueEx&nbsp;Lib&nbsp;“advapi32”&nbsp;Alias&nbsp;“RegQueryValueExA”&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpValueName&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;lpReserved&nbsp;As&nbsp;Long,&nbsp;ByRef&nbsp;lpType&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;szData&nbsp;As&nbsp;String,&nbsp;ByRef&nbsp;lpcbData&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br>  &nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegCloseKey&nbsp;Lib&nbsp;“advapi32”(ByVal&nbsp;hKey&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br>  &nbsp;<br> /*常数的设定*/&nbsp;<br> Const&nbsp;HKEY_CURRENT_USER&nbsp;=&nbsp;&H80000001&nbsp;<br> Const&nbsp;ERROR_SUCCESS&nbsp;=&nbsp;0&nbsp;<br> 在命令按钮(cmdCallConnect)中加入如下代码:&nbsp;<br> Private&nbsp;Sub&nbsp;cmdCallConnect_Click()&nbsp;<br> /*启动默认拨号连接*/&nbsp;<br> Shell&nbsp;“rundll&nbsp;rnaui.dll,RnaDial”&nbsp;+&nbsp;GetConnect,&nbsp;vbNormalFocus&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> /*取得连接的函数(GetConnect)*/&nbsp;<br> Public&nbsp;Function&nbsp;GetConnect()&nbsp;As&nbsp;String&nbsp;<br> Dim&nbsp;hKey&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;SubKey&nbsp;As&nbsp;String&nbsp;<br> /*主键*/&nbsp;<br> hKey&nbsp;=&nbsp;HKEY_CURRENT_USER&nbsp;<br> /*子键*/&nbsp;<br> SubKey&nbsp;=&nbsp;“RemoteAccess”&nbsp;<br> /*取得默认连接名*/&nbsp;<br> GetConnect=GetRegValue(hKey,SubKey,&nbsp;“Default”)&nbsp;<br> End&nbsp;Function&nbsp;<br> /*取得注册的函数(GetRegValue)*/&nbsp;<br> Public&nbsp;Function&nbsp;GetRegValue(hKey&nbsp;As&nbsp;Long,lpszSubKey&nbsp;As&nbsp;String,szKey&nbsp;As&nbsp;String)&nbsp;As&nbsp;Variant&nbsp;<br> On&nbsp;Error&nbsp;GoTo&nbsp;ErrorRoutineErr:&nbsp;<br> Dim&nbsp;phkResult&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;lResult&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;szBuffer&nbsp;As&nbsp;String&nbsp;<br> Dim&nbsp;lBuffSize&nbsp;As&nbsp;Long&nbsp;<br> /*创建缓冲区*/&nbsp;<br> szBuffer&nbsp;=&nbsp;Space(255)&nbsp;<br> lBuffSize&nbsp;=&nbsp;Len(szBuffer)&nbsp;<br> /*打开注册键*/&nbsp;<br> RegOpenKeyEx&nbsp;hKey,&nbsp;lpszSubKey,&nbsp;0,&nbsp;1,phkResult&nbsp;<br> /*取得查询结果*/&nbsp;<br> lResult&nbsp;=&nbsp;RegQueryValueEx(phkResult,&nbsp;szKey,&nbsp;0,&nbsp;0,&nbsp;szBuffer,&nbsp;lBuffSize)&nbsp;<br> /*关闭注册键*/&nbsp;<br> RegCloseKey&nbsp;phkResult&nbsp;<br> /*返回结果*/&nbsp;<br> If&nbsp;lResult&nbsp;=&nbsp;ERROR_SUCCESS&nbsp;Then&nbsp;<br> GetRegValue&nbsp;=&nbsp;Left(szBuffer,&nbsp;lBuffSize&nbsp;-&nbsp;1)&nbsp;<br> Else&nbsp;<br> GetRegValue&nbsp;=“”&nbsp;<br> End&nbsp;If&nbsp;<br> Exit&nbsp;Function&nbsp;<br> /*意外处理*/&nbsp;<br> ErrorRoutineErr:&nbsp;<br> GetRegValue&nbsp;=“”&nbsp;<br> End&nbsp;Function</内容> 
      </数据>
    - <数据>
      <名称>设计E-mail的接发送收部分</名称> 
      <类别>网络</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:25:41</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>Email</关键字1> 
      <关键字2>接收</关键字2> 
      <关键字3>发送</关键字3> 
      <内容简介 /> 
      <内容>设计E-mail的接收部分&nbsp;<br> 在VB&nbsp;6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中Microsoft&nbsp;MAPI&nbsp;Controls&nbsp;6.0控件,点击“确定”按钮后,工具箱上增加了MAPIMessage和MAPISession两个图标。&nbsp;<br> 在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;再加入一个MAPISession控件,取名为MAPISession1;再加入三个TextBox控件,分别取名为Subject、Content和Indexno,&nbsp;将它们的Caption分别改为邮件标题、邮件内容和邮件索引号;在TextBox前各加入一个Label控件,将Caption分别改为标题、内容和索引号。&nbsp;<br> 将MAPIMessage1的各项属性设置如下:&nbsp;<br> ●DownLoadMail=TRUE;&nbsp;<br> ●LogonUI=TRUE;&nbsp;<br> ●NewSession=FALSE;&nbsp;<br> ●UserName=“接收Email”。&nbsp;<br> 在Form上加入一个按钮(Getmail),将其Caption改为取邮件。&nbsp;<br> 在&nbsp;Getmail_Click()事件中加入以下程序代码,程序的功能是使我们接收Email。&nbsp;<br> MAPIMessage1.Fetch&nbsp;<br> Form1.Caption=MAPIMessage1.MsgCount&nbsp;<br> MAPIMessage1.MsgIndex=CINT(Indexno.text)&nbsp;<br> Subject.Text&nbsp;=&nbsp;MAPIMessage1.MsgNoteText&nbsp;<br> Content.Text&nbsp;=&nbsp;MAPIMessage1.MsgSubject&nbsp;<br> 其中Fetch命令用来将信件抓到系统存储器的inbuffer中。我们将信件抓回来后,可以通过MsgCount属性知道信件数量,接着可以用MsgIndex设置要看哪一封信件的内容、标题等。&nbsp;<br> 设计E-mail的发送部分&nbsp;<br> 1.参数设置&nbsp;<br> 进入Exchange系统,选择新增设置文件后屏幕上会显示所需要的信息服务,选择Internet&nbsp;Mail。&nbsp;<br> 把设置文件的名称设为test。屏幕会显示两个选项,您可以选择以Modem方式或以Network&nbsp;方式连接。笔者所用的是Modem方式;假若您是使Internet专线,就要选择Network&nbsp;方式。&nbsp;<br> 选择Modem方式后,Exchange会要求我们输入邮件服务器的IP地址。接着将Transform&nbsp;Message的模式设置为Automatic,这样当我们连接到邮件服务器时,新的信息会自动下载到本地端。接下来,将您所使用的Email地址、全名、口令和下载路径等一一设置好。&nbsp;<br> 2.程序设计&nbsp;<br> 在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;加入一个MAPISession控件,取名为MAPISession1;并加入三个TextBox控件,取名为Subject、Content和Addr。并在三个TextBox前各加入一个Label,将Caption分别改为标题、内容和地址。&nbsp;<br> 将MAPIMessage1的各项属性设置如下:&nbsp;<br> ●DownLoadMail=TRUE;&nbsp;<br> ●LogonUI=TRUE;&nbsp;<br> ●NewSession=FALSE;&nbsp;<br> ●UserName=“发送Email”。&nbsp;<br> 这里将DownLoadMail设置为TRUE,当程序和邮件服务器第一次连接时,会将新的邮件下载到本地端。将LogonUI设置为TRUE,则当您程序中Logon名称输入错误时,系统会显示一个Message&nbsp;Box来让您输入正确的名称。&nbsp;<br> 由于这个程序仅使用一个Session,所以可将NewSession设置成FALSE。如果您有许多Session要建立的话,则将它设置成TRUE。UserName中所填的,是我们在Exchange中所新增的设置文件名称,如果没有填内容的话,系统将会显示一些Message&nbsp;Box请您输入文件。&nbsp;<br> 在Form上加入三个按钮,Logon、Logoff和Send,并分别将它们的Caption改为登录、离网和发送。&nbsp;<br> 在&nbsp;Logon_Click()事件中加入以下程序代码,程序的功能是使我们登录到邮件服务器:&nbsp;<br> MAPISession1.SignOn&nbsp;<br> MAPIMessage1.SessionID=MAPISession1.SessionID&nbsp;<br> sgBox&nbsp;“Your&nbsp;ID&nbsp;is”&nbsp;+&nbsp;Str&nbsp;<br> (MAPISession1.SessionID)&nbsp;<br> 其中MAPISession1.SignOn是作登录的动作。在登录时,因为已经将MAPIMessage1控件的DownLoadMail属性设置为TRUE,所以可以在屏幕上看到Message&nbsp;Box,显示系统正在下载邮件。登录成功后,系统会传回一个SessionID,将该ID填入MAPIMessage1的SessionID中,这样就可以利用该Session来传送Email,同时用Message&nbsp;Box通知用户发送成功。&nbsp;<br> 在Logoff_Click()事件中加入以下程序代码,程序的功能是使我们离开邮件服务器:&nbsp;<br> MAPIS1.SignOff&nbsp;<br> 在Send_Click()事件中加入以下程序代码,程序的功能是使我们发送Email:&nbsp;<br> MAPIMessage1.Compose&nbsp;<br> MAPIMessage1.RecipDisplayName&nbsp;=&nbsp;Addr.text&nbsp;<br> MAPIMessage1.AddressResolveUI&nbsp;=&nbsp;TRUE&nbsp;<br> MAPIMessage1.MsgSubject&nbsp;=&nbsp;Subject.text&nbsp;<br> MAPIMessage1.MsgNoteText&nbsp;=&nbsp;Content.text&nbsp;<br> MAPIMessage1.Send&nbsp;<br> MsgBox&nbsp;“您发送成功啦!”&nbsp;<br> 其中Compose命令的主要目的是使您可以改变RecipDisplayName的内容,将所需传送的Email地址、主题和文章内容分别填入RecipDisplayName、MsgSubject和MsgNoteText,接着用Send命令发送出去。</内容> 
      </数据>
    - <数据>
      <名称>访问因特网并调用Explorer&nbsp;</名称> 
      <类别>网络</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:24:57</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>访问</关键字1> 
      <关键字2>因特网</关键字2> 
      <关键字3>Explorer</关键字3> 
      <内容简介>访问Internet并调用Explorer</内容简介> 
      <内容>1.实现方法和控件介绍&nbsp;<br>   首先在VB&nbsp;6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中Microsoft&nbsp;Internet&nbsp;Controls控件,点击“确定”按钮后工具箱上增加一个WebBrowser图标,将它加到Form中。&nbsp;<br> 该控件有以下几个重要的方法和事件:&nbsp;<br> ●GoHome:装入IE设定的起始页;&nbsp;<br> ●Navigate:装入页面,如Object.Navigate&nbsp;url,其中url为URL地址,如http://www.microsoft.com;&nbsp;<br> ●GoBack:返回上一个页面;&nbsp;<br> ●GoForward:进入下一个页面;&nbsp;<br> ●Stop:停止载入页面;&nbsp;<br> ●BeforeNavigate&nbsp;Event:在每次装入页面前调用该事件;&nbsp;<br> ●StatusTextChange&nbsp;Event:每次浏览器的操作状态改变时调用该事件。&nbsp;<br> 2.具体的访问方法&nbsp;<br> 将WebBrowser图标添加到Form中。并在Form上添加4个命令按钮,Name属性分别为:GoButton、BackButton、ForwardButton和StopButton,通过这4个命令按钮可以实现对浏览器的操作。在Form上添加一个TextBox控件,用来输入和显示当前的页面地址。在Form上添加一个Label控件,用来显示当前浏览器操作状态。&nbsp;<br> /*载入Form*/&nbsp;<br> Private&nbsp;Sub&nbsp;Form_Load()&nbsp;<br> /*程序装入后进入IE设定的起始页*/&nbsp;<br> WebBrowser1.GoHome&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> /*改变Form尺寸*/&nbsp;<br> Private&nbsp;Sub&nbsp;Form_Resize()&nbsp;<br> /*改变窗口大小后同时改变控件的大小*/&nbsp;<br> WebBrowser1.Width&nbsp;=&nbsp;Form1.ScaleWidth&nbsp;<br> WebBrowser1.Height&nbsp;=&nbsp;Form1.ScaleHeight&nbsp;-&nbsp;900&nbsp;<br> Label1.Width&nbsp;=&nbsp;Form1.ScaleWidth&nbsp;<br> Label1.Top&nbsp;=&nbsp;Form1.ScaleHeight&nbsp;-&nbsp;300&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;BackButton_Click()&nbsp;<br> /*返回上一个页面*/&nbsp;<br> WebBrowser1.GoBack&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;ForwardButton_Click()&nbsp;<br> /*进入下一个页面*/&nbsp;<br> WebBrowser1.GoForward&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;GoButton_Click()&nbsp;<br> /*浏览输入的页面*/&nbsp;<br> WebBrowser1.Navigate&nbsp;(Text1.Text)&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;StopButton_Click()&nbsp;<br> /*停止浏览*/&nbsp;<br> WebBrowser1.Stop&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;Text1_KeyPress(KeyAscii&nbsp;As&nbsp;Integer)&nbsp;<br> /*输入地址后进行浏览*/&nbsp;<br> If&nbsp;KeyAscii&nbsp;=&nbsp;13&nbsp;Then&nbsp;<br> WebBrowser1.Navigate&nbsp;(Text1.Text)&nbsp;<br> End&nbsp;If&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;WebBrowser1_BeforeNavigate(ByVal&nbsp;URL&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;Flags&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;TargetFrameName&nbsp;As&nbsp;String,&nbsp;PostData&nbsp;As&nbsp;Variant,&nbsp;ByVal&nbsp;Headers&nbsp;As&nbsp;String,&nbsp;Cancel&nbsp;As&nbsp;Boolean)&nbsp;<br> /*将当前显示的页面的URL地址显示在Text1上*/&nbsp;Text1.Text&nbsp;=&nbsp;URL&nbsp;<br> End&nbsp;Sub&nbsp;<br>  &nbsp;<br> Private&nbsp;Sub&nbsp;WebBrowser1_StatusTextChange(ByVal&nbsp;Text&nbsp;As&nbsp;String)&nbsp;<br> /*Label1显示当前页面装入情况*/&nbsp;<br> Label1.Caption&nbsp;=&nbsp;Text&nbsp;<br> End&nbsp;Sub</内容> 
      </数据>
    - <数据>
      <名称>禁止在TextBox中输入</名称> 
      <类别>VB文件</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:29:59</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>TextBox</关键字1> 
      <关键字2>输入</关键字2> 
      <关键字3>禁止</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>禁止在TextBox中输入<br> 作者:土人&nbsp;<br> 方法一:(有光标闪烁,输入、删除等操作无效)<br> <br> Text1.Locked&nbsp;=&nbsp;True<br> <br> 方法二:(无光标闪烁,不能输入、删除,界面变色、文字反白)<br> <br> Text1.Enabled&nbsp;=&nbsp;False<br> <br> 方法三:(有光标闪烁,可删除,不能输入)<br> <br> 此法用两个API函数,略为复杂些。请在标准工程添加两个按钮和一个文本框:<br> <br> Option&nbsp;Explicit<br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;GetWindowLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"GetWindowLongA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nIndex&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Private&nbsp;Declare&nbsp;Function&nbsp;SetWindowLong&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SetWindowLongA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;nIndex&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwNewLong&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> <br> Const&nbsp;GWL_STYLE&nbsp;=&nbsp;(-16)<br> Const&nbsp;ES_NUMBER&nbsp;=&nbsp;&H2000&<br> <br> Public&nbsp;Sub&nbsp;SetNumber(NumberText&nbsp;As&nbsp;TextBox,&nbsp;Flag&nbsp;As&nbsp;Boolean)<br> <br> Dim&nbsp;CurrentStyle&nbsp;As&nbsp;Long,&nbsp;NewStyle&nbsp;As&nbsp;Long<br> '返回正常样式<br> CurrentStyle&nbsp;=&nbsp;GetWindowLong(NumberText.hwnd,&nbsp;GWL_STYLE)<br> <br> If&nbsp;Flag&nbsp;Then<br> CurrentStyle&nbsp;=&nbsp;CurrentStyle&nbsp;Or&nbsp;ES_NUMBER<br> Else<br> CurrentStyle&nbsp;=&nbsp;CurrentStyle&nbsp;And&nbsp;(Not&nbsp;ES_NUMBER)<br> End&nbsp;If<br> <br> '设置新样式<br> NewStyle&nbsp;=&nbsp;SetWindowLong(NumberText.hwnd,&nbsp;GWL_STYLE,&nbsp;CurrentStyle)<br> NumberText.Refresh&nbsp;'刷新<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Command1_Click()<br> SetNumber&nbsp;Text1,&nbsp;True<br> Text1.SetFocus<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Command2_Click()<br> SetNumber&nbsp;Text1,&nbsp;False<br> Text1.SetFocus<br> End&nbsp;Sub<br> <br> Private&nbsp;Sub&nbsp;Form_Load()<br> Command1.Caption&nbsp;=&nbsp;"禁止输入"<br> Command2.Caption&nbsp;=&nbsp;"可以输入"<br> End&nbsp;Sub</内容> 
      </数据>
    - <数据>
      <名称>在VB应用程序中巧用DLL上</名称> 
      <类别>VBDll</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:31:32</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>应用程序</关键字1> 
      <关键字2>DLL</关键字2> 
      <关键字3>NULL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>在使用VB开发多媒体应用程序时,如何合理地存放大量的多媒体资源,是一件十分棘手的事。如果将资源以文件形式存放在磁(光)盘上,使用时再从盘上读取,势必大大影响资源调用的速度。如果将资源直接编译在应用程序的可执行文件中,虽然可以获得令人满意的资源存取速度,但会导致最终的可执行文件尺寸大大膨胀。如何解决这个矛盾呢?笔者从Windows动态链接库的原理中得到启发,找到了一个结合二者优势的解决方法。<br> 动态链接库是实现Windows应用程序共享资源、节省内存空间、提高使用效率的一个重要技术手段。常见的动态库包含外部函数和资源,也有一些动态库只包含资源,如Windows字体资源文件,我们将这类动态库称之为资源动态链接库。制作资源动态库的方法很多,笔者在此提供了一种无需编程、简单有效的方法。该方法利用了Borland&nbsp;C++的资源管理器Resource&nbsp;Workshop的反编译能力,借用现成的动态库,将其改制为自己的资源动态库。具体方法是,拷贝一个现成的资源动态库文件(如windows\system目录下的字体资源文件arial.fot)到应用程序工作目录,更改文件名,如改为DEMO.DLL。然后在Resource&nbsp;Workshop中打开该文件,选择其中原有的资源将其删除,再加入自己的资源,即可制成自己的资源动态库。由于篇幅所限,具体操作过程请读者参阅有关资料。不过有两个关键问题需要提请读者注意,其一,对于声音这类非Windows传统资源,在加入动态库之前,需要用户自定义一个资源类型以存放这类资源,如笔者在DEMO.DLL中为Windows音频文件定义了WAVE资源类型;其二,动态库中每一个资源的资源名十分重要,它是调用资源的关键,建议用户最好在加入资源后为其定义一个有意义的资源名。<br> 通过上面介绍的资源动态库的简单制作方法,即使不熟悉C语言的读者也可以轻松地制作自己的资源动态库了。现在,让我们来看看如何在VB多媒体应用程序中调用资源动态库中的资源。VB本身并没有调用动态库的函数和语句,因此必须借助于Windows&nbsp;API函数。下面笔者将结合一个实例,具体介绍调用方法。实例中使用的是笔者通过上述方法制作的资源动态库DEMO.DLL,其中包含两个BITMAP(.bmp)类型资源B1和B2,两个WAVE(.wav)类型资源S1和S2。<br> 首先,新建一个VB工程,其中包含一个窗体Form1和一个模块Module1。在窗体Form1中加入了一个图片框控件Picture1和四个命令按钮控件,Picture1用于显示动态库中的位图资源,四个命令按钮的属性设置和功能含义如下表:<br> 属性&nbsp;功能<br> Name&nbsp;Index&nbsp;Caption&nbsp;<br> cmdBitmap&nbsp;0&nbsp;BitmapA&nbsp;在Picture1中显示DEMO.DLL中资源名为B1的位图资源<br> cmdBitmap&nbsp;1&nbsp;BitmapB&nbsp;在Picture1中显示DEMO.DLL中资源名为B2的位图资源<br> cmdSound&nbsp;0&nbsp;SoundA&nbsp;播放DEMO.DLL中资源名为S1的声音资源<br> cmdSound&nbsp;1&nbsp;SoundB&nbsp;播放DEMO.DLL中资源名为S2的声音资源<br> 接着在Module1和Form1中加入下列代码,便可完成实例程序:<br> ※Moudle1.bas清单<br> '声明API函数<br> Declare&nbsp;Function&nbsp;LoadLibrary%&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;lpLibFileName$)<br> Declare&nbsp;Sub&nbsp;FreeLibrary&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;hLibModule%)<br> Declare&nbsp;Function&nbsp;LoadBitmap%&nbsp;Lib&nbsp;"User"&nbsp;(ByVal&nbsp;hInstance%,&nbsp;ByVal&nbsp;lpBitmapName&nbsp;As&nbsp;Any)<br> Declare&nbsp;Function&nbsp;GetObj%&nbsp;Lib&nbsp;"GDI"&nbsp;Alias&nbsp;"GetObject"&nbsp;(ByVal&nbsp;hObject%,&nbsp;ByVal&nbsp;nCount%,&nbsp;lpObject&nbsp;As&nbsp;Any)<br> Declare&nbsp;Function&nbsp;CreateCompatibleDC%&nbsp;Lib&nbsp;"GDI"&nbsp;(ByVal&nbsp;hDC%)<br> Declare&nbsp;Function&nbsp;SelectObject%&nbsp;Lib&nbsp;"GDI"&nbsp;(ByVal&nbsp;hDC%,&nbsp;ByVal&nbsp;hObject%)<br> Declare&nbsp;Function&nbsp;BitBlt%&nbsp;Lib&nbsp;"GDI"&nbsp;(ByVal&nbsp;hDestDC%,&nbsp;ByVal&nbsp;x%,&nbsp;ByVal&nbsp;y%,&nbsp;ByVal&nbsp;nWidth%,&nbsp;ByVal&nbsp;nHeight%,&nbsp;ByVal&nbsp;hSrcDC%,&nbsp;ByVal&nbsp;XSrc%,&nbsp;ByVal&nbsp;YSrc%,&nbsp;ByVal&nbsp;dwRop&)<br> Declare&nbsp;Function&nbsp;DeleteDC%&nbsp;Lib&nbsp;"GDI"&nbsp;(ByVal&nbsp;hDC%)<br> Declare&nbsp;Function&nbsp;DeleteObject%&nbsp;Lib&nbsp;"GDI"&nbsp;(ByVal&nbsp;hObject%)<br> Declare&nbsp;Function&nbsp;FindResource%&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;hInstance%,&nbsp;ByVal&nbsp;lpName$,&nbsp;ByVal&nbsp;lpType&nbsp;As&nbsp;Any)<br> Declare&nbsp;Function&nbsp;LockResource&&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;hResData%)<br> Declare&nbsp;Function&nbsp;LoadResource%&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;hInstance%,&nbsp;ByVal&nbsp;hResInfo%)<br> Declare&nbsp;Function&nbsp;GlobalUnlock%&nbsp;Lib&nbsp;"Kernel"&nbsp;(ByVal&nbsp;hMem%)<br> Declare&nbsp;Function&nbsp;sndPlaySound%&nbsp;Lib&nbsp;"MMSYSTEM"&nbsp;(ByVal&nbsp;lpszSoundName&nbsp;As&nbsp;Any,&nbsp;ByVal&nbsp;uFlags%)<br> '位图数据结构类型<br> Type&nbsp;BITMAP<br> bmType&nbsp;As&nbsp;Integer<br> bmWidth&nbsp;As&nbsp;Integer<br> bmHeight&nbsp;As&nbsp;Integer<br> bmWidthBytes&nbsp;As&nbsp;Integer<br> bmPlanes&nbsp;As&nbsp;String&nbsp;*&nbsp;1<br> bmBitsPixel&nbsp;As&nbsp;String&nbsp;*&nbsp;1<br> bmBits&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> '光栅操作代码常量<br> Public&nbsp;Const&nbsp;SRCCOPY&nbsp;=&nbsp;&HCC0020<br> '声音播放状态常量<br> Public&nbsp;Const&nbsp;SND_SYNC&nbsp;=&nbsp;&H0<br> Public&nbsp;Const&nbsp;SND_MEMORY&nbsp;=&nbsp;&H4</内容> 
      </数据>
    - <数据>
      <名称>在VB应用程序中巧用DLL下</名称> 
      <类别>VBDll</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:31:41</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>应用程序</关键字1> 
      <关键字2>DLL</关键字2> 
      <关键字3>NULL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>'调用位图资源子例程<br> Sub&nbsp;load_pic(picName&nbsp;As&nbsp;String)<br> Dim&nbsp;hDLL&nbsp;As&nbsp;Integer<br> Dim&nbsp;hdcMemory,&nbsp;hLoadedbitmap,&nbsp;hOldBitmap&nbsp;As&nbsp;Integer<br> Dim&nbsp;retVal&nbsp;As&nbsp;Integer<br> Dim&nbsp;bmpInfo&nbsp;As&nbsp;BITMAP<br> '安装动态链接库DEMO.DLL<br> hDLL&nbsp;=&nbsp;LoadLibrary(App.Path&nbsp;&&nbsp;"\DEMO.DLL")<br> '根据资源名从动态链接库中加载相应的位图资源<br> hLoadedbitmap&nbsp;=&nbsp;LoadBitmap(hDLL,&nbsp;picName)<br> '获取位图信息<br> retVal&nbsp;=&nbsp;GetObj(hLoadedbitmap,&nbsp;Len(bmpInfo),&nbsp;bmpInfo)<br> '创建一个与图片框控件的设备描述表兼容的内存设备描述表<br> hdcMemory&nbsp;=&nbsp;CreateCompatibleDC(Form1.Picture1.hDC)<br> '将位图选入内存设备描述表<br> hOldBitmap&nbsp;=&nbsp;SelectObject(hdcMemory,&nbsp;hLoadedbitmap)<br> '将位图从内存设备描述表中拷入图片框控件的设备描述表中<br> retVal&nbsp;=&nbsp;BitBlt(Form1.Picture1.hDC,&nbsp;0,&nbsp;0,&nbsp;bmpInfo.bmWidth,&nbsp;bmpInfo.bmHeight,&nbsp;hdcMemory,&nbsp;0,&nbsp;0,&nbsp;SRCCOPY)<br> '将原始位图选入内存设备描述表<br> retVal&nbsp;=&nbsp;SelectObject(hdcMemory,&nbsp;hOldBitmap)<br> '删除加载的位图,释放其占用的所有系统资源<br> retVal&nbsp;=&nbsp;DeleteObject(hLoadedbitmap)<br> '删除内存设备描述表<br> retVal&nbsp;=&nbsp;DeleteDC(hdcMemory)<br> '释放动态链接库<br> FreeLibrary&nbsp;(hDLL)<br> End&nbsp;Sub<br> '调用声音资源子例程<br> Sub&nbsp;load_sound(wavName&nbsp;As&nbsp;String)<br> Dim&nbsp;hDLL&nbsp;As&nbsp;Integer<br> Dim&nbsp;hloadwave&nbsp;As&nbsp;Integer<br> Dim&nbsp;hwaveres&nbsp;As&nbsp;Integer<br> Dim&nbsp;hsound&nbsp;As&nbsp;Long<br> Dim&nbsp;hrelease&nbsp;As&nbsp;Integer<br> Dim&nbsp;resVal&nbsp;As&nbsp;Integer<br> hDLL&nbsp;=&nbsp;LoadLibrary(App.Path&nbsp;&&nbsp;"\DEMO.DLL")<br> '在动态链接库中查找资源类型为WAVE,资源名为wavName的资源<br> hwaveres&nbsp;=&nbsp;FindResource(hDLL,&nbsp;wavName,&nbsp;"WAVE")<br> '将该资源装入内存<br> hloadwave&nbsp;=&nbsp;LoadResource(hDLL,&nbsp;hwaveres)<br> '锁定该资源<br> hsound&nbsp;=&nbsp;LockResource(hloadwave)<br> '以同步方式播放内存中的声音资源<br> resVal&nbsp;=&nbsp;sndPlaySound(hsound,&nbsp;SND_SYNC&nbsp;+&nbsp;SND_MEMORY)<br> '释放该资源占用的内存<br> hrelease&nbsp;=&nbsp;GlobalUnlock(hloadwave)<br> FreeLibrary&nbsp;(hDLL)<br> End&nbsp;Sub<br> <br> ※FORM1.FRM代码清单<br> Private&nbsp;Sub&nbsp;cmdBitmap_Click(Index&nbsp;As&nbsp;Integer)<br> Picture1.Picture&nbsp;=&nbsp;LoadPicture("")&nbsp;'清空图片框控件<br> Select&nbsp;Case&nbsp;Index<br> Case&nbsp;0<br> load_pic&nbsp;("B1")<br> Case&nbsp;1<br> load_pic&nbsp;("B2")<br> End&nbsp;Select<br> End&nbsp;Sub<br> Private&nbsp;Sub&nbsp;cmdSound_Click(Index&nbsp;As&nbsp;Integer)<br> Select&nbsp;Case&nbsp;Index<br> Case&nbsp;0<br> load_sound&nbsp;("S1")<br> Case&nbsp;1<br> load_sound&nbsp;("S2")<br> End&nbsp;Select<br> End&nbsp;Sub<br> 本实例程序已在Windows&nbsp;3.X环境下通过测试。程序中的某些参数设置与特定需求(如资源动态库的内容等)有关,读者在开发实际应用时应做相应的改动。</内容> 
      </数据>
    - <数据>
      <名称>判断某一个连接是否保存在Cache中上</名称> 
      <类别>网络</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:11:10</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>连接</关键字1> 
      <关键字2>Cache</关键字2> 
      <关键字3>保存</关键字3> 
      <内容简介>在使用Microsoft&nbsp;IE在网上冲浪时,IE会把你浏览过的网页保存在Cache中以便你可以脱机浏览。下面这个程序可以判断一个URL是否在浏览器的Cache中。&nbsp;</内容简介> 
      <内容>判断某一个连接是否保存在Cache中&nbsp;<br> <br> 在使用Microsoft&nbsp;IE在网上冲浪时,IE会把你浏览过的网页保存在Cache中以便你可以脱机浏览。下面这个程序可以判断一个URL是否在浏览器的Cache中。&nbsp;<br> <br> 首先建立一个新的VB工程文件,在Form1中加入一个CommandButton控件和一个TextBox控件,然后在Form1的代码窗口中加入以下代码:&nbsp;<br> <br> <br> Option&nbsp;Explicit&nbsp;<br> <br> <br> Private&nbsp;Const&nbsp;ERROR_INSUFFICIENT_BUFFER&nbsp;=&nbsp;122&nbsp;<br> <br> Private&nbsp;Const&nbsp;eeErrorBase&nbsp;=&nbsp;26720&nbsp;<br> <br> <br> Private&nbsp;Type&nbsp;FILETIME&nbsp;<br> <br> dwLowDateTime&nbsp;As&nbsp;Long&nbsp;<br> <br> dwHighDateTime&nbsp;As&nbsp;Long&nbsp;<br> <br> End&nbsp;Type&nbsp;<br> <br> <br> Private&nbsp;Type&nbsp;INTERNET_CACHE_ENTRY_INFO&nbsp;<br> <br> dwStructSize&nbsp;As&nbsp;Long&nbsp;<br> <br> lpszSourceUrlName&nbsp;As&nbsp;String&nbsp;<br> <br> lpszLocalFileName&nbsp;As&nbsp;String&nbsp;<br> <br> CacheEntryType&nbsp;As&nbsp;String&nbsp;<br> <br> dwUseCount&nbsp;As&nbsp;Long&nbsp;<br> <br> dwHitRate&nbsp;As&nbsp;Long&nbsp;<br> <br> dwSizeLow&nbsp;As&nbsp;Long&nbsp;<br> <br> dwSizeHigh&nbsp;As&nbsp;Long&nbsp;<br> <br> LastModifiedTime&nbsp;As&nbsp;FILETIME&nbsp;<br> <br> ExpireTIme&nbsp;As&nbsp;FILETIME&nbsp;<br> <br> LastAccessTime&nbsp;As&nbsp;FILETIME&nbsp;<br> <br> LastSyncTime&nbsp;As&nbsp;FILETIME&nbsp;<br> <br> lpHeaderInfo&nbsp;As&nbsp;Long&nbsp;<br> <br> dwHeaderInfoSize&nbsp;As&nbsp;Long&nbsp;<br> <br> lpszFileExtension&nbsp;As&nbsp;String&nbsp;<br> <br> dwReserved&nbsp;As&nbsp;Long&nbsp;<br> <br> End&nbsp;Type&nbsp;<br> <br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;GetUrlCacheEntryInfo&nbsp;Lib&nbsp;"wininet.dll"&nbsp;Alias&nbsp;_&nbsp;<br> <br> "GetUrlCacheEntryInfoA"&nbsp;_&nbsp;<br> <br> (ByVal&nbsp;sUrlName&nbsp;As&nbsp;String,&nbsp;_&nbsp;<br> <br> lpCacheEntryInfo&nbsp;As&nbsp;Any,&nbsp;_&nbsp;<br> <br> lpdwCacheEntryInfoBufferSize&nbsp;As&nbsp;Long&nbsp;_&nbsp;<br> <br> )&nbsp;As&nbsp;Long&nbsp;<br> <br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_ALLOCATE_BUFFER&nbsp;=&nbsp;&H100&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_ARGUMENT_ARRAY&nbsp;=&nbsp;&H2000&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_FROM_HMODULE&nbsp;=&nbsp;&H800&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_FROM_STRING&nbsp;=&nbsp;&H400&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_FROM_SYSTEM&nbsp;=&nbsp;&H1000&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_IGNORE_INSERTS&nbsp;=&nbsp;&H200&nbsp;<br> <br> Private&nbsp;Const&nbsp;FORMAT_MESSAGE_MAX_WIDTH_MASK&nbsp;=&nbsp;&HFF&nbsp;<br> <br> <br> Private&nbsp;Declare&nbsp;Function&nbsp;FormatMessage&nbsp;Lib&nbsp;"kernel32"&nbsp;Alias&nbsp;"FormatMessageA"&nbsp;_&nbsp;<br> <br> (ByVal&nbsp;dwFlags&nbsp;As&nbsp;Long,&nbsp;lpSource&nbsp;As&nbsp;Any,&nbsp;ByVal&nbsp;dwMessageId&nbsp;As&nbsp;Long,&nbsp;_&nbsp;<br> <br> ByVal&nbsp;dwLanguageId&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpBuffer&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;nSize&nbsp;As&nbsp;_&nbsp;<br> <br> Long,&nbsp;Arguments&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> <br> <br> Public&nbsp;Function&nbsp;WinAPIError(ByVal&nbsp;lLastDLLError&nbsp;As&nbsp;Long)&nbsp;As&nbsp;String&nbsp;<br> <br> Dim&nbsp;sBuff&nbsp;As&nbsp;String&nbsp;<br> <br> Dim&nbsp;lCount&nbsp;As&nbsp;Long&nbsp;<br> <br> <br> ’获取错误消息&nbsp;<br> <br> sBuff&nbsp;=&nbsp;String$(256,&nbsp;0)&nbsp;<br> <br> lCount&nbsp;=&nbsp;FormatMessage(&nbsp;_&nbsp;<br> <br> FORMAT_MESSAGE_FROM_SYSTEM&nbsp;Or&nbsp;FORMAT_MESSAGE_IGNORE_INSERTS,&nbsp;_&nbsp;<br> <br> 0,&nbsp;lLastDLLError,&nbsp;0&,&nbsp;sBuff,&nbsp;Len(sBuff),&nbsp;ByVal&nbsp;0)&nbsp;<br> <br> If&nbsp;lCount&nbsp;Then&nbsp;<br> <br> WinAPIError&nbsp;=&nbsp;Left$(sBuff,&nbsp;lCount)&nbsp;<br> <br> End&nbsp;If&nbsp;<br> <br> End&nbsp;Function&nbsp;</内容> 
      </数据>
    - <数据>
      <名称>判断某一个连接是否保存在Cache中下</名称> 
      <类别>网络</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;17:11:17</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>连接</关键字1> 
      <关键字2>Cache</关键字2> 
      <关键字3>保存</关键字3> 
      <内容简介>在使用Microsoft&nbsp;IE在网上冲浪时,IE会把你浏览过的网页保存在Cache中以便你可以脱机浏览。下面这个程序可以判断一个URL是否在浏览器的Cache中。&nbsp;</内容简介> 
      <内容>Public&nbsp;Function&nbsp;GetCacheEntryInfo(ByVal&nbsp;hWnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpszUrl&nbsp;As&nbsp;String)&nbsp;As&nbsp;Boolean&nbsp;<br> <br> Dim&nbsp;dwEntrySize&nbsp;As&nbsp;Long&nbsp;<br> <br> Dim&nbsp;lpCacheEntry&nbsp;As&nbsp;INTERNET_CACHE_ENTRY_INFO&nbsp;<br> <br> Dim&nbsp;dwTemp&nbsp;As&nbsp;Long&nbsp;<br> <br> Dim&nbsp;lErr&nbsp;As&nbsp;Long&nbsp;<br> <br> <br> If&nbsp;(GetUrlCacheEntryInfo(lpszUrl,&nbsp;ByVal&nbsp;0&,&nbsp;dwEntrySize))&nbsp;=&nbsp;0&nbsp;Then&nbsp;<br> <br> lErr&nbsp;=&nbsp;Err.LastDllError&nbsp;<br> <br> If&nbsp;(lErr&nbsp;<>&nbsp;ERROR_INSUFFICIENT_BUFFER)&nbsp;Then&nbsp;<br> <br> ’URL没有在Cache中&nbsp;<br> <br> Err.Raise&nbsp;eeErrorBase&nbsp;+&nbsp;1,&nbsp;App.EXEName&nbsp;&&nbsp;".mCacheEntry",&nbsp;WinAPIError(lErr)&nbsp;<br> <br> GetCacheEntryInfo&nbsp;=&nbsp;False&nbsp;<br> <br> Exit&nbsp;Function&nbsp;<br> <br> Else&nbsp;<br> <br> ’URL保存在Cache中&nbsp;<br> <br> GetCacheEntryInfo&nbsp;=&nbsp;True&nbsp;<br> <br> End&nbsp;If&nbsp;<br> <br> End&nbsp;If&nbsp;<br> <br> End&nbsp;Function&nbsp;<br> <br> <br> Private&nbsp;Sub&nbsp;Command1_Click()&nbsp;<br> <br> On&nbsp;Error&nbsp;GoTo&nbsp;ErrorHandler&nbsp;<br> <br> If&nbsp;(GetCacheEntryInfo(Me.hWnd,&nbsp;Text1.Text))&nbsp;Then&nbsp;<br> <br> MsgBox&nbsp;"URL&nbsp;保存在Cache中.",&nbsp;vbInformation&nbsp;<br> <br> Else&nbsp;<br> <br> MsgBox&nbsp;"URL&nbsp;没有保存在Cache中.",&nbsp;vbInformation&nbsp;<br> <br> End&nbsp;If&nbsp;<br> <br> <br> Exit&nbsp;Sub&nbsp;<br> <br> <br> ErrorHandler:&nbsp;<br> <br> MsgBox&nbsp;"URL&nbsp;没有保存在Cache中&nbsp;["&nbsp;&&nbsp;Err.Description&nbsp;&&nbsp;"]",&nbsp;vbInformation&nbsp;<br> <br> End&nbsp;Sub&nbsp;<br> <br> <br> <br> Private&nbsp;Sub&nbsp;Form_Load()&nbsp;<br> <br> Form1.CurrentX&nbsp;=&nbsp;150:&nbsp;Form1.CurrentY&nbsp;=&nbsp;60&nbsp;<br> <br> Form1.Print&nbsp;"在Text1中输入URL,按Command1检测"&nbsp;<br> <br> Text1.Text&nbsp;=&nbsp;""&nbsp;<br> <br> Command1.Default&nbsp;=&nbsp;True&nbsp;<br> <br> End&nbsp;Sub&nbsp;<br> <br> <br> 运行程序,在TextBox中输入URL地址(例如http://member.netease.com/~blackcat),然后点击Command1&nbsp;<br> <br> 按钮,如果URL在Cache中,程序会弹出消息框显示URL&nbsp;保存在Cache中</内容> 
      </数据>
      

  6.   

    <数据>
      <名称>用VB制作IE工具条自定义按钮上</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;14:59:22</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>IE</关键字1> 
      <关键字2>按钮</关键字2> 
      <关键字3>工具条</关键字3> 
      <内容简介>用VB制作IE工具条自定义按钮<br> 作者:西安市含光门外中原小区1号楼3单元702(710068)&nbsp;张庆&nbsp;</内容简介> 
      <内容>现在,有许多软件安装后会在&nbsp;IE&nbsp;浏览器的工具条上添加一个自定义按钮,为用户运行程序提供了方便,如“网络蚂蚁”、“金山词霸2000”等等。实际上添加这个自定义按钮并不难,只要找到了它在注册表中的位置和有关参数,通过手工或程序都可以轻易完成。而最方便的办法就是调用现成的&nbsp;ActiveX&nbsp;控件来完成这个功能,但&nbsp;Windows&nbsp;似乎没有提供这种控件。下面介绍如何开发和使用这种自定义控件。&nbsp;<br> 实现方法&nbsp;<br> 要添加这种自定义按钮,需要在&nbsp;Windows&nbsp;注册表的&nbsp;HKEY_LOCAL_MACHINE\Software\Microsoft\Internet&nbsp;Explorer\Extensions&nbsp;子键下建立一个&nbsp;GUID&nbsp;项,然后在注册表的右栏建立相应的参数并赋值。这些参数及其含义如下:&nbsp;<br> ●ButtonText:自定义按钮上显示的文本字符串;&nbsp;<br> ●Clsid:IE&nbsp;工具条的类标识码,为“{1FBA04EE-3024-11D2-8F1F0000F87ABD16}”;&nbsp;<br> ●Default&nbsp;Visible:自定义按钮是否可见,一般为&nbsp;“Yes";&nbsp;<br> ●Exec:自定义按钮执行的目标,为可执行文件或超文本链接等;&nbsp;<br> ●HotIcon:鼠标移上按钮时显示的图标,一般取自&nbsp;EXE&nbsp;文件或&nbsp;DLL&nbsp;文件;&nbsp;<br> ●Icon:按钮正常显示的图标,一般取自&nbsp;EXE&nbsp;文件或&nbsp;DLL&nbsp;文件;&nbsp;<br> ●MenuText:在&nbsp;IE&nbsp;的“工具”菜单中显示的菜单项;&nbsp;<br> ●MenuStatusBar:IE的“工具”菜单项的注释,在状态条上显示。&nbsp;<br> 制作过程&nbsp;<br> 在&nbsp;VB&nbsp;5.0/6.0&nbsp;下建立新的“ActiveX&nbsp;控件”工程。&nbsp;<br> 首先,给控件&nbsp;AddButton&nbsp;的&nbsp;Picture&nbsp;属性添加一个微型&nbsp;Icon&nbsp;图片,这样当使用该控件时,会在控件工具箱上显示这个小图标。然后,再在设计窗口上放置一个&nbsp;image&nbsp;控件,给它也设置一个小图片,使用该控件时,会在其&nbsp;Form&nbsp;上显示该控件的外观。最后,调出代码编辑窗口,在该窗口中键入以下代码,其中&nbsp;API&nbsp;函数调用的代码可以直接从“API&nbsp;文本浏览器”中获得。&nbsp;<br> Option&nbsp;Explicit&nbsp;<br> ……'Default&nbsp;Property&nbsp;Values&nbsp;<br> ……'Property&nbsp;Variables&nbsp;<br> '定义常量&nbsp;<br> Const&nbsp;HKEY_LOCAL_MACHINE&nbsp;=&nbsp;&H80000002&nbsp;<br> Const&nbsp;REG_SZ&nbsp;=&nbsp;1&nbsp;<br> '声明存取注册表的&nbsp;API&nbsp;函数&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegCloseKey&nbsp;Lib&nbsp;“advapi32.dll"&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegCreateKey&nbsp;Lib&nbsp;“advapi32.dll"&nbsp;Alias&nbsp;“RegCreateKeyA"&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpSubKey&nbsp;As&nbsp;String,&nbsp;phkResult&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegDeleteValue&nbsp;Lib&nbsp;“advapi32.dll"&nbsp;Alias&nbsp;“RegDeleteValueA"&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpValueName&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegOpenKey&nbsp;Lib&nbsp;“advapi32.dll"&nbsp;Alias&nbsp;“RegOpenKeyA"&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpSubKey&nbsp;As&nbsp;String,&nbsp;phkResult&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;<br> Private&nbsp;Declare&nbsp;Function&nbsp;RegSetValueEx&nbsp;Lib&nbsp;“advapi32.dll"&nbsp;Alias&nbsp;“RegSetValueExA"&nbsp;(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lpValueName&nbsp;As&nbsp;String,ByVal&nbsp;Reserved&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwType&nbsp;As&nbsp;Long,&nbsp;lpData&nbsp;As&nbsp;Any,&nbsp;ByVal&nbsp;cbData&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long&nbsp;</内容> 
      </数据>
    - <数据>
      <名称>用VB制作IE工具条自定义按钮下</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;14:59:31</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>IE</关键字1> 
      <关键字2>按钮</关键字2> 
      <关键字3>工具条</关键字3> 
      <内容简介>用VB制作IE工具条自定义按钮<br> 作者:西安市含光门外中原小区1号楼3单元702(710068)&nbsp;张庆&nbsp;</内容简介> 
      <内容>'定义注册表中的主键、子键&nbsp;<br> Const&nbsp;hKey&nbsp;=&nbsp;HKEY_LOCAL_MACHINE&nbsp;<br> Const&nbsp;subKey0=“Software\Microsoft\Internet&nbsp;Explorer\Extensions\"&nbsp;<br> ’把字符串值存入注册表&nbsp;<br> Private&nbsp;Sub&nbsp;SaveString(hKey&nbsp;As&nbsp;Long,&nbsp;strPath&nbsp;As&nbsp;String,&nbsp;strValue&nbsp;As&nbsp;String,&nbsp;strdata&nbsp;As&nbsp;String)&nbsp;<br> Dim&nbsp;keyhand&nbsp;As&nbsp;Long&nbsp;<br> Dim&nbsp;r&nbsp;As&nbsp;Long&nbsp;<br> r=RegCreateKey(hKey,&nbsp;strPath,&nbsp;keyhand)&nbsp;<br> r=RegSetValueEx(keyhand,&nbsp;strValue,&nbsp;0,REG_SZ,&nbsp;ByVal&nbsp;strdata,&nbsp;Len(strdata))&nbsp;<br> r=RegCloseKey(keyhand)&nbsp;<br> End&nbsp;Sub&nbsp;<br> ’从注册表中删除字符串值&nbsp;<br> Private&nbsp;Function&nbsp;DeleteValue(ByVal&nbsp;hKey&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;strPath&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;strValue&nbsp;As&nbsp;String)&nbsp;<br> Dim&nbsp;r,&nbsp;keyhand&nbsp;As&nbsp;Long&nbsp;<br> r&nbsp;=&nbsp;RegOpenKey(hKey,&nbsp;strPath,&nbsp;keyhand)&nbsp;<br> r&nbsp;=&nbsp;RegDeleteValue(keyhand,&nbsp;strValue)&nbsp;<br> r&nbsp;=&nbsp;RegCloseKey(keyhand)&nbsp;<br> End&nbsp;Function&nbsp;<br> '把设置写入注册表,定义按钮&nbsp;<br> Public&nbsp;Sub&nbsp;AddBtn2IEtoolbar()&nbsp;<br> Dim&nbsp;subKey&nbsp;As&nbsp;String&nbsp;<br> subKey&nbsp;=&nbsp;subKey0&nbsp;&&nbsp;Trim(GUID)&nbsp;&&nbsp;“\"&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“ButtonText",&nbsp;ButtonText)&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,“Clsid",&nbsp;<br> “{1FBA04EE-3024-11D2-8F1F0000F87ABD16}")&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“Default&nbsp;Visible",&nbsp;“Yes")&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“Exec",&nbsp;Exec)&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“HotIcon",&nbsp;HotIcon)&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“Icon",&nbsp;Icon)&nbsp;<br> Call&nbsp;SaveString(hKey,&nbsp;subKey,&nbsp;“MenuStatusBar",&nbsp;<br> MenuStatusBar)&nbsp;<br> Call&nbsp;SaveString(hKey,subKey,“MenuText",&nbsp;MenuText)End&nbsp;Sub&nbsp;<br> '从注册表中删除自定义按钮&nbsp;<br> Public&nbsp;Sub&nbsp;DelBtnFromIEtoolbar()&nbsp;<br> Dim&nbsp;subKey&nbsp;As&nbsp;String&nbsp;<br> subKey&nbsp;=&nbsp;subKey0&nbsp;&&nbsp;Trim(GUID)&nbsp;&&nbsp;“\"&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“ButtonText")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“Clsid")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“Default&nbsp;Visible")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“Exec")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“HotIcon")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“Icon")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“MenuStatusBar")&nbsp;<br> Call&nbsp;DeleteValue(hKey,&nbsp;subKey,&nbsp;“MenuText")&nbsp;<br> End&nbsp;Sub&nbsp;<br> '初始化控件属性&nbsp;<br> Private&nbsp;Sub&nbsp;UserControl_InitProperties()&nbsp;<br> m_ButtonText&nbsp;=&nbsp;m_def_ButtonText&nbsp;<br> m_Exec&nbsp;=&nbsp;m_def_Exec&nbsp;<br> m_HotIcon&nbsp;=&nbsp;m_def_HotIcon&nbsp;<br> m_Icon&nbsp;=&nbsp;m_def_Icon&nbsp;<br> m_MenuText&nbsp;=&nbsp;m_def_MenuText&nbsp;<br> m_MenuStatusBar&nbsp;=&nbsp;m_def_MenuStatusBar&nbsp;<br> m_GUID&nbsp;=&nbsp;m_def_GUID&nbsp;<br> End&nbsp;Sub&nbsp;<br> '从存储器中加载属性值&nbsp;<br> Private&nbsp;Sub&nbsp;UserControl_ReadProperties(PropBag&nbsp;As&nbsp;PropertyBag)&nbsp;<br> m_ButtonText&nbsp;=&nbsp;PropBag.ReadProperty&nbsp;<br> (“ButtonText",&nbsp;m_def_ButtonText)&nbsp;<br> m_Exec&nbsp;=&nbsp;PropBag.ReadProperty(“Exec",&nbsp;<br> m_def_Exec)&nbsp;<br> m_HotIcon&nbsp;=&nbsp;PropBag.ReadProperty(“HotIcon",&nbsp;<br> m_def_HotIcon)&nbsp;<br> m_Icon&nbsp;=&nbsp;PropBag.ReadProperty(“Icon",&nbsp;<br> m_def_Icon)&nbsp;<br> m_MenuText&nbsp;=&nbsp;PropBag.ReadProperty&nbsp;<br> (“MenuText",m_def_MenuText)&nbsp;<br> m_MenuStatusBar&nbsp;=PropBag.ReadProperty&nbsp;<br> (“MenuStatusBar",&nbsp;m_def_MenuStatusBar)&nbsp;<br> m_GUID&nbsp;=PropBag.ReadProperty(“GUID",&nbsp;<br> m_def_GUID)&nbsp;<br> End&nbsp;Sub</内容> 
      </数据>
    - <数据>
      <名称>使用VB设计具有动感的命令图标栏</名称> 
      <类别>界面</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:00:57</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>图标</关键字1> 
      <关键字2>动感</关键字2> 
      <关键字3>命令</关键字3> 
      <内容简介>使用VB设计具有「动感」的命令图标栏<br> 作者:张嵘&nbsp;</内容简介> 
      <内容>我们在使用Word、Excel等Windows应用程序时,经常会见到在程序界面顶端有一行“立体式”图标按钮。当用鼠标按下某一个图标按钮时,程序就执行相应的操作。这一行“立体式”图标按钮通常就称作命令图标栏或工具条。命令图标栏一般提供一些最常用的命令,供用户快速地取用,并且它设计时采用了“立体式”按钮,操作时会产生凹下去和凸出来的“动感”,笔者这里就谈谈如何用VB来建立具有“动感”的命令图标栏。<br> 使命令图标具有“动感”是依靠对命令图标的不同状态的图像切换来获得的。当鼠标按下时,图标显示为凹入状态的图像;当松开时,图标显示为凸出状态的图像。通过图像切换就使命令图标具有了“动感”,具体设计步骤如下:<br> 1首先在窗体中创建一个图片框(Picture&nbsp;Box),将其Align属性置为1,使图片框固定在窗体上端,调节其宽度使其能安置图像或命令按钮。<br> 2在图标框内创建若干个图像框(Image&nbsp;Control),设置其Autosize=True,Picture属性在程序运行中设置。<br> 3编写程序代码。这里假设某个命令图标凸出状态的图像文件名为"zrup.bmp",凹入状态的图像文件名为"zrdown.bmp"。<br> 窗体装入时:Sub&nbsp;form-load()<br> Imagel.picture=Loadpicture("zrup.bmp")&nbsp;'&nbsp;命令图标凸出<br> End&nbsp;sub<br> 鼠标按下时:Sub&nbsp;Imagel-mousedown(Button&nbsp;As&nbsp;Integer&nbsp;Shift&nbsp;As&nbsp;Integer,&nbsp;X&nbsp;As&nbsp;single,Y&nbsp;As&nbsp;single)<br> Imagel.picture=Loadpicture("zrdown.bmp")&nbsp;'&nbsp;命令图标如下:<br> End&nbsp;sub<br> 鼠标松开时:Sub&nbsp;Imagel-mouseup(Button&nbsp;As&nbsp;Integer,Shift&nbsp;As&nbsp;Integer,X&nbsp;As&nbsp;single,Y&nbsp;As&nbsp;single)Imagel.picture=Loadpicture("zrup.bmp")&nbsp;'&nbsp;命令图标凸出<br> End&nbsp;sub<br> 以上只能使命令图标具备凹下去的功能,但当在按鼠标按钮不放,并拖曳鼠标使光标移到外头,原来图标仍然处于凹下状态。要使其自动凸起,就要编写如下代码:<br> Sub&nbsp;Imagel-mouseup(Button&nbsp;As&nbsp;Integer,Shift&nbsp;As&nbsp;Integer,X&nbsp;As&nbsp;single,Y&nbsp;As&nbsp;single)<br> Select&nbsp;Case&nbsp;Button<br> Case&nbsp;1<br> If&nbsp;X<=0&nbsp;or&nbsp;X>Imagel.Width&nbsp;or&nbsp;Y<=0&nbsp;or&nbsp;Y>Imagel.Height&nbsp;then&nbsp;Imagel.picture=Loadpicture("zrup.bmp")&nbsp;'凸出<br> else<br> Imagel.picture=Loadpicture("zrdown.bmp")&nbsp;'凹入<br> End&nbsp;if<br> End&nbsp;select<br> End&nbsp;sub<br> 通过以上三步骤就可以建立具有“动感”的命令图标,若具有多个命令图标时,可通过创建图像控制数组来实现。BMP是常见的一种图像格式,也可以使用VB提供的丰富的不同状态的命令图标位图文件,它在VB的子目录\bitmaps\中</内容> 
      </数据>
    - <数据>
      <名称>直接通过ODBCAPI访问SQL数据库一</名称> 
      <类别>数据库</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:11:10</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ODBC</关键字1> 
      <关键字2>API</关键字2> 
      <关键字3>SQL</关键字3> 
      <内容简介 /> 
      <内容>*********************************<br> ODBC&nbsp;-&nbsp;Open&nbsp;DataBase&nbsp;Connectivity<br> *********************************<br> <br> Basic&nbsp;Steps<br> <br> Connecting&nbsp;to&nbsp;the&nbsp;SQL&nbsp;Server&nbsp;DataBase&nbsp;for&nbsp;retrieving&nbsp;information&nbsp;from&nbsp;tables<br> <br> <br> *************************************************************<br> The&nbsp;steps&nbsp;1&nbsp;-&nbsp;3&nbsp;are&nbsp;for&nbsp;connecting&nbsp;to&nbsp;the&nbsp;SQL&nbsp;Server&nbsp;Database<br> *************************************************************<br> <br> <br> 1.&nbsp;Allocate&nbsp;ODBC&nbsp;Environment&nbsp;Handle<br> <br> If&nbsp;SQLAllocEnv(glEnv)&nbsp;<>&nbsp;0&nbsp;Then<br>   MsgBox&nbsp;"Unable&nbsp;to&nbsp;initialize&nbsp;ODBC&nbsp;API&nbsp;drivers!"<br>   End<br> End&nbsp;If<br> ______________________________________________________________<br> <br> 2.&nbsp;Allocate&nbsp;ODBC&nbsp;Database&nbsp;Handle<br> <br> Dim&nbsp;iStatus&nbsp;As&nbsp;Integer<br> <br> If&nbsp;SQLAllocConnect(glEnv,&nbsp;glDbc)&nbsp;<>&nbsp;0&nbsp;Then<br>   MsgBox&nbsp;"Could&nbsp;not&nbsp;allocate&nbsp;memory&nbsp;for&nbsp;connection&nbsp;Handle!"<br>   ODBCInit&nbsp;=&nbsp;False<br> <br>   '&nbsp;Free&nbsp;the&nbsp;Environment<br>   iStatus&nbsp;=&nbsp;SQLFreeEnv(lEnv)<br> <br>   If&nbsp;iStatus&nbsp;=&nbsp;SQL_ERROR&nbsp;Then<br>     MsgBox&nbsp;"Error&nbsp;Freeing&nbsp;Environment&nbsp;From&nbsp;ODBC&nbsp;Drivers"<br>   End&nbsp;If<br> <br>   '&nbsp;Quit&nbsp;the&nbsp;Application<br>   End<br> End&nbsp;If<br> ______________________________________________________________&nbsp;<br> <br> 3.&nbsp;Connect&nbsp;using&nbsp;the&nbsp;sConnect&nbsp;string&nbsp;-&nbsp;SQLDriverConnect<br> <br> Dim&nbsp;sResult&nbsp;As&nbsp;String<br> Dim&nbsp;iSize&nbsp;As&nbsp;Integer<br> Dim&nbsp;sConnect&nbsp;As&nbsp;String<br> <br> sConnect&nbsp;=&nbsp;"DSN="&nbsp;&&nbsp;gsDSN&nbsp;&&nbsp;";UID="&nbsp;&&nbsp;gsLoginID&nbsp;&&nbsp;";PWD="&nbsp;&&nbsp;gsPassword&nbsp;&&nbsp;";APP="&nbsp;&&nbsp;gsAppCode&nbsp;&&nbsp;";DATABASE="&nbsp;&&nbsp;gsDatabase<br> <br> If&nbsp;SQLDriverConnect(glDbc,&nbsp;Screen.ActiveForm.hWnd,&nbsp;sConnect,&nbsp;Len(sConnect),&nbsp;sResult,&nbsp;Len(sResult),&nbsp;iSize,&nbsp;0)&nbsp;<=&nbsp;0&nbsp;Then<br>   MsgBox&nbsp;"Could&nbsp;not&nbsp;establish&nbsp;connection&nbsp;to&nbsp;ODBC&nbsp;driver!"<br> End&nbsp;If<br> ______________________________________________________________<br> <br> <br> ***************************************************<br> The&nbsp;steps&nbsp;4&nbsp;-&nbsp;8&nbsp;are&nbsp;for&nbsp;retrieving&nbsp;data&nbsp;from&nbsp;tables<br> ***************************************************<br> <br> <br> 4.&nbsp;Allocate&nbsp;ODBC&nbsp;Statement&nbsp;Handle<br> <br> If&nbsp;SQLAllocStmt(glDbc,&nbsp;glStmt)&nbsp;<>&nbsp;0&nbsp;Then<br> <br>    MsgBox&nbsp;"Could&nbsp;not&nbsp;allocate&nbsp;memory&nbsp;for&nbsp;a&nbsp;statement&nbsp;handle!"<br> <br> End&nbsp;If<br> ______________________________________________________________<br> <br> 5.&nbsp;Execute&nbsp;ODBC&nbsp;Statement&nbsp;-&nbsp;SQLExecDirect<br> <br> Dim&nbsp;lRet&nbsp;As&nbsp;Long,&nbsp;lErrNo&nbsp;As&nbsp;Long<br> Dim&nbsp;iLen&nbsp;As&nbsp;Integer<br> Dim&nbsp;sSQLState&nbsp;As&nbsp;String&nbsp;*&nbsp;MAX_DATA_BUFFER<br> Dim&nbsp;sErrorMsg&nbsp;As&nbsp;String&nbsp;*&nbsp;MAX_DATA_BUFFER<br> Dim&nbsp;sMsg&nbsp;As&nbsp;String<br> <br> sSQL&nbsp;=&nbsp;"SELECT&nbsp;name,&nbsp;location&nbsp;FROM&nbsp;authors"<br> <br> If&nbsp;SQLExecDirect(glStmt,&nbsp;sSQL,&nbsp;Len(sSQL))&nbsp;<>&nbsp;SQL_SUCCESS&nbsp;Then<br>   '&nbsp;Also&nbsp;Check&nbsp;for&nbsp;ODBC&nbsp;Error&nbsp;message&nbsp;-&nbsp;SQLError<br>   lRet&nbsp;=&nbsp;SQLError(glEnv,&nbsp;gldbc,&nbsp;glStmt,&nbsp;sSQLState,&nbsp;lErrNo,&nbsp;sErrorMsg,&nbsp;MAX_DATA_BUFFER,&nbsp;iLen)<br>   sMsg&nbsp;=&nbsp;"Error&nbsp;Executing&nbsp;SQL&nbsp;Statement"&nbsp;&&nbsp;Chr$(13)&nbsp;&&nbsp;Chr$(10)<br>   sMsg&nbsp;=&nbsp;sMsg&nbsp;&&nbsp;"ODBC&nbsp;State&nbsp;=&nbsp;"&nbsp;&&nbsp;Trim$(Left$(sSQLState,&nbsp;InStr(sSQLState,&nbsp;Chr$(0))&nbsp;-&nbsp;1))&nbsp;&&nbsp;Chr$(13)&nbsp;&&nbsp;Chr$(10)<br>   sMsg&nbsp;=&nbsp;sMsg&nbsp;&&nbsp;"ODBC&nbsp;Error&nbsp;Message&nbsp;=&nbsp;"&nbsp;&&nbsp;Left$(sErrorMsg,&nbsp;iLen)<br>   MsgBox&nbsp;sMsg,&nbsp;vbInformation,&nbsp;"Execute&nbsp;Query"<br> End&nbsp;If<br> ______________________________________________________________<br> <br> 6.&nbsp;Fetch&nbsp;one&nbsp;row&nbsp;of&nbsp;results&nbsp;from&nbsp;executed&nbsp;ODBC&nbsp;Statement&nbsp;-&nbsp;SQLFetch<br> <br> Code&nbsp;in&nbsp;Step&nbsp;7.<br> ______________________________________________________________</内容> 
      </数据>
    - <数据>
      <名称>直接通过ODBCAPI访问SQL数据库二</名称> 
      <类别>数据库</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:10:29</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ODBC</关键字1> 
      <关键字2>API</关键字2> 
      <关键字3>SQL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>7.&nbsp;Get&nbsp;the&nbsp;Data&nbsp;in&nbsp;each&nbsp;field&nbsp;of&nbsp;the&nbsp;Fetched&nbsp;row&nbsp;-&nbsp;SQLGetData<br> <br> Dim&nbsp;bPerform&nbsp;As&nbsp;Integer,&nbsp;iStatus&nbsp;As&nbsp;Integer<br> Dim&nbsp;sData&nbsp;As&nbsp;String&nbsp;*&nbsp;MAX_DATA_BUFFER<br> Dim&nbsp;lOutLen&nbsp;As&nbsp;Long<br> <br> bPerform&nbsp;=&nbsp;SQLFetch(glStmt)<br> <br> Do&nbsp;While&nbsp;bPerform<br>   bPerform&nbsp;=&nbsp;SQLFetch(lStmt)    &nbsp;'&nbsp;Get&nbsp;the&nbsp;next&nbsp;row&nbsp;of&nbsp;data<br>   If&nbsp;bPerform&nbsp;=&nbsp;SQL_SUCCESS&nbsp;Then    ‘&nbsp;If&nbsp;rows&nbsp;of&nbsp;data&nbsp;available  &nbsp;<br>     bPerform&nbsp;=&nbsp;True<br> <br>     '&nbsp;Get&nbsp;Author&nbsp;Name&nbsp;- iColumn&nbsp;=&nbsp;1&nbsp;for&nbsp;first&nbsp;field&nbsp;i.e.&nbsp;name&nbsp;in&nbsp;sSQL&nbsp;<br>     iStatus&nbsp;=&nbsp;SQLGetData(glStmt,&nbsp;iColumn,&nbsp;1,&nbsp;sData,&nbsp;MAX_DATA_BUFFER,&nbsp;lOutLen)<br> <br>     '&nbsp;lOutlen&nbsp;=&nbsp;length&nbsp;of&nbsp;the&nbsp;valid&nbsp;data&nbsp;in&nbsp;sData<br>     '&nbsp;Data&nbsp;value&nbsp;will&nbsp;be&nbsp;=&nbsp;Left$(sData,&nbsp;lOutlen), lOutlen&nbsp;=&nbsp;-1&nbsp;if&nbsp;no&nbsp;data&nbsp;or&nbsp;Null&nbsp;data<br> <br>     '&nbsp;Get&nbsp;Location&nbsp;- iColumn&nbsp;=&nbsp;2&nbsp;for&nbsp;second&nbsp;field&nbsp;i.e.&nbsp;location&nbsp;in&nbsp;sSQL<br>     iStatus&nbsp;=&nbsp;SQLGetData(glStmt,&nbsp;iColumn,&nbsp;1,&nbsp;sData,&nbsp;MAX_DATA_BUFFER,&nbsp;lOutLen)<br> <br>     &nbsp;'&nbsp;Add&nbsp;the&nbsp;Field&nbsp;Data&nbsp;to&nbsp;Correponding&nbsp;Data&nbsp;Display&nbsp;Controls&nbsp;for&nbsp;this&nbsp;row<br>   Else<br>     bPerform&nbsp;=&nbsp;False  '&nbsp;No&nbsp;more&nbsp;rows&nbsp;available<br>   End&nbsp;If<br> Loop<br> <br> 'Release&nbsp;the&nbsp;ODBC&nbsp;Statement&nbsp;Handle<br> bPerform&nbsp;=&nbsp;SQLFreeStmt(glStmt,&nbsp;SQL_DROP)<br> ______________________________________________________________<br> <br> 8.&nbsp;Release&nbsp;the&nbsp;ODBC&nbsp;Statement&nbsp;Handle&nbsp;-&nbsp;SQLFreeSTmt<br> <br> Code&nbsp;in&nbsp;Step&nbsp;7.<br> ______________________________________________________________<br> <br> *******************************************************************<br> The&nbsp;steps&nbsp;9&nbsp;-&nbsp;11&nbsp;are&nbsp;for&nbsp;Disconnecting&nbsp;from&nbsp;the&nbsp;SQL&nbsp;Server&nbsp;DataBase<br> *******************************************************************<br> <br> <br> 9.&nbsp;Disconnect&nbsp;from&nbsp;ODBC&nbsp;Database&nbsp;-&nbsp;SQLDisconnect<br> <br> iStatus&nbsp;=&nbsp;SQLDisconnect(glDbc)<br> ______________________________________________________________<br> <br> 10.&nbsp;Release&nbsp;the&nbsp;ODBC&nbsp;Database&nbsp;Handle&nbsp;-&nbsp;SQLFreeConnect<br> <br> iStatus&nbsp;=&nbsp;SQLFreeConnect(glDbc)<br> ______________________________________________________________<br> <br> 11.&nbsp;Release&nbsp;the&nbsp;ODBC&nbsp;Environment&nbsp;Handle&nbsp;-&nbsp;SQLFreeEnv<br> <br> iStatus&nbsp;=&nbsp;SQLFreeEnv(glEnv)<br> ______________________________________________________________&nbsp;<br> <br> ***********************************************************************<br> The&nbsp;following&nbsp;entries&nbsp;are&nbsp;required&nbsp;in&nbsp;the&nbsp;ODBCAPI&nbsp;module<br> ***********************************************************************<br> <br> '&nbsp;ODBC&nbsp;Variables&nbsp;and&nbsp;Constants<br>  <br> Global&nbsp;glEnv&nbsp;As&nbsp;Long<br> Global&nbsp;glDbc&nbsp;As&nbsp;Long<br> Global&nbsp;sSQL&nbsp;As&nbsp;String<br>  <br> Global&nbsp;Const&nbsp;MAX_DATA_BUFFER&nbsp;=&nbsp;255<br> Global&nbsp;Const&nbsp;SQL_SUCCESS&nbsp;=&nbsp;0<br> Global&nbsp;Const&nbsp;SQL_SUCCESS_WITH_INFO&nbsp;=&nbsp;1<br> Global&nbsp;Const&nbsp;SQL_ERROR&nbsp;=&nbsp;-1<br> Global&nbsp;Const&nbsp;SQL_NO_DATA_FOUND&nbsp;=&nbsp;100<br> Global&nbsp;Const&nbsp;SQL_CLOSE&nbsp;=&nbsp;0<br> Global&nbsp;Const&nbsp;SQL_DROP&nbsp;=&nbsp;1<br> Global&nbsp;Const&nbsp;SQL_CHAR&nbsp;=&nbsp;1<br> Global&nbsp;Const&nbsp;SQL_NUMERIC&nbsp;=&nbsp;2<br> Global&nbsp;Const&nbsp;SQL_DECIMAL&nbsp;=&nbsp;3<br> Global&nbsp;Const&nbsp;SQL_INTEGER&nbsp;=&nbsp;4<br> Global&nbsp;Const&nbsp;SQL_SMALLINT&nbsp;=&nbsp;5<br> Global&nbsp;Const&nbsp;SQL_FLOAT&nbsp;=&nbsp;6<br> Global&nbsp;Const&nbsp;SQL_REAL&nbsp;=&nbsp;7<br> Global&nbsp;Const&nbsp;SQL_DOUBLE&nbsp;=&nbsp;8<br> Global&nbsp;Const&nbsp;SQL_VARCHAR&nbsp;=&nbsp;12<br> Global&nbsp;Const&nbsp;SQL_DATA_SOURCE_NAME&nbsp;=&nbsp;6<br> Global&nbsp;Const&nbsp;SQL_USER_NAME&nbsp;=&nbsp;8<br> <br> <br> 'ODBC&nbsp;Declarations<br> 'The&nbsp;hWnd&nbsp;is&nbsp;a&nbsp;Long&nbsp;in&nbsp;Windows&nbsp;95&nbsp;&&nbsp;Windows&nbsp;NT</内容> 
      </数据>
    - <数据>
      <名称>直接通过ODBCAPI访问SQL数据库三</名称> 
      <类别>数据库</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:10:56</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ODBC</关键字1> 
      <关键字2>API</关键字2> 
      <关键字3>SQL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容>#If&nbsp;Win32&nbsp;Then<br>   Declare&nbsp;Function&nbsp;SQLAllocEnv&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(env&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLFreeEnv&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLAllocConnect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long,&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLConnect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Server&nbsp;As&nbsp;String,ByVal&nbsp;serverlen&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;uid&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;  uidlen&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;pwd&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;pwdlen&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLDriverConnect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;szCSIn&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbCSIn&nbsp;As&nbsp;  Integer,ByVal&nbsp;szCSOut&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbCSMax&nbsp;As&nbsp;Integer,&nbsp;cbCSOut&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;f&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLFreeConnect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLDisconnect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLAllocStmt&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;lStmt&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLFreeStmt&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;EndOption&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLTables&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;q&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbq&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;o&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbo&nbsp;As&nbsp;Integer,&nbsp;  ByVal&nbsp;t&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbt&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;tt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbtt&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLExecDirect&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;sqlString&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;sqlstrlen&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLNumResultCols&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;NumCols&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLDescribeCol&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;colnum&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;colname&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;Buflen&nbsp;As&nbsp;  Integer,&nbsp;colnamelen&nbsp;As&nbsp;Integer,&nbsp;dtype&nbsp;As&nbsp;Integer,&nbsp;dl&nbsp;As&nbsp;Long,&nbsp;ds&nbsp;As&nbsp;Integer,&nbsp;n&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLFetch&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLGetData&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;col&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;wConvType&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;lpbBuf&nbsp;As&nbsp;String,&nbsp;  ByVal&nbsp;dwbuflen&nbsp;As&nbsp;Long,&nbsp;lpcbout&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLGetInfo&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;szInfo&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbInfoMax&nbsp;As&nbsp;Integer,&nbsp;  cbInfoOut&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLError&nbsp;Lib&nbsp;"odbc32.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;SQLState&nbsp;As&nbsp;String,&nbsp;NativeError&nbsp;As&nbsp;  Long,&nbsp;ByVal&nbsp;Buffer&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;Buflen&nbsp;As&nbsp;Integer,&nbsp;Outlen&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br> #Else<br></内容> 
      </数据>
    - <数据>
      <名称>直接通过ODBCAPI访问SQL数据库四</名称> 
      <类别>数据库</类别> 
      <数据来源>NULL</数据来源> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:11:03</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>ODBC</关键字1> 
      <关键字2>API</关键字2> 
      <关键字3>SQL</关键字3> 
      <内容简介>NULL</内容简介> 
      <内容><br>   Declare&nbsp;Function&nbsp;SQLAllocEnv&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(env&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLFreeEnv&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLAllocConnect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long,&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLConnect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;Server&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;serverlen&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;uid&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;  uidlen&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;pwd&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;pwdlen&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLDriverConnect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWnd&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;szCSIn&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbCSIn&nbsp;As&nbsp;Integer,&nbsp;  ByVal&nbsp;szCSOut&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbCSMax&nbsp;As&nbsp;Integer,&nbsp;cbCSOut&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;f&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLFreeConnect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLDisconnect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLAllocStmt&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;lStmt&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLFreeStmt&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;EndOption&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLTables&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;q&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbq&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;o&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbo&nbsp;As&nbsp;Integer,&nbsp;  ByVal&nbsp;t&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbt&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;tt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;cbtt&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLExecDirect&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;sqlString&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;sqlstrlen&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLNumResultCols&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;NumCols&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLDescribeCol&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;colnum&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;colname&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;Buflen&nbsp;As&nbsp;Integer,&nbsp;  colnamelen&nbsp;As&nbsp;Integer,&nbsp;dtype&nbsp;As&nbsp;Integer,&nbsp;dl&nbsp;As&nbsp;Long,&nbsp;ds&nbsp;As&nbsp;Integer,&nbsp;n&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLFetch&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br>   Declare&nbsp;Function&nbsp;SQLGetData&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;col&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;wConvType&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;lpbBuf&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;  dwbuflen&nbsp;As&nbsp;Long,&nbsp;lpcbout&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLGetInfo&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hWnd&nbsp;As&nbsp;Integer,&nbsp;ByVal&nbsp;szInfo&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;cbInfoMax&nbsp;As&nbsp;  Integer,cbInfoOut&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br>   Declare&nbsp;Function&nbsp;SQLError&nbsp;Lib&nbsp;"odbc.dll"&nbsp;(ByVal&nbsp;env&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;ldbc&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;lStmt&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;SQLState&nbsp;As&nbsp;String,&nbsp;NativeError&nbsp;As&nbsp;  Long,&nbsp;ByVal&nbsp;Buffer&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;Buflen&nbsp;As&nbsp;Integer,&nbsp;Outlen&nbsp;As&nbsp;Integer)&nbsp;As&nbsp;Integer<br> <br> #End&nbsp;If</内容> 
      </数据>
    - <数据>
      <名称>功能强大的SendMessage函数上</名称> 
      <类别>VB文件</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:14:03</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>SendMessag</关键字1> 
      <关键字2>函数</关键字2> 
      <关键字3>API</关键字3> 
      <内容简介 /> 
      <内容><br> Windows&nbsp;API(应用程序接口)是Windows系列软件为程序开发人员提供的火力强大的“武器库”,在这个武器库中,有很多极具威力的武器,SendMessage就是其中之一,它的功能非常丰富,灵活使用这个函数,会给编程工作带来很多便利。本文以Visual&nbsp;Basic为例,结合几个具体的例子介绍该函数的功能。<br> 一、SendMeaasge函数简介<br> &nbsp;&nbsp;&nbsp;顾名思义,SendMessage函数的功能是“发送消息”,即将一条消息发送到指定对象(操作系统、窗口或控件等)上,以产生特定的动作(如滚屏、修改对象外观等)。<br> SendMessage函数在VB中的函数说明如下:<br> Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(Byval&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;Byval&nbsp;wMsg&nbsp;As&nbsp;Long,Byval&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> 其中四个自变量的含义和说明如下:<br> hWnd:对象的句柄。希望将消息传送给哪个对象,就把该对象的句柄作为实参传送,在VB中可以简单地用“对象.hWnd”获得某个对象的句柄,如Text1.hWnd和Form1.hWnd分别可以得到Text1和Form1的句柄。<br> wMsg:被发送的消息。根据具体需求和不同的对象,将不同的消息作为实参传送,以产生预期的动作。<br> wParam、lParam:附加的消息信息。这两个是可选的参数,用来提供关于wMsg消息更多的信息,不同的wMsg可能使用这两个参数中的0、1或2个,如果不需要哪个附加参数,则将实参赋为NULL(在VB中赋为0)。<br> 在简单了解了SendMessage函数的格式和功能后,让我们以几个例子来看看它的威力。<br> 二、SendMessage函数使用实例<br> 例1&nbsp;&nbsp;多行TextBox中的快速处理功能在处理多行TextBox时我们经常会碰到以下几种情况:<br> &nbsp;&nbsp;&nbsp;希望了解多行TextBox中目前共有多少行文字。<br> &nbsp;&nbsp;&nbsp;想快速返回第N行的文字。<br> &nbsp;&nbsp;&nbsp;对于上面的情况,如果用VB自身的语句或函数来实现的话,要写不短的代码,而且由于要采用顺序查找的办法来完成,因此代码的执行效率也很低。如果使用SendMessage函数则可以大大减少代码量,并大幅度的提高执行效率。<br> &nbsp;&nbsp;&nbsp;用SendMessage函数完成上面两个任务的方法非常简单,每个任务只需简单地发送一条消息给多行TextBox即可,两个消息分别为:EM_GETLINECOUNT、EM_GETLINE,其它参数和返回值见附表。<br> &nbsp;&nbsp;&nbsp;下面用一个简单的实例演示这两个功能:<br> 新建工程,在Form1上添加三个TextBox(名称分别为Text1、txtLineCount、TxtString,将Text1的Multi<br> Line属性置为True)、三个标签和一个命令按钮。为工程添加一个模块Moudle1,在其中写如下声明(其中<br> SendMessage函数的声明可以从VB的“API浏览器”中复制):&nbsp;消息常量名&nbsp;消息值&nbsp;wParam&nbsp;lParam&nbsp;返回值&nbsp;<br> EM_GETLINECOUNT&nbsp;&HBA&nbsp;未用&nbsp;未用&nbsp;行数&nbsp;<br> EM_GETLINE&nbsp;&HC4&nbsp;要找的行号&nbsp;存结果的字节串&nbsp;结果字节串的字节数&nbsp;<br> <br> Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> Public&nbsp;Const&nbsp;EM_GETLINECOUNT=&HBA<br> Public&nbsp;Const&nbsp;EM_GETLINE=&HC4<br> 在Form1的代码模块中写如下代码:<br> &nbsp;&nbsp;&nbsp;&nbsp;Private&nbsp;Sub&nbsp;Command1_Click()<br> &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;str(256)&nbsp;As&nbsp;Byte<br> &nbsp;&nbsp;&nbsp;&nbsp;str(1)=1&nbsp;'最大允许存放256个字符<br> &nbsp;&nbsp;&nbsp;&nbsp;'获取总行数,结果显示在文本框txtLineCount中<br> &nbsp;&nbsp;&nbsp;&nbsp;txtlineCount=SendMessage(Text1.hwnd,EM_GETLINECOUNT,0,0)<br> &nbsp;&nbsp;&nbsp;&nbsp;'获取第3行的数据放在str中,转换为字符串后显示在文本框txtString中<br> &nbsp;&nbsp;&nbsp;&nbsp;SendMessage&nbsp;Text1.hwnd,EM_GETLINE,2,str(0)<br> &nbsp;&nbsp;&nbsp;&nbsp;txtString=&nbsp;StrConv(str,vbUnicode)<br> End&nbsp;Sub<br> &nbsp;&nbsp;&nbsp;之后,按F5运行程序,在多行文本框中随便键入几行文字,然后按下[确定]按钮,出现如图画面,说明程序正确统计出了总行数和第3行的文字。<br> 两点补充说明:在调用SendMessage获取第N行字符串时,lParam需要说明为字节数组,在调用完成后,再将字节数组转换为字符串;另外,调用前必须在lParam的前两个字节指明允许存放的最大长度,其中第一个字节为低位,第二个字节为高位,本例将高位(即str(1))置1.说明最大允许存放256个字符。</内容> 
      </数据>
    - <数据>
      <名称>功能强大的SendMessage函数中</名称> 
      <类别>VB文件</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:14:10</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>SendMessag</关键字1> 
      <关键字2>函数</关键字2> 
      <关键字3>API</关键字3> 
      <内容简介 /> 
      <内容>例2&nbsp;&nbsp;程序控制拉下或收起组合框的下拉列来<br> &nbsp;&nbsp;&nbsp;一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。<br> &nbsp;&nbsp;&nbsp;在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)。<br> &nbsp;&nbsp;&nbsp;为说明具体的使用方法,下面提供简单的程序片段。首先在代码模块中做如下声明:<br> Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,ByVal&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> Const&nbsp;CB_SHOWDROPDOWN=&H14F<br> &nbsp;&nbsp;&nbsp;当程序中某处需要拉下组合框Combol的列表时,写如下调用语句:<br> SendMessage&nbsp;Combol.hwnd,CB_SHOWDROPDOWN,True,0<br> &nbsp;&nbsp;&nbsp;当需要收起组合框Combol的列表时,写如下语句:<br> SendMessage&nbsp;Combol.hwnd,CB_SHOWDROPDOWNN,False,0<br> 例3&nbsp;&nbsp;在列表框中查找匹配的项目<br> &nbsp;&nbsp;&nbsp;在Win95风格的帮助系统中一般都有一个“索引”页,索引页含有一个文本框和一个列表框,当用户在文本框中输入文字时,下拉列表会动态地显示与文本框中文字最匹配的项目,为用户提供了最大的方便。这种效果在应用程序的帮助系统中很容易实现(只要按照Win95帮助系统的正常制作过程制作就可以实现),如果想在应用程序的其它地方实现这种特性就需费一番心思了。<br> &nbsp;&nbsp;&nbsp;而使用SendMessage函数实现上述特性则非常简单,甚至只需一条语句就足够了,那就是在文本框的Change事件中给列表框发一条LB_FINDSTRING(&H18F)消息,该消息告诉列表框在列表中查找匹配的项目。<br> &nbsp;&nbsp;&nbsp;在发LB_FINDSTRING消息时,wParam参数代表从列表框的哪一个项目后面开始查找,一般情况下该参数可定为-1,表示从List1(0)即第一项开始向后循环查找,lParam则传进欲搜索的字符串(必须采用值传递)。<br> &nbsp;&nbsp;&nbsp;具体的代码和运行画面与后面的例4合并在一起演示。<br> 例4&nbsp;&nbsp;为ListBox添加水平滚动条<br> &nbsp;&nbsp;&nbsp;在VB中,列表框控件仅提供垂直滚动条,没有设置水平滚动条的能力,当某些项目的文本宽度较长时,超出列表框宽度部分的文本就无法显示出来,因此,很有必要为ListBox添加一个水平滚动条来方便操作。<br> &nbsp;&nbsp;&nbsp;为添加水平滚动条,只需发一条LB_SETHORIZONTALEXTENT(&H194)消息给列表框即可。发送消息时,wParam为滚动条的长度(以像素为单位,可通过计算得出准确的长度,也可随便给一个大于最大文本宽度的数字,如本例的250),lParam无用。下面是例3和例4合并在一起的代码和运行画面<br> Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,ByVal&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> Public&nbsp;Const&nbsp;LB_FINDSTRING=&H18F<br> Public&nbsp;Const&nbsp;LB_SETHORIZONTALEXTENT=&H194<br> Private&nbsp;Sub&nbsp;Form_Load()<br> List1.AddItem&nbsp;"软件"<br> List1.AddItem&nbsp;"电脑游戏"<br> List1.AddItem&nbsp;"电视机"<br> List1.AddItem&nbsp;"电视台"<br> List1.AddItem&nbsp;"电脑"<br> List1.AddItem&nbsp;"电脑游戏软件"<br> '下一句为列表框添加水平滚动条<br> SendMessage&nbsp;List1.hwnd,LB_SETHORIZONTALEXTENT,250,0<br> End&nbsp;Sub<br> Private&nbsp;Sub&nbsp;Text1_Change()<br> '注意!当lParam传入的是字符串时,必须用ByVal传递<br> List1.ListIndex&nbsp;=&nbsp;SendMessage(List1.hwnd,LB_FINDSTRING,-1,ByVal&nbsp;Text1.Text)<br> End&nbsp;Sub<br> 通过上面几个例子,想必您已经对SendMessage函数的强大功能有了初步的了解。事实上利用该函数我们还可以完成更多更好的任务,如控制文本框的自动滚屏、实现文字编辑过程中的Undo功能、操纵应用程序的窗体控制菜单等等,感兴趣的读者请参阅有关Windows&nbsp;API的资料。<br> 本文程序均用Visual&nbsp;Basic&nbsp;5.0企业版编写,在Pwin95环境下运行正常。</内容> 
      </数据>
    - <数据>
      <名称>设置树型列表控件的背景颜色标题行高度</名称> 
      <类别>界面</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:18:52</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>树型控件</关键字1> 
      <关键字2>背景颜色</关键字2> 
      <关键字3>标题行高度</关键字3> 
      <内容简介 /> 
      <内容>首先做如下的定义:<br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"Send&nbsp;MessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wParam&nbsp;As&nbsp;Long,ByVal&nbsp;lParam&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Const&nbsp;TV-FIRST&nbsp;=&nbsp;&H1100<br> Const&nbsp;TVM-SETBKCOLOR&nbsp;=&nbsp;TV_FIRST&nbsp;+&nbsp;29<br> 然后再作如下调用:<br> Call&nbsp;SendMessage(TreeView1.hwnd,&nbsp;TVM-SETBKCOLOR,&nbsp;0,&nbsp;RGB(255,&nbsp;0,&nbsp;0))<br> 上面的SendMessage调用将TreeView1的背景颜色设置为红色。<br> 大家可能注意到了。在上面的Sendmessage函数定义中,我们将lParam定义为&nbsp;ByVal&nbsp;lParam&nbsp;As&nbsp;Long,而不是象前面的那些范例那样定义为Any或者String类型,关于这个问题,我会在最后的一章中做介绍。<br> 2、设置树型列表控件标题行高度<br> 利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下:<br> 定义:<br> Const&nbsp;TV_FIRST&nbsp;=&nbsp;&H1100<br> Const&nbsp;TVM-SETITEMHEIGHT&nbsp;=&nbsp;TV_FIRST&nbsp;+&nbsp;27<br> Private&nbsp;Declare&nbsp;Function&nbsp;SendMessage&nbsp;Lib&nbsp;"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,ByVal&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> 调用:<br> CallSendMessage(TreeView1.hwnd,&nbsp;TVM-SETITEMHEIGHT,&nbsp;60,&nbsp;0)<br> 上面的代码将TreeView1的标题行高度设置到60像素高</内容> 
      </数据>
    - <数据>
      <名称>为树型列表控件中不同标题行设置不同提示</名称> 
      <类别>界面</类别> 
      <数据来源 /> 
      <来源时间>NULL</来源时间> 
      <保存时间>2002-01-08&nbsp;15:19:00</保存时间> 
      <删除>False</删除> 
      <删除时间>NULL</删除时间> 
      <关键字1>树型控件</关键字1> 
      <关键字2>标题行</关键字2> 
      <关键字3>提示</关键字3> 
      <内容简介 /> 
      <内容>在第一期的ListBox控件介绍中,我向大家介绍了如何为列表中的每一个标题行设置不同的提示(ToolTips),在这里为要向大家介绍如何为树型列表控件中的每一个标题设置不同的提示。<br> 同ListBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。而利用TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本。具体的范例代码如下:<br> Option&nbsp;Explicit&nbsp;Private&nbsp;Type&nbsp;TPoint<br> x&nbsp;As&nbsp;Long<br> y&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> Private&nbsp;Type&nbsp;TVHITTESTINFO<br> pt&nbsp;As&nbsp;TPoint<br> flags&nbsp;As&nbsp;Long<br> hItem&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> Private&nbsp;Type&nbsp;TVITEM<br> mask&nbsp;As&nbsp;Long<br> HTreeItem&nbsp;As&nbsp;Long<br> state&nbsp;As&nbsp;Long<br> stateMask&nbsp;As&nbsp;Long<br> pszText&nbsp;As&nbsp;Long<br> cchTextMax&nbsp;As&nbsp;Long<br> iImage&nbsp;As&nbsp;Long<br> iSelectedImage&nbsp;As&nbsp;Long<br> cChildren&nbsp;As&nbsp;Long<br> lParam&nbsp;As&nbsp;Long<br> End&nbsp;Type<br> Const&nbsp;TV-FIRST&nbsp;=&nbsp;&H1100<br> Const&nbsp;TVM_HITTEST&nbsp;=&nbsp;TV-FIRST&nbsp;+&nbsp;17<br> Const&nbsp;TVM_GETITEM&nbsp;=&nbsp;TV-FIRST&nbsp;+&nbsp;12<br> Const&nbsp;TVHT-ONITEMLABEL&nbsp;=&nbsp;&H4<br> Const&nbsp;TVIF-TEXT&nbsp;=&nbsp;&H1<br> Const&nbsp;GMEM-FIXED&nbsp;=&nbsp;&H0<br> Private&nbsp;Declare&nbsp;Function&nbsp;Send&nbsp;MessageRef&nbsp;Lib"user32"&nbsp;Alias&nbsp;"SendMessageA"&nbsp;(ByVal&nbsp;hwnd&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;wMsg&nbsp;As&nbsp;Long,ByVal&nbsp;wParam&nbsp;As&nbsp;Long,lParam&nbsp;As&nbsp;Any)&nbsp;As&nbsp;Long<br> Private&nbsp;Declare&nbsp;Sub&nbsp;CopyMemory&nbsp;Lib&nbsp;"kernel32"&nbsp;Alias&nbsp;"RtlMoveMemory"&nbsp;(ByVal&nbsp;Destination&nbsp;As&nbsp;String,ByVal&nbsp;Source&nbsp;As&nbsp;Long,ByVal&nbsp;Length&nbsp;As&nbsp;Long)<br> Private&nbsp;Declare&nbsp;Function&nbsp;GlobalAlloc&nbsp;Lib&nbsp;"kernel32"&nbsp;(ByVal&nbsp;wFlags&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;dwBytes&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Private&nbsp;Declare&nbsp;Function&nbsp;GlobalFree&nbsp;Lib&nbsp;"kernel32"&nbsp;(ByVal&nbsp;hMem&nbsp;As&nbsp;Long)&nbsp;As&nbsp;Long<br> Dim&nbsp;hItemPrv&nbsp;As&nbsp;Long<br> Private&nbsp;Sub&nbsp;Form_Load()<br> Dim&nbsp;ndX&nbsp;As&nbsp;Node<br> `加入若干Item<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add(,&nbsp;,&nbsp;"R",&nbsp;"Root")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("R",&nbsp;tvwChild,&nbsp;"Key1",&nbsp;"Node1")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("Key1",&nbsp;tvwChild,&nbsp;"SubKey1",&nbsp;"SubNode1")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("SubKey1",&nbsp;tvwChild,&nbsp;"SubKeys1",&nbsp;"SubNode1")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("Key1",&nbsp;tvwChild,&nbsp;"SubKey2",&nbsp;"SubNode2")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("Key1",&nbsp;tvwChild,&nbsp;"SubKey3",&nbsp;"SubNode3")<br> Set&nbsp;ndX&nbsp;=&nbsp;TreeView1.Nodes.Add("Key1",&nbsp;tvwChild,&nbsp;"SubKey4",&nbsp;"SubNode4")<br> End&nbsp;Sub<br> Private&nbsp;Sub&nbsp;TreeView1_MouseMove(Button&nbsp;As&nbsp;Integer,&nbsp;Shift&nbsp;As&nbsp;Integer,&nbsp;x&nbsp;As&nbsp;Single,&nbsp;y&nbsp;As&nbsp;Single)&nbsp;<br> Dim&nbsp;ptA&nbsp;As&nbsp;TPoint<br> Dim&nbsp;tf&nbsp;As&nbsp;TVHITTESTINFO<br> Dim&nbsp;tv&nbsp;As&nbsp;TVITEM<br> Dim&nbsp;hStr&nbsp;As&nbsp;Long<br> Dim&nbsp;hItem&nbsp;As&nbsp;Long<br> Dim&nbsp;astr&nbsp;As&nbsp;String&nbsp;*&nbsp;1024<br> Dim&nbsp;bstr<br> On&nbsp;Error&nbsp;GoTo&nbsp;errLab<br> `获得当前光标所在的位置坐标<br> ptA.x&nbsp;=&nbsp;Int(x&nbsp;/&nbsp;Screen.TwipsPerPixelX)<br> ptA.y&nbsp;=&nbsp;Int(y&nbsp;/&nbsp;Screen.TwipsPerPixelY)<br> tf.pt&nbsp;=&nbsp;ptA<br> tf.flags&nbsp;=&nbsp;TVHT_ONITEMLABEL<br> `获得光标所在的Item的句柄<br> hItem&nbsp;=&nbsp;SendMessageRef(TreeView1.hwnd,&nbsp;TVM_HITTEST,&nbsp;0,&nbsp;tf)<br> `如果未获得句柄或者同上一次是同一个Item的句柄则退出<br> If&nbsp;((hItem&nbsp;<=&nbsp;0)&nbsp;Or&nbsp;(hItem&nbsp;=&nbsp;hItemPrv))&nbsp;Then&nbsp;Exit&nbsp;Sub<br> hItemPrv&nbsp;=&nbsp;hItem<br> `分配一定的内存空间用以存储Item的标题<br> hStr&nbsp;=&nbsp;GlobalAlloc(GMEM-FIXED,&nbsp;1024)<br> If&nbsp;hStr&nbsp;>&nbsp;0&nbsp;Then<br> tv.mask&nbsp;=&nbsp;TVIF_TEXT&nbsp;<br> `获取标题文本<br> tv.HTreeItem&nbsp;=&nbsp;hItem<br> `Item句柄<br> tv.pszText&nbsp;=&nbsp;hStr<br> tv.cchTextMax&nbsp;=&nbsp;1023<br> `发送TVM_GETITEM获得标题文本<br> CallSendMessageRef(TreeView1.hwnd,&nbsp;TVM-GETITEM,&nbsp;0,&nbsp;tv)<br> `将标题文本拷贝到字符串astr中<br> CopyMemory&nbsp;astr,&nbsp;hStr,&nbsp;1024<br> bstr&nbsp;=&nbsp;Left$(astr,&nbsp;(InStr(astr,&nbsp;Chr(0))&nbsp;-&nbsp;1))<br> TreeView1.ToolTipText&nbsp;=&nbsp;bstr<br> `释放分配的内存空间<br> GlobalFree&nbsp;hStr<br> End&nbsp;If<br> Exit&nbsp;Sub<br> errLab:<br> Resume&nbsp;Next<br> End&nbsp;Sub<br> 运行上面的程序,当光标在TreeView1上面移动时,TreeView1的ToolTips就会根据光标所在的不同标题行而变动。<br> 以上程序在Win98、Win2000,VB6下运行通过</内容> 
      </数据>
    泪了,睡觉!