⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 49.asp

📁 ASPWeb数据库范例总览
💻 ASP
📖 第 1 页 / 共 4 页
字号:
<P><FONT SIZE=+0>Call SendMessage(Text1.hwnd, EM_LINESCROLL, 0&amp;, ByVal
-N ) ' 上卷</FONT>N行</P>

<P><FONT SIZE=+0>Call SendMessage(Text1.hwnd, EM_LINESCROLL, N, ByVal 0&amp;)
' 右卷</FONT>N列</P>

<P><FONT SIZE=+0>Call SendMessage(Text1.hwnd, EM_LINESCROLL, -N, ByVal
0&amp;) ' 左卷</FONT>N列</P>
</UL>

<P> </P>

<P>举例来说, 想要上卷 5 行右卷 3 列, 呼叫的叙述如下:</P>

<P> </P>

<UL>
<P><FONT SIZE=+0>Call SendMessage(Text1.hwnd, EM_LINESCROLL, 3&amp;, ByVal
-5&amp; )</FONT></P>
</UL>

<P> </P>

<H3><A NAME="Q13"></A>问题13:如何像一般的绘图软体一样填满某一区域的颜色?

<HR WIDTH="100%"></H3>

<P> </P>

<P>想要把某一区域填满成某一颜色, 可以呼叫 FloodFill API 函数, 此一函数含有以下四个参数:</P>

<P> </P>

<DIR>
<OL>
<LI>hDC:handle of DC, 有关 DC(Device Context) 的意义请参阅上上期的解说,
对 VB 的物件而言, Form 及 PictureBox 都具有名称为 hDC 的属性, 可據以呼叫
FloodFill 函数。</LI>

<LI>X, Y:座标位置, 但请注意, 单位是 pixel(像素)。</LI>

<LI>crColor:封闭区域的边框颜色。</LI>
</OL>

<P> </P>
</DIR>

<P>让笔者举例来说明以上参数 2、3、4 的设定方法, 参考图-3, 假设我们想填满某一方形区域,
则 (X, Y) 可以设定成区域内的任何一点, 而 crColor 则必须设定成边框的颜色,
假设边框颜色是黑色, 则设定值等於 RGB(0,0,0)(等於 0), 假设边框颜色是红色,
则设定值等於 RGB(255,0,0)。</P>

<P> </P>

<CENTER><P><A HREF="49-3.gif">图-3 FloodFill 的参数意义</A></P></CENTER>

<CENTER><P> </P></CENTER>

<P>虽然 FloodFill 是填满区域的函数, 但单纯呼叫此一函数并不能填满区域,
因为 Windows GDI 规定, 填满区域之前必须先设定 brush(图刷)物件给 DC 才可以,
而 brush 物件的颜色就成为填满的颜色。为了建立 brush 物件, 并且设定给 DC,
我们必须这麼做:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim hBrush As Long</FONT></P>

<P><FONT SIZE=+0>hBrush = CreateSolidBrush(颜色设定值</FONT>) ' 建立 brush
物件</P>

<P><FONT SIZE=+0>Call SelectObject(hDC, hBrush) ' 将</FONT> brush 物件设定给
DC</P>

<P><FONT SIZE=+0>' 接著再呼叫</FONT> FloodFill, 例如:</P>

<P><FONT SIZE=+0>Call FloodFill(hDC, X, Y, RGB(0, 0, 0))</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>有关实际范例, 您可以参阅笔者所完成的 runpc49h.frm 表单, 如图-4, 使用此一表单时,
只要选取颜色, 再以滑鼠选取欲填满颜色的区域, 即可看到 FloodFill 执行的结果,
在此范例中, 请注意一件事情:笔者将表单的 ScaleMode 属性设定成 &quot;3-像素&quot;,
因为 FloodFill 的 (X, Y) 参数是以像素为座标单位。</P>

<P> </P>

<CENTER><P><A HREF="49-4.gif">图-4 FloodFill 范例程式</A></P></CENTER>

<P> </P>

<H3><A NAME="Q14"></A>问题14:如何读取磁碟的空间及可用空间? 
<HR WIDTH="100%"></H3>

<P> </P>

<P>读取磁碟的空间及可用空间需呼叫 GetDiskFreeSpace API 函数, 此一函数含有
5 个参数, 意义如下:</P>

<P> </P>

<DIR>
<OL>
<LI>RootPathName:磁碟机根目录, 以 C: 为例, 必须写成 &quot;C:\&quot;,
不可以写成 &quot;C:&quot; 或 &quot;C&quot;。</LI>

<LI>SectorsPerCluster:每一丛集的磁轨数。</LI>

<LI>BytesPerSector:每一磁轨的位元组数。</LI>

<LI>NumberOfFreeClusters:可用的丛集数。</LI>

<LI>TotalNumberOfClusters:总丛集数。</LI>
</OL>
</DIR>

<P> </P>

<P>而计算磁碟空间(位元组数)的公式等於=(每一磁轨的位元组数×每一丛集的磁轨数×丛集数),
所以求取磁碟空间与可用空间的程式如下:(以 C: 为例)</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim Sectors As Long, Bytes As Long, Free As Long, Total
As Long</FONT></P>

<P><FONT SIZE=+0>Dim FreeKB As Long, TotalKB As Long</FONT></P>

<P><FONT SIZE=+0>Call GetDiskFreeSpace(&quot;C:\&quot;, Sectors, Bytes,
Free, Total)</FONT></P>

<P><FONT SIZE=+0>FreeKB = Bytes * Sectors * Free \ 1024 ' 可用空间</FONT>,
以 KB 为单位</P>

<P><FONT SIZE=+0>TotalKB = Bytes * Sectors * Total \ 1024 ' 总空间</FONT>,
以 KB 为单位</P>

<P> </P>
</DIR>
</DIR>

<H3><A NAME="Q15"></A>问题15:将表单缩小时, 希望它的图示显示在工作列的右下角。

<HR WIDTH="100%"></H3>

<P> </P>

<P>最後来一题超难的, 但问此一问题的读者很多。</P>

<P> </P>

<CENTER><P><A HREF="49-5.gif">图-5 将程式缩到右下角, 可能吗?</A></P></CENTER>

<P> </P>

<P>基本上, 表单缩小後只有一个归宿─「开始」功能表右边的工作列, 要缩到右下角,
别想。但为什麼有的程式可以缩到右下角呢?其实右下角的图示都不是表单或程式,
对 Windows 来说, 它只是一个图示, 而想建立此一图示, 方法是呼叫 Shell_NotifyIconA
API 函数, 如下:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim nid As NOTIFYICONDATA</FONT></P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(NIM_ADD, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>呼叫 Shell_NotifyIconA 之前, 必须间填好 NOTIFYICONDATA 资料结构(如以上的
nid 变数)的内容, 而 NOTIFYICONDATA 各资料成员的意义如下:</P>

<P> </P>

<UL>
<OL>
<LI>cbSize:需填入 NOTIFYICONDATA 资料结构的长度。</LI>

<LI>hWnd:handle of window, 例如设定成 Form1.hWnd。</LI>

<LI>uID:使用者为图示所设定的 ID。</LI>

<LI>uFlags:用来设定以下三个参数(uCallbackMessage、hIcon、szTip)是否有效,
通常设定成 (NIF_MESSAGE + NIF_ICON + NIF_TIP) 表示全部有效。</LI>

<LI>uCallbackMessage:将来使用者在图示上按下滑鼠时, Windows 會以讯息通知视窗程序,
而此一参数为讯息之编号。</LI>

<LI>hIcon:图示。</LI>

<LI>szTip:提示讯息。</LI>
</OL>
</UL>

<P> </P>

<P>以上共有 7 个资料成员, 看起来挺吓人的, 别担心, 这几个资料成员很容易设定,
首先让笔者举个最简单的例子:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim nid As NOTIFYICONDATA</FONT></P>

<P><FONT SIZE=+0>nid.cbSize = Len(nid) ' 取资料结构的长度设定给 cbSize</FONT></P>

<P><FONT SIZE=+0>nid.hWnd = Me.hWnd ' 设定成表单的 hWnd</FONT></P>

<P><FONT SIZE=+0>nid.uID = 9999 ' 取一个编号, 可自订</FONT></P>

<P><FONT SIZE=+0>nid.uFlags = NIF_ICON ' NIF_ICON 表示设定图示</FONT></P>

<P><FONT SIZE=+0>nid.hIcon = Me.hIcon ' 设定成表单的图示</FONT></P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(NIM_ADD, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>结果执行之後, Me(目前表单) 的图示就會出现在工作列的右下角(以下简称工作列),
您可以直接参阅笔者所完成的范例, 以检视程式执行的结果。在以上的设定中 uID
必须取一个唯一的编号, 将来我们若要从工作列除去此一图示, Windows 會比对此一
uID 与 hWnd, 所以除去的方法如下:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim nid As NOTIFYICONDATA</FONT></P>

<P><FONT SIZE=+0>nid.cbSize = Len(nid)</FONT></P>

<P><FONT SIZE=+0>nid.hWnd = Me.hWnd</FONT></P>

<P><FONT SIZE=+0>nid.uID = 9999</FONT></P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(<B>NIM_DELETE</B>, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>笔者的习惯是将 nid 宣告成全域变数, 所以执行 Shell_NotifyIconA(NIM_ADD,
nid) 之後, nid 资料结构會保存 uID 及 hWnd 的值, 所以接下来不必再设定
nid 的资料成员, 即可直接呼叫 Shell_NotifyIconA(NIM_DELETE, nid), 笔者的范例程式就是这麼写的。</P>

<P> </P>

<P><B><U><FONT COLOR="#0000FF"><FONT SIZE=+1>设定「提示讯息」</FONT></FONT></U></B></P>

<P> </P>

<CENTER><P><A HREF="49-6.gif">图-6 滑鼠移到图示上面會出现「提示讯息」</A></P></CENTER>

<P> </P>

<P>参考图-6, 当我们把滑鼠移到图示上面时, 有些图示还會显示「提示讯息」,
这是怎麼办到的呢?直接来看程式:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>nid.cbSize = Len(nid)</FONT></P>

<P><FONT SIZE=+0>nid.hWnd = Me.hWnd</FONT></P>

<P><FONT SIZE=+0>nid.uID = 9998</FONT></P>

<P><FONT SIZE=+0>nid.uFlags = NIF_ICON + NIF_TIP ' 增加「提示讯息」的设定</FONT></P>

<P><FONT SIZE=+0>nid.hIcon = Me.Icon</FONT></P>

<P><FONT SIZE=+0>nid.szTip = &quot;学</FONT> VB 找王国荣&quot; + Chr(0)</P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(NIM_ADD, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>首先 uFlags 资料成员要加上 NIF_TIP, 而 szTip 资料成员则设定成提示讯息,
请注意此一提示讯息的最後应加上 Chr(0), 否则提示讯息的最後會多出很多空白字元。</P>

<P> </P>

<P><B><U><FONT COLOR="#0000FF"><FONT SIZE=+1>图示的修改</FONT></FONT></U></B></P>

<P> </P>

<P>Shell_NotifyIconA 函数除了可用来建立及删除图示之外, 也可以修改图示,
例如以下程式可以将 uID = 9998 图示的提示讯息由「学 VB 找王国荣」改成「学
Visual Basic 找王国荣」:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>nid.hWnd = Me.hWnd</FONT></P>

<P><FONT SIZE=+0>nid.uID = 9998</FONT></P>

<P><FONT SIZE=+0>nid.uFlags = NIF_ICON + NIF_TIP</FONT></P>

<P><FONT SIZE=+0>nid.szTip = &quot;学</FONT> Visual Basic 找王国荣&quot;
+ Chr(0)</P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(NIM_MODIFY, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P><B><U><FONT COLOR="#0000FF"><FONT SIZE=+1>接收 Windows 的讯息</FONT></FONT></U></B></P>

<P> </P>

<P>想想, 我们在工作列里面建立图示有什麼用呢?首先, 假设我们将 Form1 的图示设定到工作列中,
那麼接下来可以利用以下叙述让 Form1 不會显示在正规的工作列中:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Form1.Hide</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>因为右下角的工作列比较不占空间, 对於一些处理「背景」(background)工作的表单而言,
这确实是个不错的表现方式, 以数據机、印表机…为例, 就采用此一表现方式,
而有意思的是, 数據机(或印表机)状态改变时, 程式也會利用 Shell_NotifyIconA(NIM_MODIFY,
nid) 改变图示, 让使用者感觉到程式有在执行。</P>

<P> </P>

<P>以数據机或印表机为例, 当我们在图示上面按下滑鼠时, 它们都會开启视窗,
这又是如何办到的呢?笔者稍早说过, 工作列的图示只是图示, 不是视窗, 因此无法接收「按下滑鼠」的讯息,
而实际上, 当使用者在工作列的图示按下滑鼠时, 收到讯息的是 Windows 的 Shell
程式, 为了让 Shell 程式能够将按下滑鼠的讯息转送给我们的视窗, 在建立图示时,
必须这麼做:</P>

<P> </P>

<DIR>
<DIR>
<P><FONT SIZE=+0>Dim nid As NOTIFYICONDATA</FONT></P>

<P><FONT SIZE=+0>nid.cbSize = Len(nid)</FONT></P>

<P><FONT SIZE=+0>nid.hWnd = Me.hWnd</FONT></P>

<P><FONT SIZE=+0>nid.uID = 9997</FONT></P>

<P><FONT SIZE=+0>nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE</FONT></P>

<P><FONT SIZE=+0>nid.hIcon = Me.hIcon</FONT></P>

<P><FONT SIZE=+0>nid.szTip = &quot;学</FONT> VB 找王国荣&quot; + Chr(0)</P>

<P><FONT SIZE=+0>nid.uCallbackMessage = 讯息编号</FONT></P>

<P><FONT SIZE=+0>Call Shell_NotifyIconA(NIM_ADD, nid)</FONT></P>

<P> </P>
</DIR>
</DIR>

<P>主要的变动有二:(1) uFlags 资料成员必须增加 NIF_MESSAGE (2) 把希望 Shell
传送过来的讯息编号设定给 uCallbackMessage 资料成员, 例如设定成 99999,
则将来使用者在工作列的图示按下滑鼠时(包含单按及双按), 视窗程序都會收到
99999 的讯息。</P>

<P> </P>

<P>但故事还没结束, 收到 Shell 传来讯息的是「视窗程序」, 不是「事件程序」,
所以想要处理 Shell 传来的讯息, 必须撰写视窗程序, 这下子又要应用到上一期所介绍的「Windows
的讯息系统」了。</P>

<P> </P>

<P>接著让笔者来说明视窗程序如何处理 Shell 所传来的讯息, 就架构部分, 与上一期介绍的视窗程序完全相同,
而 Msg、wParam、及 lParam 等几个参数的意义则如下:</P>

<P> </P>

<UL>
<OL>
<LI>Msg:将等於 nid.uCallbackMessage 资料成员的设定值。</LI>

<LI>wParam:将等於 nid.uID 资料成员的设定值。</LI>

<LI>lParam:将等於滑鼠的讯息, 其中最常使用的是 WM_LBUTTONDOWN(按下滑鼠左钮)
及 WM_LBUTTONDBLCLK(双按滑鼠左钮)。</LI>
</OL>

<P> </P>

<P>因此视窗程序的架构大致如下:</P>

<P> </P>

<DIR>
<P><FONT SIZE=+0>Function WndProcForIcon(ByVal hWnd As Long, ByVal Msg
As Long, ByVal wParam As Long, ByVal lParam As Long) As Long</FONT></P>

<P><FONT SIZE=+0>If Msg = 讯息编号</FONT> Then</P>

<P><FONT SIZE=+0>If lParam = WM_LBUTTONDOWN Then</FONT></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -