invoke dispatchmessage, addr msg
.endw
mov eax,msg.wparam
ret
winmain endp
wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam
local hdc:hdc
local ps:paintstruct
local hfont:hfont
.if umsg==wm_destroy
invoke postquitmessage,null
.elseif umsg==wm_paint
invoke beginpaint,hwnd, addr ps
mov hdc,eax
invoke createfont,24,16,0,0,400,0,0,0,oem_charset,\
out_default_precis,clip_default_precis,\
default_quality,default_pitch or ff_script,\
addr fontname
invoke selectobject, hdc, eax
mov hfont,eax
rgb 200,200,50
invoke settextcolor,hdc,eax
rgb 0,0,255
invoke setbkcolor,hdc,eax
invoke textout,hdc,0,0,addr teststring,sizeof teststring
invoke selectobject,hdc, hfont
invoke endpaint,hwnd, addr ps
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
xor eax,eax
ret
wndproc endp
end start
分析:
createfont 函数产生一种逻辑字体,它尽可能地接近参数中指定的各相关值。这个函数大概是所有 windows api函数中所带参数最多的一个。它返回一个指向逻辑字体的句柄供调用 selectobject 函数使用。下面我们详细讲解该函数的参数:
createfont proto \
nheight:dword,\
nwidth:dword,\
nescapement:dword,\
norientation:dword,\
nweight:dword,\
citalic:dword,\
cunderline:dword,\
cstrikeout:dword,\
ccharset:dword,\
coutputprecision:dword,\
cclipprecision:dword,\
cquality:dword,\
cpitchandfamily:dword,\
lpfacename:dword
nheight: 希望使用的字体的高度,0为缺省。
nwidth: 希望使用的字体的宽度,一般情况下最好用0, 这样 windows 将会自动为您选择一个和高度匹配的值。因为在我们的例子中那样做的话会使得字符因太小而无法显示,所以 我 们设定它为16。
nescapement: 每一个字符相对前一个字符的旋转角度,一般设成0。900代表转90度,1800转190度,2700转270度。
norientation: 字体的方向。
nweight: 字体笔画的粗细。
windows 为我们预定义了如下值:
fw_dontcare 等于 0
fw_thin 等于 100
fw_extralight 等于 200
fw_ultralight 等于 200
fw_light 等于 300
fw_normal 等于 400
fw_regular 等于 400
fw_medium 等于 500
fw_semibold 等于 600
fw_demibold 等于 600
fw_bold 等于 700
fw_extrabold 等于 800
fw_ultrabold 等于 800
fw_heavy 等于 900
fw_black 等于 900
citalic: 0为正常,其它值为斜体。
cunderline: 0为正常,其它值为有下划线。
cstrikeout: 0为正常,其它值为删除线。
ccharset: 字体的字符集。一般选择oem_charset,它使得 windows 会选用和操作系统相关的字符集。
coutputprecision: 指定我们选择的字体接近真实字体的精度。 一般选用out_default_precis,它决定了缺省的映射方式。
cclipprecision: 指定我们选择的字体在超出裁剪区域时的裁剪精度。 一般选用clip_default_precis,它决定了裁剪精度。
cquality: 指定输出字体的质量。它指出gdi应如何尽可能的接近真实 字体,一共有三种方式:default_quality, proof_quality 和draft_quality。
cpitchandfamily:字型和字体家族。
lpfacename: 指定字体的名称。
上面的描述不一定好理解,您如果要的到更多的信息,应参考 win32 api 指南。
invoke selectobject, hdc, eax
mov hfont,eax
在我们得到了指向逻辑字体的句柄后必须调用 selectobject 函数把它选择进“设备环境”,我们还可以调用该函数把诸如此类的像颜色、笔、画刷 等gdi对象选进“设备环境”。该函数会返回一个旧的“设备环境”的句柄。您必须保存该句柄,以便在完成“绘制”工作后再把它选回。在调用 selectobject 函数后一切的绘制函数都是针对该“设备环境”的。
rgb 200,200,50
invoke settextcolor,hdc,eax
rgb 0,0,255