【Part two】Win32编程 自由创建字体及文本输出 数据结构 | 相关函数 | 编程思路 | 小技巧

句柄:

  • HFONT 字体句柄

数据结构:

  • TEXTMETRIC 记录字体信息的数据结构
  • Eg:【tm.tmHeight 字体高】【tm.tmExternalLeading 行间距】
  • SIZE 记录字符串信息的数据结构
  • Eg:【size.cx 横轴的长度】【size.cy 纵轴的长度】

定义字符串:

  • char lpsz[] ="…"; 定义字符串

编程思路:

  1. 创建字体CreateFont(),设置颜色SetTextColor(),绑定画布;
  2. 获取字体信息GetTextMetrics(hdc,&tm);
  3. 格式化文本(通过字体高度和宽度确定后续x,y的位置);
  4. 输出文本TextOut()

重要函数:

hF = GetStockObject();
获得系统字体句柄,返回的是系统缺省字体
不写的话,相当于自动调用系统的字体

hF = CreateFont (
int nHeight, //字体高度,0采用系统缺省值,使用逻辑单位
int nWidth, //字体宽度,取0则由系统根据高宽比取最佳值
int nEscapement, //每行文字相对于页底的角度,单位为0.1度
int nOrienation, //每个文字相对于页底的角度,单位为0.1度
DWORD nWeight, //字体粗细度,范围为0~1000
DWORD Dwltalic, //如果要求字体倾斜,则取非零
DWORD dwUnderline, //如果要求下划线,则取非零
DWORD dwStrikeout, //如果要求中划线,则取非零
DWORD dwCharset, //字体所属字符集
DWORD dwOutputPrecision,//输出精度,一般取缺省值OUT_DEFAULT_PRECIS
DWORD dwClipPrecision, //剪裁精度,常取缺省值CLIP_DEFAULT_PRECIS
DWORD dwQuality, //输出质量,一般取缺省值DEFAULT_QUALITY
DWORD dwPitchAndFamily, //字体名
)
自己创建画笔
最后使用完毕,记得删除

DeleteObject(hF);
删除自己创建的画笔

SetTextColor(hDC, RGB(255, 255, 0));
设置文本颜色
参数:(设备, RGB颜色)

SetBkColor(hDC, RGB(255, 0, 0));
设置字体的背景颜色

SelectObject(hDC, hF);
将设备和字体句柄进行绑定

TextOut(hDC, x, y, lpsz_1, strlen(lpsz_1));
文本输出
参数:(设备, 坐标(X, Y), 字符数组名, 长度)


GetTextMetrics(hDC, &tm);
获取创建字体句柄的信息
字体有大小的,有时候X, Y的位置需要考虑字体的大小,将相关数据写在tm结构里面

GetTextExtentPoint(hDC, lpsz_3, strlen(lpsz_3), &size);
获得字符串的长宽,写入size的结构

x = x + size.cx;
y = y + tm.tmHeight + tm.tmExternalLeading;
换行,换起点


技巧1:
sprintf()
任意类型 —> 字符串
MessageBox()
窗口打印中间一些数据

Eg:(整型 --->字符串型,输出行间距)
char a[255];          //临时空间
sprintf(a, "%d", tm.tmExternalLeading);       //转类型
MessageBox(hWnd, a, "111", strlen(a));     //“111”是窗体名字

技巧2:
主动建立计时器刷新:
WM_CREATE消息中,SetTimer(hWnd, 300, NULL); //300毫秒
WM_TIMER消息中, InvalidateRect(hWnd, NULL, 1);
WM_DESTROY消息中, KillTimer(hWnd, 1);

技巧3:
居中显示两种方法:
(i)通过计算的方式获得

int l = strlen(textbuffer[0]) * nXchar;
GetClientRect(hWnd, &rect);
TextOut(hDC, (rect.left+rect.right)/2 - l/2, (rect.top+rect.bottom)/2 - nYchar/2, textbuffer[0], Strlen(textbuffer[0]));

(ii)通过一些常量直接输出

GetClientRect(hWnd, &rect);
DrawText(hDC, textbuffer[0], -1, &rect, DT_SINGLELINE, DT_CENTER, DT_VCERTER);

DT_SINGLELINE:单行显示文本
DT_CENTER:水平居中
DT_VCERTER:垂直居中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值