windows编程之TextOut与DrawText -- 文本输出实验
windows编程之TextOut与DrawText -- 文本输出实验
实验名称
- 实验3-2-文本输出实验
实验目的
-
1.掌握常用的文本输出函数TextOut、DrawText的使用,熟悉其参数设置。
-
2.掌握字体颜色、背景颜色、背景透明等属性的修改。
-
3.掌握字体创建函数CreateFont的使用,掌握计算文本大小的两种方法,进而能确定文本输出的合适位置
实验要求
1.在窗口处理函数中增加绘图代码,增加文本输出内容,分别使用TextOut
函数、DrawText
函数输出文本。使用DrawText
绘制的文本在矩形范围内居中显示,先将矩形绘制出来作为参照。注意函数中字符串输出长度、对齐参数的设置。效果参照课本
2.修改上题代码,将字体颜色、背景颜色分别修改,设置背景颜色透明,将两行字体重叠显示。参考效果如下:
3.创建新的字体,设置字体大小为30高,15宽,字体样式为隶书,计算合适位置输出多行文本,避免重叠。参考效果如下:
实验源码
先用vs创建一个Windows桌面应用程序,在消息处理的回调函数WM_PAINT
中修改代码
- 第1题
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
TCHAR str_t[100] = TEXT("使用TextOut输出文本");
TCHAR str_d[100] = TEXT("使用DrawText输出文本");
int len_t = wcslen(str_t);
int len_d = wcslen(str_d);
RECT rt = { 100,100,400,200 };
TextOut(hdc, 10, 10, str_t, len_t);
Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);
DrawText(hdc, str_d, -1, &rt, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
EndPaint(hWnd, &ps);
return 0;
}
- 第2题
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
TCHAR str1[100] = TEXT("红色字体颜色,绿色背景的文本");
TCHAR str2[100] = TEXT("被掩盖的文本,背景透明");
TCHAR str3[100] = TEXT("显示在前面的文本,背景透明");
int len1 = wcslen(str1);
int len2 = wcslen(str2);
int len3 = wcslen(str3);
SetTextColor(hdc, RGB(255, 0, 0));
SetBkColor(hdc, RGB(0, 255, 0));
TextOut(hdc, 20, 20, str1, len1);
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 20, 60, str2, len2);
TextOut(hdc, 20, 66, str3, len3);
EndPaint(hWnd, &ps);
return 0;
}
- 第3题
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR str[30] = TEXT("Hello 世界你好");
int len = wcslen(str);
static HFONT hFont;
static TEXTMETRIC tm;
SIZE size;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hWnd);
hFont = CreateFont(30, 15, 0, 0, FW_BOLD, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, TEXT("隶书"));
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(255, 0, 0));
GetTextMetrics(hdc, &tm);
ReleaseDC(hWnd, hdc);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 20, 30, str, len);
TextOut(hdc, 20, 30 + tm.tmExternalLeading, str, len);
GetTextExtentPoint32(hdc, str, len, &size);
TextOut(hdc, 20 + size.cx, 30, str, len);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
DeleteObject(hFont);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
思考题
设计三种(或n种)文本的样式(例如,1红色20号黑体;2黑色26号宋体;3蓝色30号隶属),将一串文本显示在屏幕上,通过鼠标点击次数切换三种不同字体效果。
enjoy it ~