《GDI+系列教程》的作者:空
GDI+ 出现以前,有个东西叫 GDI 。
某种程度上可以说, GDI+ 是对 GDI 的进一步封装,使其支持了一些新特性(例如透明度),也变得更加易用,但前者并不能完全取代后者。
本章,我们将使用 GDI 函数,以极少的代码量,写出一个比 Win10 自带放大镜显示还要准确(自带放大镜在显示屏幕边缘时会漏2px左右)的屏幕放大镜。
1.初始化一些设置
#NoEnv SetBatchLines -1 ; 设置最速运行模式 CoordMode Mouse, Screen ; 设置屏幕坐标模式 #Include Gdip_All.ahk
2.创建 GUI 并设置放大倍率
zoom:=2, w:=580, h:=157, wz:=w/zoom, hz:=h/zoom ; 放大倍率、宽、高、取景范围宽、取景范围高 Gui +AlwaysOnTop +Resize +ToolWindow +HwndMagnifierID Gui Show, w%w% h%h% x0 y0, Magnifier
3.获取 GUI的DC 与 屏幕的DC
source_hdc := GetDC(PrintSourceID) ; 源DC dest_hdc := GetDC(MagnifierID) ; 目标DC
4.放大显示
SetTimer Repaint, 50 ; 不停重绘当前画面 Repaint: MouseGetPos x, y xz:=Min(Max(Ceil(x-wz/2), 0), Ceil(A_ScreenWidth-wz)) ; 限制坐标最大最小值。取景范围超出左边界,使用最小值。超出右边界,使用最大值。 yz:=Min(Max(Ceil(y-hz/2), 0), Ceil(A_ScreenHeight-hz)) ; StretchBlt(目标DC, 目标x, 目标y, 目标w, 目标h, 源DC, 源x, 源y, 源w, 源h, 模式) ; 拉伸复制DC内容。省略最后一个参数,默认是 SRCCOPY 模式。 StretchBlt(dest_hdc, 0, 0, w, h, source_hdc, xz, yz, wz, hz) Return
5.收工善后
GuiClose: ; 释放资源。GetDC 和 ReleaseDC 配对使用,CreateDC 和 DeleteDC 的配对使用。 ReleaseDC(dest_hdc) ReleaseDC(source_hdc) ExitApp
本章习题:在不引用任何库(包括Gdip库)的情况下,实现这个放大镜最少需要几行代码(参考答案:8行)?自己试试,体会一下 ahk 的简洁与强大。
全部代码与库文件下载地址:
https://ahk.lanzoux.com/b01nypnuh
密码:1234
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)