文前小议
为山九仞,功亏一篑。 ——出自《尚书·旅獒》
九仞:极言其高;
亏:欠缺;篑:盛土的筐子。
堆九仞高的山,只缺一筐土而不能完成。比喻作事情只差最后一点没能完成。自评:学习贵在坚持,知识如春起之苗,不见其长,而日有所曾。
前文【DirectX3D - 3】渲染一段文字介绍过使用 D3DCreateFont
和DrawText
接口实现文字输出。
本文将继续介绍其他的文字输出方法。
函数接口
- TextOut
BOOL TextOutA(
HDC hdc, // 设备环境句柄,标识了当前文字输出在那个设备上
int x, // 文字起点横坐标
int y, // 文字七点纵坐标
LPCSTR lpString, // 字符串
int c // 字符串长度 strlen() 或者对应宽字节 wcslen()
);
- DrawText
int DrawText(
HDC hdc,
LPCTSTR lpchText,
int cchText,
LPRECT lprc,
UINT format
);
这个接口之前用过了, 这里主要介绍以下,最后一个参数 format
。有很多种格式,并且这些格式是可以相互组合使用的。
名称 | 解释 |
---|---|
DT_BOTTOM | 文本显示在文本框的底部对齐,该表示应该于表示 DT_SINGLENLINE 同时使用 |
DT_CENTER | 文本居中对齐 |
DT_LEFT | 文本居左对齐 |
DT_RIGHT | 文本居右对齐 |
DT_TOP | 本文顶部对齐 |
DT_SINGLENLINE | 在单独一行显示文字,按回车健文字也不换行 |
以上格式简要介绍,更过格式说明,参看MSDN文档。
- SetTextColor
设置文字颜色
BOOL ListView_SetTextColor(
HWND hwnd, // 设备环境句柄
COLORREF clrText // 文本颜色
);
- SetBkMode
设置文字背景透明
int SetBkMode(
HDC hdc,
int mode // 不透明:OPAQUE 透明:TRANSPARENT
);
在 GDI中,默认的文字背景颜色是白色,如果是这样,文字输出到画面中,原画面的北京就会被破坏掉。为了去掉文字背景色,可以使用函数SetBkMode() 设置。
以上几个接口就是最长使用的文字输出接口,下表总结了其他的接口。
函数 | 说明 |
---|---|
SetTextCharacterExtra | 设置字符间距 |
GetCharWidth | 获取字体中一个字符的宽度 |
GetKerningParis | 获取指定字体的字距信息 |
示例代码
HDC g_hdc=NULL; //全局设备环境句柄
void render_font()
{
g_hdc = GetDC(hwnd); //获取设备环境句柄
HFONT hFont=CreateFont(30,0,0,0,0,0,0,0,GB2312_CHARSET,0,0,0,0,L"微软雅黑"); //创建一种字体
SelectObject(g_hdc,hFont); //将字体选入设备环境中
SetBkMode(g_hdc, TRANSPARENT); //设置输出文字背景色为透明
//定义三段文字
wchar_t text1[]=L"为山九仞,功亏一篑。 ";
wchar_t text2[] = L"九仞:极言其高;\
亏:欠缺;篑:盛土的筐子。\
堆九仞高的山,只缺一筐土而不能完成。比喻作事情只差最后一点没能完成。";
wchar_t text3[]=L"——出自《尚书·旅獒》";
//设置文字颜色并输出第一段文字
SetTextColor(g_hdc,RGB(50,50,50));
TextOut(g_hdc,30,150,text1,wcslen(text1));
//设置文字颜色并输出第二段文字
SetTextColor(g_hdc,RGB(50,50,255));
TextOut(g_hdc,30,200,text2,wcslen(text2));
//设置文字颜色并输出第三段文字
SetTextColor(g_hdc,RGB(60,150,50));
TextOut(g_hdc,800,300,text3,wcslen(text3));
DeleteObject(hFont);//释放字体对象
ReleaseDC(hwnd,g_hdc); //释放设备环境
}
参考
[1] 官方文档:https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-textouta