常用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:复制多行编辑控制的正文显示特性。

2、CFont字体类

字体的显示由CFont类进行管理,与CPen、CBrush不同的是,在定义一个CFont对象后,必须通过调用其初始化函数如CreateFont()使一个Windows字体与此CFont对象关联来初始化该对象。CFont对象初始化及操作完成后利用CDC::SelectObject()函数将该字体选入到当前设备描述表中即可使用该字体来输出文本。

CFont类的初始化函数有:CreateFont()、CreateFontIndirect()、CreatePointFont()、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::CreatePointFontIndirect(const LOGFONT* lpLogFont, CDC* pDC = NULL);

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

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

③ 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::CreateFontIndirect(const LOGFONT* lpLogFont);

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

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中定义的。

时间: 2024-11-05 12:33:58

常用GDI函数(2):绘制文本的相关文章

常用GDI函数(1):绘制线条和图形

1. CDC::SetPixel()用来绘制一个像素点. 使用Win32 API函数: HDC hdc = ::GetDC(m_hWnd);//获得窗口的设备描述表 ::SetPixel(hdc, 100, 200, RGB(255, 0, 0)); ::ReleaseDC(m_hWnd, hdc);//释放DC资源 CDC::MoveTo(),CDC::LineTo()用来绘制直线. 使用CDC类: CDC* pDC = GetDC();//获得与当前窗口相关联的DC对象 pDC->MoveT

使用GDI绘制文本

/// <summary>        /// 定义一个绘制文本        /// </summary>        public void Texts()        {            Graphics g = this.CreateGraphics();            g.DrawString("嘿嘿,O(∩_∩)O哈哈~",new Font("楷体",20),Brushes.Black,new Point(20

绘制文本

本课中,我们将学习如何在窗口的客户区“绘制”字符串.我们还将学习关于“设备环境”的概念. 理论: Windows 中的文本是一个GUI(图形用户界面)对象.每一个字符实际上是由许多的像素点组成,这些点在有笔画的地方显示出来,这样就会出现字符.这也是为什么我说“绘制”字符,而不是写字符.通常您都是在您应用程序的客户区“绘制”字符串(尽管您也可以在客户区外“绘制”).Windows 下的“绘制”字符串方法和 Dos 下的截然不同,在 Dos 下,您可以把屏幕想象成 85 x 25 的一个平面,而 W

Qt之图形(绘制文本)

简述 前面我们讲解了Qt图形的基本绘制,其中包括: 绘制文本.直线.直线.矩形.弧线.椭圆.多边形.图片,以及其它一些高级用法,比如:渐变.转换等. 本节我们来详细讲解文字的绘制.主要通过QPainter的darwText()函数来实现,里面包含多个重载函数,其中,可以通过QRect来指定绘制的区域,也可以通过QPoint来指定绘制的起始点. QFont类可以辅助设置文本的大小.粗细.字符间距等,然后使用setFont()来设置. QFontInfo类用来获取字体的信息,可以通过fontInfo

Delphi 常用API 函数

Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗口的最小化子窗口 AttachThreadInput 连接线程输入函数 BeginDeferWindowPos 启动构建一系列新窗口位置的过程 BringWindowToTop 将指定的窗口带至窗口列表顶部 CascadeWindows 以层叠方式排列窗口 ChildWi

为GDI函数增加透明度处理

用户对客户端的UI的要求越来越高,采用alpha通道对前景背景做混合是提高UI质量的重要手段. UI开发离不开GDI,然后要用传统的GDI函数来处理alpha通道通常是一个恶梦:虽然有AlphaBlend这个API可以做alpha混合,但是前提必须是操作的DC中的位图有alpha通道的数据,问题的关键在于GDI函数在操作的地方会把原来的alpha通道清空. 使用GDI做alpha混合还要增加透明度关键要解决2个问题: 1.需要把内容画到一个临时位图上,同时保护好alpha通道. 2.在于把临时位

PHP常用必备函数

array_change_key_case - 返回字符串键名全为小写或大写的数组 array_chunk - 将一个数组分割成多个 array_combine - 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_count_values - 统计数组中所有的值出现的次数 array_diff_assoc - 带索引检查计算数组的差集 array_diff_key - 使用键名比较计算数组的差集 array_diff_uassoc - 用用户提供的回调函数做索引检查来

iOS开发数据库篇—SQLite常用的函数

iOS开发数据库篇—SQLite常用的函数 一.简单说明 1.打开数据库 int sqlite3_open( const char *filename,   // 数据库的文件路径 sqlite3 **ppDb          // 数据库实例 ); 2.执行任何SQL语句 int sqlite3_exec( sqlite3*,                                  // 一个打开的数据库实例 const char *sql,                    

C#.NET常用的函数方法大全

C#.NET常用的函数方法大全 1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.DateTime.Now; 1.2 取当前年 int 年=currentTime.Year; 1.3 取当前月 int 月=currentTime.Month; 1.4 取当前日 int 日=currentTime.Day; 1.5 取当前时 int 时=current