Win32开发入门(8) 绘图(A)2013-06-05 csdn tcjiaan从本篇开始,我就不吹牛皮,那就吹吹兔皮吧。说说与绘图有关的东东。要进行绘制,首先 要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们 封装了一些与显示设备相关的交互操作,我们这里说的是图形的绘制,自然指的是显卡。当然,对于同 一客观事物,世界上并不存在唯一的理解方案,技术上的东西最终拿来用的,不应该有硬性的去统一。 我们之中的很多人,最大的失败在于,人家说要这样理解他就毫不怀疑地这样理解,权威人士说要这样 这样,他就不经过大脑思考地跟着那样那样。虽然我的母校是名不见经传的三流大学,但回忆 我的大学,很幸运,我曾经遇到几位好老师,真正的好老师,不是那些所谓的叫兽砖家。记得某位老师 说过:这本书,如果读完了你一无所获,那你太失败了;如果你把书中的内容都掌握了,勉强及格;如 果你能把书中的所有观点全部推翻,你才是优秀的。在许多情况下,我们绘图都是遵循先 GetDC-----〉绘图------〉ReleaseDC,DC是一种资源,用完了要释放,我们到图书馆借书,看完了要 还书。不过,在处理WM_PAINT消息时,调用BeginPaint函数后,开始绘图,画完了调用EndPaint。当然 这个并不违背我们前面所说的使用完HDC要释放的道理,只是BeginPaint函数会自动调用GetDC, EndPaint会自动调用ReleaseDC。好的,首先我们来写几个字吧。绘制文本可以使用DrawText函 数,他的最后一个参数是文本的对齐格式,如左对齐、居中、右对齐等。
PAINTSTRUCT ps; switch(msg) { case WM_PAINT: BeginPaint(hwnd, &ps);
声明一个PAINTSTRUCT结构体的变量,然后传给 BeginPaint函数,之后就可以画东西了。DrawText(ps.hdc,L"床前明月光", -1, &rect, DT_CENTER);但是,如果我希望文本的颜色不是默认的黑色,我们可以考虑调用 SetTextColor函数来设置颜色,之后我们绘制的所有文本都是这个颜色了,如果之后希望改变文本的颜 色,就再次调用SetTextColor函数。SetTextColor(ps.hdc, RGB(0,150,255));RGB宏可 以通过三个值来确定颜色值,这个估计不用我介绍了,如果不懂RGB,可以去请教芙蓉姐姐。我 希望新绘制的文本在前一个文本的下一行,当然,你可能会说,用DrawText的时候把传给它的RECT改一 下坐标就行了。这方法虽然可以,但我们不好调坐标。其实,我们如果知道文本字符的高度,那不就好 办了吗,对的,要获得文本高度,可以调用GetTextMetrics函数。现在我们要用的工具都齐全了。
case WM_PAINT: BeginPaint(hwnd, &ps); TEXTMETRIC tm; // 取得与文本相关的数据 GetTextMetrics(ps.hdc, &tm); RECT rect; rect.top = 0L; rect.left = ps.rcPaint.left; rect.right = ps.rcPaint.right; rect.bottom = rect.top + tm.tmHeight; // 第一行文本 SetTextColor(ps.hdc, RGB(0,150,255)); DrawText(ps.hdc,L"床前明月光", -1, &rect, DT_CENTER); // 第二行文本 rect.top += tm.tmHeight; rect.bottom += tm.tmHeight; SetTextColor(ps.hdc, RGB(220, 12, 50)); DrawText(ps.hdc, L"疑是地上霜", -1, &rect, DT_LEFT); // 第三行文本 rect.top += tm.tmHeight; rect.bottom += tm.tmHeight; SetTextColor(ps.hdc, RGB(30,255,7)); DrawText(ps.hdc, L"举头望明月", -1, &rect, DT_RIGHT); // 第四行文本 rect.top += tm.tmHeight; rect.bottom += tm.tmHeight; SetTextColor(ps.hdc, RGB(0,40,210)); DrawText(ps.hdc, L"低头思故乡", -1, &rect, DT_RIGHT); EndPaint(hwnd, &ps); return 0;