• GDI基础(2):绘制文本


    1、TextOut()和DrawText()函数

    CDC::TextOut()在窗口的指定位置处输出文本,函数声明:

    virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount); 
    BOOL TextOut(int x, int y, const CString& str);
        CPaintDC dc(this);
        dc.TextOut(0, 100, _T("hello word"), 5);

    CDC::DrawText()在窗口的指定矩形区域内输出指定格式的文本,如果没有特别指明,当输出文本长度大于矩形长度时,仅显示矩形内的文本。函数声明:

    virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
    int DrawText(const CString& str, LPRECT lpRect, UINT nFormat);

        CPaintDC dc(this);
        CRect rect(0, 0, 35, 20);
        dc.DrawText(_T("hello word"), &rect, DT_LEFT|DT_WORDBREAK|DT_NOPREFIX|DT_EDITCONTROL);

    最后一个参数nFormat为文本输出的格式,可以为以下值的组合:

    DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。

    DT_CENTER:文本水平居中,是从中间向两边输出文本。
    DT_LEFT:文本左对齐,是从左向右输出文本。
    DT_RIGHT:文本右对齐,是从右向左输出文本。
    DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。
    DT_SINGLELINE:单行显示文本,使回车和换行符都不断行。
    DT_WORDBREAK:当指定参数为DT_WORDBREAK时,DrawText就有了自动识别单词的功能,它会把连在一起的英文字符或数字识了一个单词,当一行显示不下时,它会自动跳转到下一行显示,当单词的长度超过矩形的宽度时,该单词就不能完全显示了。
    DT_NOPREFIX:关闭前缀字符。通常DrawText将助记前缀&理解为其后字符加上下划线,前缀&&表示显示一个&字符,指定DT_NOPREFIX格式后关闭了这种处理。
    DT_BOTTOM:将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。
    DT_EDITCONTROL:复制多行编辑控制的正文显示特性。
     
    CDC::SetTextColor()用来设置文字显示时的颜色。
    CDC::SetBkColor()用来设置文字显示时的背景颜色。
    CDC::SetBkMode()用来设置文字显示时背景颜色的使用模式,参数TRANSPARENT为使用透明色,参数OPAQUE为使用当前颜色。
     
    2、CFont字体类
    字体的显示由CFont类进行管理,如果我们想要改变显示的字体,那么就应该将新的字体对象选入到当前DC中。与CPen、CBrush不同的是,CPen和CBrush可以通过构造函数进行初始化,而CFont只能通过调用其初始化函数来初始化,而且CFont必须进行初始化后才能使用。CFont对象初始化及操作完成后利用CDC::SelectObject()函数将该字体选入到当前设备描述表中即可使用该字体来输出文本。
    CFont类的初始化函数有:CreateFont()、CreatePointFont()、CreateFontIndirect()、CreatePointFontIndirect()等。
     
    CFont::CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);
    nPointSize:字体高度,以十分之一点(磅)为单位。例如120则为12点(磅)的高度。
    lpszFacename:字体字样名,如"宋体"。函数EnumFontFamilies()可以枚举出当前所有可用字体的字样名。
    pDC:指向CDC对象,用来将nPointSize指定的高度转换为逻辑单位,如果为NULL,则使用屏幕设备上下文进行转换。 
    在绘图时还经常会提到逻辑和物理,例如逻辑单位、物理单位。通俗点说,逻辑的就是与具体设备无关的,甚至我们可以自定义,物理的就是由具体设备决定的了。
        CPaintDC dc(this);  
    
        CFont fontGrade;//定义CFont对象  
        fontGrade.CreatePointFont(100, L"宋体");//初始化  
        CFont* pOldFont = dc.SelectObject(&fontGrade);//将CFont对象选入到当前DC中即为设置当前字体及大小  
     
        dc.TextOut(0, 50, _T("hello world!")); 
    
        dc.SelectObject(pOldFont);

    CFont::CreateFont()通过指定一系列的字体特征来初始化字体对象;

    BOOL CreateFont(int nHeight,         //字体高度(逻辑单位)
                    int nWidth,          //字体平均宽度(逻辑单位)
                    int nEscapement,     //字体倾斜角度
                    int nOrientation,    //字体倾斜角度
                    int nWeight,         //字体粗细
                    BYTE bItalic,        //是否斜体
                    BYTE bUnderline,     //是否带下划线
                    BYTE cStrikeOut,     //是否带删除线
                    BYTE nCharSet,       //字体使用的字符集
                    BYTE nOutPrecision,  //输出精确度
                    BYTE nClipPrecision, //裁剪精度
                    BYTE nQuality,       //字体的输出质量
                    BYTE nPitchAndFamily,//字体间距和字体族
                    LPCTSTR lpszFacename //字体的字样名
                    );

    使用举例:

    #define CREATE_FONT(nHeight, sName) CreateFont(
        nHeight,
        0,
        0,
        0,
        FW_NORMAL,
        FALSE,
        FALSE,
        0,
        DEFAULT_CHARSET,
        OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,
        CLEARTYPE_QUALITY,
        DEFAULT_PITCH | FF_SWISS,
        sName
        )
    
    void Cmfc_testDlg::OnPaint()
    {
        CPaintDC dc(this);
    
        CFont font;  
        font.CREATE_FONT(20, _T("宋体"));  
        CFont* pOldFont = dc.SelectObject(&font);  
     
        dc.TextOut(0,50,_T("hello world"));  
    
        dc.SelectObject(pOldFont);
    }

    CFont::CreatePointFontIndirect()使用一个指向LOGFONT结构来初始化字体对象,使用方法与CreatePointFont()类似。

    CFont::CreateFontIndirect()使用一个指向LOGFONT结构来初始化字体对象,使用方法与CreateFont()类似。

    CFont::GetLogFont(LOGFONT* pLogFont)可以获得字体的LOGFONT结构体。

    3、GetTextExtent()与GetTextMetrics()

    CDC::GetTextExtent()用来获得字符串在窗口显示时的所占的矩形大小,其返回CSize类型来表示文本所占的宽度和高度。

    CSize GetTextExtent(const CString& str);

    CSize GetTextExtent(LPCTSTR lpszString, int nCount);

    CDC::GetTextMetrics()函数用来获得当前DC中字体的信息,如字体的高度,它会将字体的度量信息放到指向TEXTMETRIC类型的参数中。而它不会获得字体的宽度,因为每一个字的长度有的是不同的,一般我们用它来获得字体的高度、最大宽度和平均宽度。

    BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics);

    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;

    4、字符串资源

    CString::LoadString(UINT nID)用来加载一个由nID标识的字符串资源,字符串资源是在资源视图下的String Table中定义的。

  • 相关阅读:
    8常用控件
    7对话框
    6控件
    5Lambda表达式
    4自定义信号和槽函数
    3信号与槽
    2指定父对象
    springboot整合activemq
    springboot整合springtask
    jvm与tomcat启动优化配置
  • 原文地址:https://www.cnblogs.com/milanleon/p/4544256.html
Copyright © 2020-2023  润新知