先来说说如何绘制文字,之所以我把文字放在图形和图片之前,是因为绘制文字往往在常用的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)
{
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 ,好了,下次再说。