• 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 ~

  • 相关阅读:
    Gateway集成Netty服务
    django——Serializer的反序列化、字段与参数、局部与全局钩子、ModelSerializer使用
    【IOS】applicationDidBecomeActive和applicationWillEnterForeground场景梳理
    程序人生:从小公司到一线大厂,薪资翻倍,我做到了...
    到底是选择极米还是选择当贝?画质看当贝,音质看极米 在意画质和使用体验的选当贝
    一篇文章让你学会K8s软件安装神器Helm
    正点原子linux阿尔法开发板使用——SPI驱动
    信息学奥赛一本通(c++):1180:分数线划定
    【Java】B站课程《基于分布式架构项目实战》学习总结
    简版商务合作保密协议
  • 原文地址:https://blog.csdn.net/a924282761/article/details/127110708