Windows客户端开发简介(五)
讲完了 DC 的创建,接下来就要来说说 DC 的使⽤,如何调⽤ GDI 函数在 DC 上进⾏绘制,包括绘制⽂字,绘制图形以及绘制图⽚。
先来说说如何绘制⽂字,之所以我把⽂字放在图形和图⽚之前,是因为绘制⽂字往往在常⽤的GDI操作中是个⽐较频繁调⽤的功能,其实在界⾯⾃绘时的图形绘制是个相对少⽤的功能,原因很简单,复杂的图形根本不可能⽤代码来⽣成,基本上都是保存在图⽚⾥嘛。所以我这⾥对图形绘制只会简单介绍⼏个可能常⽤的函数,⼀切以⼯作实践为准,所以尽量偏实⽤⽽少理论。
⾔归正传,下⾯谈谈怎么绘制⽂字。
在绘制之前,我来介绍⼀下绘制⽂字时可能会(应该说是⼀定会)⽤到的⼀个GDI对象HFONT。
HFONT表⽰了HDC的字体属性,⼀般来说有两种⽅式可以创建HFONT,就是两个API:⼀个是CreateFont,另⼀个
是CreateFontIndirect。其实这⼆者本质上⽽⾔并没有什么太⼤差别,CreateFont有⼀⼤堆的参数,⽽CreateFontIndirect只是把这些参数都放到了⼀个LOGFONT的结构体中,所以对我们来说:要了解这所有的参数实在是太烦⼈了!即便是可以⼀个⼀个查询MSDN,对我们来说也是件费时费⼒的事。有时候
我们只是需要改变字体的某个特征,⽐如改变⼀下字体,或者改变⼀下字体⼤⼩,⼜或者只是增加个下划线亦或者让字体变成粗体,⽽我们居然要填写如此之多的参数,效率真低啊!
说了这么多铺垫的话,当然表明我要来教⼤家⼀些⼩⼩的技巧了,如何⾼效率的改变字体属性。⽐如我们现在要改变⼀下当前HDC中的字体,把当前字体变为“微软雅⿊”,这件事可以分为如下⼏个步骤。
⾸先来说说思路,⾸先我们要获得⼀个填充好的LOGFONT,因为这个结构包含了字体的各个属性,这可以通过⼀下⽅式获取:
HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
If ( hFont != NULL)
{
LOGFONT lf={0};
GetObject(hFont, sizeof(LOGFONT), &lf);
DeleteObject(hFont);
}
GetStockObject(DEFAULT_GUI_FONT);这个函数从系统取出了默认字体的HFONT,然后我们再通过GetObject(hFont,
sizeof(LOGFONT), &lf);就得到了填充好的LOGFONT,这个LOGFONT⾥就包括了当前系统字体的各种属性,包括⼤⼩,字体名,等等信息。
哇!真的是很简单,所以我们完全可以把上⾯的代码封装成⼀个函数⽤来获取系统默认字体的LOGFONT信息。
但是等等,上⾯的代码获取的是系统的默认字体,⽽有时候我们仅仅希望在当前选中字体上进⾏修改怎么办,我就不卖关⼦了,下⾯给出代码,其实区别只有⼀点点,就是HFONT的获取。
HFONT hFontOld =(HFONT)GetCurrentObject(hdc, OBJ_FONT);
看到了吗?就这么⼀点点差别,只是获取HFONT时有这么⼀点点差别⽽已。这时我们⼤可以封装这样⼀个函数:
BOOLGetFontInfo(HDC hdc, LOGFONT &lf)
{
HFONT hFontCur =(HFONT)GetCurrentObject(hdc, OBJ_FONT);
int ret = 0;
if (hFontCur != NULL)
{
windows开发平台ret = GetObject(hFontCur,sizeof(LOGFONT),&lf);
}
return ret != 0;
}
这样就可以简单的获取到LOGFONT了
接下来我们要做我们该做以及想做的事,就是改变字体名,可以这样
lstrcpy(lf.lfFaceName,L"微软雅⿊");
HFONThFontNew = CreateFontIndirect(&lf);
HFONThFontOld = (HFONT)SelectObject(hdc, hFontNew);
这时hdc⾥的字体就是“微软雅⿊”了,既然字体已经设置好,如何改变字体颜⾊呢?
改变字体颜⾊并⾮通过某个GDI对象进⾏的,⽽是通过⼀个API:SetTextColor,这个API有两个参数,HDC 以及 COLORREF,HDC我就不说了,COLORREF实际是⼀个DWORD的typedef,它表⽰⼀个RGB三⾊组成的⾊彩值(不带透明⾊),有⼀个宏可以⽣
成COLORREF就是RGB(red,green,blue),每个⾊彩的范围是从0~255,所以RGB(255,0,0)就是表⽰红⾊,所以如果我们要把字体设成红⾊,就可以:
SetTextColor(hdc,RGB(255,0,0));
但是光这样还不够,因为字体的背景⾊是不透明的,如果直接绘制⽂字可能会出线下⾯这样的状况:
所以⽂字带了⼀个⽩⾊的背景,如果我们需要绘制⽂字的时候背景透明(⼀般⽽⾔都是需要的)可以这样,⽤SetBkMode(hdc, TRANSPARENT),这样就可以得到如下的输出效果:
是不是好多了呢?
这篇就到这⾥,接下来会给⼤家介绍⼀下绘制⽂字的两个常⽤函数DrawText和TextOut,好了,下次再说。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论