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 ~

posted @ 2022-09-29 17:20  虐心i  阅读(643)  评论(0编辑  收藏  举报