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(, , _T("hello word"), );

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(, , , );
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(, L"宋体");//初始化
CFont* pOldFont = dc.SelectObject(&fontGrade);//将CFont对象选入到当前DC中即为设置当前字体及大小 dc.TextOut(, , _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,\
,\
,\
,\
FW_NORMAL,\
FALSE,\
FALSE,\
,\
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(, _T("宋体"));
CFont* pOldFont = dc.SelectObject(&font); dc.TextOut(,,_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中定义的。

GDI基础(2):绘制文本的更多相关文章

  1. Delphi GDI对象之绘制文本

    转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...

  2. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  3. 使用GDI绘制文本

    /// <summary>        /// 定义一个绘制文本        /// </summary>        public void Texts()       ...

  4. Quartz2D 之 绘制文本

    1. 基础概念 1.1. 字体(Font) 同一大小.同一样式的字形的集合. 1.2. 字符(Character) 字符表示信息本身,一般指某种编码,如Unicode编码. 1.3. 字形(Glyph ...

  5. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  6. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

  7. iOS系列 基础篇 08 文本与键盘

    iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...

  8. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  9. html5 canvas 笔记三(绘制文本和图片)

    绘制文本 fillText(text, x, y [, maxWidth])   在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...

随机推荐

  1. 安装routeos

    直接开机,会看到: 选择全部安装即可,按a.i即可. 默认账号admin,默认没有密码 基本使用 可通过/ip,/interface等可以进去不同子功能模块,可进行print,add,remove等操 ...

  2. Gym - 101243F Vitamins(思维+并查集)

    题意 有三种药丸,白色W>红色R>蓝色B,给你m个约束条件,问你n个药丸的颜色,不能确定颜色输出‘?’ 题解 如果1<2<3,只要找到2就能确定1和3的颜色 如果2=4,只要确 ...

  3. 《基于Nginx的中间件架构》学习笔记---3.nginx的目录分析

    一.目录分析 用yum的方式进行安装实质上装的都是一个个的rpm包,对于linux系统rpm包管理器,我们使用命令rpm -ql  服务名称 就可以列出我们已经安装的服务所对应安装的每一个文件所在的目 ...

  4. 一、MySQL的连接建立与权限

    一.MySQL的连接建立与权限 写这些的目的一是记录下工作这几年所学,算是成长脚印吧.二是复习一遍,也给自己当笔记看,通篇观点都属于个人理解较多.读者观看的时候也需要自己判断下是否正确,另外,记下一段 ...

  5. datepicker动态初始化

    datepicker 初始化动态表单的input,需要调用jquery的on方法来给未来元素初始化. //对动态添加的时间文本框进行动态初始化 $('table').on("focus&qu ...

  6. Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not mat

    Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b ...

  7. BOM DOM jQuery

    . BOM . location相关 . location.href . location.href="http://www.sogo.com" . location.reload ...

  8. css代码插入三种方式

    1.内联式 <p style="color:red;font-size: 12px">iutt</p> 2.嵌入式 <style type=" ...

  9. Squid 搭建正向代理服务器

    Squid 是一款缓存代理服务器软件,广泛用于网站的负载均衡架构中,常见的缓存服务器还有varnish.ATS等. 正向代理服务器可满足内网仅有一台服务器可以上网,而要供内网所有机器上网的需求,也可以 ...

  10. Ubuntu下实现gedit支持nesC语法高亮

    在TinyOS下主要采用nesC语言(C语言的一个变种)编程,ubuntu系统默认打开文本的工具是gedit,为实现gedit支持nesC语法高亮,将最下面的代码保存为nesC.lang文件,然后将n ...