【Demo 0011】绘图对象字体

这段时间忙4S项目,真的太忙了,这个Demo写了许久,一直都没能写完,同时也搁置了许多的Demo,后面慢慢多写了。

今天我们继续讲解GDI对象--字体,  字体对于系统而言有关极其重要的作用,有了它UI才能与用户进行交互,我们仍然看看字体的创建方法、字体的属性、字体操作函数以及与字体相关的函数

一、创建

    1.  HFONT CreateFont(int nHeight, int nWidth, int nEscapement, int nOrientation,  int nWeight, DWORD dwItalic,

                        DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutputPrecision,

                        DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCTSTR szFace)

         nHeight                 -- 高度

         nWidth                  -- 宽度

         nEscapement             -- 显示的角度       
         nOrientation            -- 角度
         nWeight                 -- 字体磅数(字体粗细)
         dwItalic                -- 斜体
         dwUnderline             -- 下划线
         dwStrikeOut             -- 删除线

         dwCharSet               -- 字符集
         dwOutputPrecision       --  输出的精度 
         dwClipPrecision         --  裁减的精度
         dwQuality               -- 字体质量  
         dwPitchAndFamily        -- 字间距  
         lpszFace                -- 字型

        看到这样一个函数估计大家都昏过去了, 这么多参数怎么写的啊,其实我们只要明白这些参数的意思,我们在日常使用时可以通过GetCurrentFont以及GetObject函数获取当前字体的

        信息, 再设置我们关注的数据信息即可。

    2.  HFONT CreateFontIndirect(CONST LOGFONT& pLogFont)

         此函数将CreateFont参数封装到LONFONT结构构体中而于; 创建方法可参考

            

    //--: Update face name
    LOGFONT LogFont;
    GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &LogFont);
    _GetCharsetAndFaceName(LogFont.lfCharSet, LogFont.lfFaceName, LF_FACESIZE);
    LogFont.lfItalic    = m_bItalic;
    LogFont.lfWeight    = m_bBold ? FW_BOLD : FW_THIN;
    LogFont.lfUnderline    = m_bUnderLine;
    LogFont.lfStrikeOut    = m_bStrikOut;
    if (m_hFont)
    {
        DeleteObject(m_hFont);
    }
    m_hFont    = CreateFontIndirect(&LogFont);

    

二、常用函数

   1、COLORREF SetBKColor(HDC hDC, COLORREF crColor)

      设置当前设备DC的背景色, 并返回原先设备DC的背景色

   2、COLORREF GetBKColor(HDC hDC)

      获取当前设备DC的背景色

   3、int SetBKMode(HDC hDC, int nBkMode)

      设置设备DC背景的混合模式, 此模式将影响文字、画刷或画笔绘制的图像, GDI提供了两种模式:

      OPAQUE       - 在写文字,使用画刷以及画笔前先用背景色填充绘图区 

      TRANSPARENT  - 以OPAQUE相反,文字,画刷,画笔直接绘制目标区

   4、int GetBKMode(HDC hDC)

      获取设备DC当前的背景混合模式

   5、UINT SetTextAlign(HDC hDC, UINT fMode)

      设置指定设备DC文本绘制时对齐方式, GDI提供以下对齐方式(以下方式可用或符号相混合使用):

      TA_BASELINE     -- 以文字的基线为参考线

      TA_BOTTOM       -- 以限定区域底部为参考线

      TA_TOP          -- 以限定区域顶部为参考线

      TA_CENTER       -- 以限定区域水平线中部为参考线

      TA_LEFT         -- 以限定区域左边为参考线

      TA_RIGHT        -- 以限定区域右边为参考线

      TA_RTLREADING   -- 文字绘制顺序,默认从左到右,中东文字如希伯莱文是从右写到左

      TA_UPDATECP     -- 每次输出调用后当前状态改变

      TA_NOUPDATECP   -- 每次输出调用后当前状态不改变

    6、UINT GetTextAlign(HDC hDC)

        获取指定设备DC文本绘制时对齐方式

  7、COLORREF SetTextColor(HDC hDC, COLORREF crColor)

        设置指定设备DC文本颜色

    8、COLORREF GetTextColor(HDC hDC)

     设置指定设备DC文本颜色

  9、BOOL TextOut(HDC hDC, int nXStart, int nYStart, LPCTSTR szString, int nStrLen)

        使用当前设备DC中字体,背景色以及文本颜色在特定位置绘制字符串

10、BOOL ExtTextOut(HDC hDC, int nX, int nY, UINT nOpt, CONST RECT* lprc LPCTSTR szString, int nStrLen, CONST INT* lpDx)

        该函数同TextOut功能一样,它是TextOut更低级的函数,TextOut是ExtTextOut函数的nOpt, lprc, lpDx参数为0的实现

11、int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat)

     使用当前设备DC中字体,背景色以及文本颜色在特定区域绘制字符串, 并uFormat作为格式化参数

12、int DrawTextEx(HDC hDC, LPTSTR lpchText, int cchText,  LPRECT lprc, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams)

      该函数同DrawText功能一致, 但比DrawText功能要丰富一些

13、BOOL PolyTextOut(HDC hDC, CONST POLYTEXT*pptxt, int cStrings)

        该函数在指定设备环境下以当前所选的字体和正文颜色绘制多个字符串

14、LONG TabbedTextOut(HDC hDC,int X, int Y, LPCTSTR lpString,  int nCount, int nTabPositions, CONST LPINT lpnTabStopPositions, int nTabOrigin)

        该函数将一个字符串写到指定的位置,并按制表位位置数组里的值展开制表符。正文以当前选择的字体、背景色和字体写入

15、BOOL GetTextMetrics(HDC hDC, LPTEXTMETRIC lptm)

        该函数把程序当前的字体信息,存放到TEXTMETRIC

   
    typedef struct tagTEXTMETRIC {
        LONG tmHeight;
        LONG tmAscent;
        LONG tmDescent;
        LONG tmInternalLeading;
        LONG tmExternalLeading;
        LONG tmAveCharWidth;
        LONG tmMaxCharWidth;
        LONG tmWeight;
        LONG tmOverhang;
        LONG tmDigitizedAspectX;
        LONG tmDigitizedAspectY;
        TCHAR tmFirstChar;
        TCHAR tmLastChar;
        TCHAR tmDefaultChar;
        TCHAR tmBreakChar;
        BYTE tmItalic;
        BYTE tmUnderlined;
        BYTE tmStruckOut;
        BYTE tmPitchAndFamily;
        BYTE tmCharSet;
    } TEXTMETRIC, *PTEXTMETRIC;

三、相关函

  1、BOOL GetTextExtentPoint32(HDC hDC, LPCTSTR lpString, int c, LPSIZE lpSize)

        该函数用于取得当前字体在一个指定范围内的连续字符的逻辑坐标宽度

  2、BOOL GetCharWidth32(HDC hdc, UINT iFirstChar, UINT iLastChar, LPINT lpBuffer)

        该函数用于取得当前字体在一个指定范围内的连续字符的逻辑坐标宽度

   3、int GetTextFace(HDC hdc, int nCount, LPTSTR lpFaceName)

        该函数取得被选进指定设备环境的字体字样名

演示代码

原文地址:https://www.cnblogs.com/ztercel/p/2125347.html