VB 没有提供这样的功能, 必须呼叫 Windows API」, 当笔者这样回答读者之後,有些读者会要求笔者介绍 Windows API 方面的书籍, 尤其是中文书, 但实际上,目前市面上只看到一本原文书(ZD Press 出版的 Visual Basic 5.0 Programming Guide to Win32 API), 中文书则未见过, 为什麽没有 Windows API 方面的中文书呢?道理很简单, Windows API 对 VB 的学习者而言, 犹如山峰之颠, 能够一路爬上来的人原本就十分有限,而越往山顶, 人烟越稀少, 因此这样的书写出来, 销售成绩必然惨不忍睹, 也许有些读者会觉得本土的作者实在很混,只愿意写简单的书, 但撰写深入的书籍, 费时费力费神而销售成绩又不好, 最终结果是这种不混的作者混不下去,当过读者而现在又是作者的笔者, 对於此一现象有时也颇感无奈。
不管怎样, 笔者现在已经开始介绍 Windows API 了, 也许真的不想混了,但混与不混不是笔者开启本系列讲座最担心的事情, 笔者所担心的是这样的主题对读者来说会不会太枯燥?会不会太艰涩?会不会像笔者当初研读 Windows API 时, 越研读心中的疑问越多, 就好像进入无底黑洞一样?
为了避免以上的结果, 在内容的介绍上, 笔者会倾向於即学即用的 API, 短期内尽量避免深入 Windows 无底黑洞地带, 而会先到那些有花有草地方。
本期笔者想引领您去的地方是:萤幕抓取程式与萤幕保护程式。
萤幕抓取程式简介
如果不写程式, 抓取萤幕图像的方法是:按下 Print Screen 键, 然後开启 Windows 的小画家, 接着选取小画家功能表的「编辑/贴上」, 即可将萤幕图像复制到小画家的绘图区域中。
如果写程式呢?稍後笔者就会介绍, 介绍以前, 建议您先进入笔者的网站下载笔者所撰写的萤幕抓取程式(CopyScr.vbp),一来可了解程式的基本运作模式, 二来不必自己输入程式, 此一程式执行後,选取功能表的「我抓我抓我抓抓」, 即可将萤幕的图像复制进来。
图-1「萤幕抓取程式」

萤幕保护程式简介
保护萤幕最简单的方法就是不用时关掉它, 但有这种好习惯的人实在不多,所以有人写程式侦测滑鼠与键盘的输入, 如果有一段时间没有滑鼠或键盘的输入,便将电脑视为没有人在使用, 而把萤幕显示成黑色, 用以保护萤幕, 後来又有人觉得黑色太难看了,就加了一点动画, 慢慢地动画越来越多也越有趣, 结果反倒成为萤幕保护程式不可或缺的功能,而不再以保护萤幕为主了。
如何撰写萤幕保护程式当然也是本期的重点, 同样的, 介绍以前, 请进入笔者的网站下载笔者所撰写的萤幕保护程式(saver.vbp),此一程式预设的等待时间是 0.5 分钟, 如果您等待 30 秒不操作键盘与滑鼠,程式便会进入萤幕保护状态, 您也可以设定等待的时间, 如图-2, 或者直接按下「立刻测试」钮以检视萤幕保护程式的动画。(特别注意:请务必以程式右上角的关闭钮结束程式,不要以 VB 的结束钮来结束程式, 否则…, 玩看看, 就知道会有什麽後果)
图-2 「萤幕保护程式」的设定画面

了解萤幕抓取程式及萤幕保护程式的基本运作模式, 接下来让笔者来说明相关的工作概念。
Windows 的绘图观念
VB 用来绘图的方法有 Line(画线及矩形)、Circle(画圆)、PSet(画点)、PaintPicture(描绘图片)…等,这些方法有一共通特点 — 只能描绘在表单(Form)视窗的「显示区域」(Windows 称之为 client rectangle), 想跨越显示区域而把文字或图形描绘在视窗标题区、功能表区、萤幕任意区域…,想都别想, 而以萤幕保护程式为例, 则必须在萤幕任意位置绘图。想在萤幕任意位置绘图,我们必须先了解 Windows 的绘图观念
绘图之前, 先取 hDC
所有 Windows 的绘图, 都必须先取得 hDC, 然後以 hDC 呼叫绘图的 API。hDC 是 handle of DC(Device Context) 的缩写, 有关 handle 的观念笔者上一期已经有所说明,本期不再重述, 至於 DC 呢?Windows 规定任何程式绘图之前都必须先配置一块绘图专用的系统资源(通常是记忆体),这绘图专用的系统资源就是 DC 啦。DC 与其他系统资源一样, 会有一个唯一的 handle 值, 此一 handle 值便是 hDC。
VB 程式呼叫 Line、Circle、Pset、PaintPicture…等方法时, 表面上好像与 DC 无关, 但实际上它们都会预先配置好 DC, 然後透过 DC 来绘图, 您可以查阅表单及 PictureBox 物件的说明文件, 结果可以发现它们都含有 hDC 属性, 此一属性即为表单及 PictureBox 物件用来呼叫 Windows 绘图函数的 DC handle。
BitBlt:图像描绘函数
二话不说, 让我们直接观察一个利用 DC 来绘图的 API 函数 — BitBlt, BitBlt 的作用与 PaintPicture 有点类似, 假设表单上含有一 PictureBox, 而此一 PictureBox 的 Picture 属性亦设定有图片, 若使用 VB 的绘图功能, 则将 PictureBox 的图片绘制在 Form1 的方法是:
Form1.PaintPicture Picture1.Picture, 0, 0
如果使用 BitBlt 函数则是:
ret = BitBlt(Form1.hDC, 0, 0, Picture1.Width, Picture1.Height, Picture1.hDC, 0, 0, SRCCOPY)
[1] [2] [3] [4] [5] 下一页
|