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(, , _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_LEFT:文本左对齐,是从左向右输出文本。
DT_RIGHT:文本右对齐,是从右向左输出文本。
DT_WORDBREAK:当指定参数为DT_WORDBREAK时,DrawText就有了自动识别单词的功能,它会把连在一起的英文字符或数字识了一个单词,当一行显示不下时,它会自动跳转到下一行显示,当单词的长度超过矩形的宽度时,该单词就不能完全显示了。
DT_NOPREFIX:关闭前缀字符。通常DrawText将助记前缀&理解为其后字符加上下划线,前缀&&表示显示一个&字符,指定DT_NOPREFIX格式后关闭了这种处理。
DT_BOTTOM:将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。
DT_EDITCONTROL:复制多行编辑控制的正文显示特性。
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):绘制文本的更多相关文章
- Delphi GDI对象之绘制文本
转载:http://www.cnblogs.com/pchmonster/archive/2012/07/06/2579185.html 基本绘图操作(Basic Drawing Operations ...
- 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制
背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...
- 使用GDI绘制文本
/// <summary> /// 定义一个绘制文本 /// </summary> public void Texts() ...
- Quartz2D 之 绘制文本
1. 基础概念 1.1. 字体(Font) 同一大小.同一样式的字形的集合. 1.2. 字符(Character) 字符表示信息本身,一般指某种编码,如Unicode编码. 1.3. 字形(Glyph ...
- Win32汇编学习(5):绘制文本2
这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...
- Win32汇编学习(4):绘制文本
这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...
- iOS系列 基础篇 08 文本与键盘
iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...
- jdbc基础 (三) 大文本、二进制数据处理
LOB (Large Objects) 分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...
- html5 canvas 笔记三(绘制文本和图片)
绘制文本 fillText(text, x, y [, maxWidth]) 在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...
随机推荐
- python的定时任务模块--schedule
首先先安装一下模块 下面我们简单的学习一下schedule模块 先简单的看个示例 import schedule def test(*args,**kwargs): print("hello ...
- HTML 转 PDF 之 wkhtmltopdf 工具精讲
术语定义 文档对象 “文档对象”是指PDF文档中的文档对象,共有三种类型的“文档对象”,他们分别是“页面对象”,“封面对象”和“目录对象”. 页面对象 “页面对象”是指以页面的形式在PDF文档中呈现的 ...
- 【gRPC使用问题2】按照问题1操作生成出来的代码,import的proto内定义的message未生成出来
1.问题 其实元数据proto里是有定义message,但是 这个message的定义是在另一个 proto文件内,被 api.proto导入,事实上 我是对 api.proto 进行命令行生成代码的 ...
- TF30063:没有访问xxx的权限 vs2017
凭据什么的都删掉了,还是无法连接上,最后同事用一种方法o(╥﹏╥)o,先登录vs2015的tfs账号,然后再vs2017上面登录tfs账号即可解决.PS:网上很多文章都是抄的,这个Bug真TM恶心.
- js文件,同样的路径,拷贝过来的为什么不能访问
从解决方案管理器中拖过来的可以直接访问,而从 bundleconfig中拷贝过来后修改的就访问不到. 如下: 引用一: <script src="~/Content/Plugins/j ...
- Ubuntu安装时没注册root用户密码,怎么登录root
一.其实我个人认为这没有多大必要,因为当你需要 root 的权限时,使用 sudo 便可以了.如果你实在需要在 Ubuntu 中启用 root 帐号的话,那么不妨执行下面的操作: 1.重新设置 roo ...
- Svn Server 强制提交者输入注释信息
目的:在项目开发过程中,强制团队成员必须在提交前写上注释 环境简述:SVN服务器:Windows Server 2008 SVN版本:VisualSVN Ltd. 2.7.5 操作方法:在SVN的R ...
- Oracle性能优化4-索引
Oracle优化可以分为通过改写sql优化和不改写sql优化不改写sql优化一般通过index来实现 在Oracle数据库中,索引按照索引机制的不同,可以分为三种. 1. B-Tree索引 B-Tre ...
- 在浏览器中运行java applet
最近在看java applet,在eclipse中可以正常运行,于是想试试在浏览器中运行.但途中遇到很多问题,网上很多解答也不全面,于是想把自己的解决过程记录下来. [1]首先,编写的applet程序 ...
- Liunx history
Linux中history历史命令使用方法详解 (转) 作者:青藤园来源:|2012-05-10 10: http://os.51cto.com/art/201205/335040.htm ...