- 浏览: 2001076 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (651)
- ACE (35)
- BAT (9)
- C/C++ (116)
- fast-cgi (14)
- COM (27)
- python (59)
- CGI (4)
- C# (2)
- VC (84)
- DataBase (29)
- Linux (96)
- P2P (6)
- PHP (15)
- Web (6)
- Memcached (7)
- IME输入法 (11)
- 设计模式 (2)
- 搜索引擎 (1)
- 个人情感 (4)
- 笔试/面试 (3)
- 一亩三分地 (33)
- 历史 (2)
- 地理 (1)
- 人物 (3)
- 经济 (0)
- 不仅仅是笑哦 (43)
- 小故事大道理 (2)
- http://www.bjdsmyysjk120.com/ (0)
- http://www.bjdsmyy120.com/ (0)
- 它山之石可以攻玉 (15)
- 大学生你关注些什么 (28)
- 数据恢复 (1)
最新评论
-
luokaichuang:
这个规范里还是没有让我明白当浏览器上传文件时,STDIN的消息 ...
FastCGI规范 -
effort_fan:
好文章!学习了,谢谢分享!
com技术简介 -
vcell:
有错误os.walk(strPath)返回的已经是全部的文件和 ...
通过python获取目录的大小 -
feifeigd:
feifeigd 写道注意:文章中的CPP示例第二行 #inc ...
ATL入门:利用ATL编写简单的COM组件 -
feifeigd:
注意:文章中的CPP示例第二行 #include " ...
ATL入门:利用ATL编写简单的COM组件
字体是文字显示和打印的外观形式,它包括了文字的字样、风格和尺寸等多方面的属性。适当地选用不同的字体,可以大大地丰富文字的外在表现力。例如,把文字中某些重要的字句用较粗的字体显示,能够体现出突出、强调的意图。当然,文本输出时还可使用其格式化属性和显示质量来优化文本显示的效果。
字体属性和字体创建
字体的属性有很多,这里主要介绍字样、风格和尺寸三个主要属性。
字样是字符书写和显示时表现出的特定模式,例如,对于汉字,通常有宋体、楷体、仿宋、黑体、隶书以及幼圆等多种字样。GDI+是通过FontFamily类来定义字样的,例如下面的代码:
FontFamily fontFamily(L"幼圆"); // 定义"幼圆"字样
字体风格主要表现为字体的粗细和是否倾斜等特点。GDI+为用户提供了一些预定义的字体风格:FontStyleRegular(正常)、FontStyleBold(加粗)、FontStyleItalic(斜体)、FontStyleBoldItalic (粗斜体)、FontStyleUnderline(下划线)和FontStyleStrikeout(删除线)。
字体尺寸是用来指定字符所占区域的大小,通常用字符高度来描述。字体尺寸可以取毫米或英寸作为单位,但为了直观起见,也常常采用一种称为点的单位,一点约折合为1/72英寸。对于汉字,还常用号数来表示字体尺寸,初号字最大,以下依次为小初、一号、小一、二号、小二??,如此类推,字体尺寸起来越小。GDI+为用户提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(点)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字体尺寸单位。
使用GDI+中的Font类,可以直接通过构造函数创建一个字体对象,例如下列代码:
Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);
构造函数的第一个参数是用来指定FontFamily类对象指针,第二参数是用来指定字体的尺寸,它的实际大小取决于第四个参数所指定的尺寸单位。第三个参数用来指定字体风格。
为了与原来的GDI字体相兼容,Font的构造函数还有另外一种型式:
Font( HDC hdc, const LOGFONTW* logfont)
其中,hdc是用来指定一个窗口的设备环境句柄,logfon是指向LOGFONT(逻辑字体)数据结构的指针。
文本输出
文本的最终输出不仅依赖于文本的字体,而且还跟文本的颜色、对齐方式、字符间隔等有很大关系。GDI+只有一个输出文本的函数DrawString,它的原型如下:
DrawString( const WCHAR* string, INT length, const Font* font,
const RectF& layoutRect, const StringFormat* stringFormat,
const Brush* brush );
DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const Brush* brush );
DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const StringFormat* stringFormat,
const Brush* brush);
其中,string用来指定要输出的字符串,length表示该字符串的长度,font用来指定字体,layoutRect用来指定一个字符串所输出的矩形区域,stringFormat用来指定文本输出格式化属性,origin用来指定字符串输出的起点。需要注意的是,PointF和RectF类与Point和Rect类基本相同,所不同的是数据类型是浮点而后者是INT型。brush用来指定一个画刷,这个画刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(纹理画刷),甚至是渐变画刷。例如下面的代码,结果如图7.14所示。
Graphics graphics( pDC->m_hDC );
FontFamily fontFamily(L"幼圆");
Font font(&fontFamily, 20, FontStyleRegular, UnitPoint);
PointF pointF(30, 10);
Image image(L"image.jpg");
TextureBrush tBrush(&image);
LinearGradientBrush linGrBrush(
Point(30, 50),
Point(100, 50),
Color(255, 255, 0, 0),
Color(255, 0, 0, 255));
WCHAR string[256];
wcscpy(string, L"欢迎使用GDI+!");
graphics.DrawString(string, (INT)wcslen(string), &font, pointF, &tBrush);
pointF.Y += 50;
graphics.DrawString(string, (INT)wcslen(string), &font, pointF,
&linGrBrush);
需要说明的是,在GDI+中,我们可以通过SetTextRenderingHint来控制文本输出的质量。例如下面的代码,其结果如图7.15所示。
Graphics graphics( pDC->m_hDC );
FontFamily fontFamily(L"楷体_GB2312");
Font font(&fontFamily, 30, FontStyleRegular, UnitPixel);
SolidBrush solidBrush(Color(255, 0, 0, 255));
WCHAR string1[] = L"没有任何优化处理";
WCHAR string2[] = L"字体优化,但边不作平滑处理";
WCHAR string3[] = L"消除走样,且边作平滑处理";
graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel);
graphics.DrawString(
string1, (INT)wcslen(string1), &font, PointF(10, 10), &solidBrush);
graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixelGridFit);
graphics.DrawString(
string2, (INT)wcslen(string2), &font, PointF(10, 50), &solidBrush);
graphics.SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);
graphics.DrawString(
string3, (INT)wcslen(string3), &font, PointF(10, 90), &solidBrush);
文本格式化属性
文本的格式属性通常包括对齐方式、字符间隔以及文本调整等。GDI+提供StringFormat类来控制这些格式属性,通常我们调用以下几个函数来进行相关属性设置。
Status SetAlignment( StringAlignment align);
Status SetLineAlignment( StringAlignment align);
该函数用来设置文本对齐方式,align可以是StringAlignmentNear(左对齐或右对齐,取决于书写方向是从左到右还是从右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(两端对齐)。
Status SetFormatFlags( INT flags );
该函数用来设置文本格式化标志,flags可以是StringFormatFlagsDirectionRightToLeft(水平阅读方向是从右向左)和StringFormatFlagsDirectionVertical(垂直文本)等值。例如下面的代码,其结果如图7.16所示。
Graphics graphics( pDC->m_hDC );
SolidBrush solidBrush(Color::Blue);
FontFamily fontFamily(L"楷体_GB2312");
Font font(&fontFamily, 16, FontStyleRegular, UnitPoint);
StringFormat stringFormat;
stringFormat.SetFormatFlags( StringFormatFlagsDirectionRightToLeft |
StringFormatFlagsDirectionVertical |
StringFormatFlagsNoFitBlackBox);
stringFormat.SetAlignment(StringAlignmentCenter);
WCHAR string[] = L"这些文字是垂直居中且是从右到左的阅读次序, 它们是通过 \
SetFormatFlags和SetAlignment来设置的!";
graphics.DrawString( string, (INT)wcslen(string), &font,
RectF(30, 30, 150, 200), &stringFormat, &solidBrush);
评论
现在的情况是用UnitPixel为12的字体往一个高度为12像素的Rect中DrawString时,明显字体过大。
使用MeasureString倒是可以算出字体大小为12像素的字体的实际高度,但是反向的计算却不知道在哪里。
发表评论
-
__declspec(novtable) 的用法
2010-11-27 14:37 1535__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2823解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1603RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1436使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1176使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 19701、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1470防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5224// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1767VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3678深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 3964原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3090获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7799VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 17996SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1891解决决错误: error C2850: 'PCH hea ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 114761.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2300下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1493BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2403对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ... -
MFC中获取命令行参数的几种方法
2010-04-08 18:09 2932在MFC程序中,可以用以下几种方法来获取命令行参数。为方便 ...
相关推荐
用Visual C++.NET进行GDI+编程 Visual C++.NET GDI+编程基础 VC++ GDI+编程的字体和文本绘制 基于VC.NET的GDI+图像处理
第二章 图形图像处理—GDI+编程 案例1 绘制风格迥异的直线 案例2 绘制贝济埃曲线 案例3 不规则窗体的实现 案例4 如何在上传的图片上加上版权文字 案例5 在图片中绘制水印效果图 案例6 动态多边形 案例7 ...
第8章 OLE和GDI+编程 实例 87 OLE容器 实例 88 保存OLE信息 实例 89 设置跟踪矩形 实例 90 显示多个OLE项 实例 91 ActiveX服务器 实例 92 插值模式 实例 93 图像区域平铺 实例 94 文字填充 实例 95 图形容器 ...
6.6 字体和文本 6.6.1 字体类型和字体属性 6.6.2 TEXTMETETRIC结构 6,6.3 LOGFONT结构 6.6.4 创建CFont对象 6.6.5 绘制文本 6.6.6 实例 第7章 数据库编程 7.1 ODBC类 7.1.1 CDatabase类 ...
6.6 字体和文本 6.6.1 字体类型和字体属性 6.6.2 TEXTMETETRIC结构 6,6.3 LOGFONT结构 6.6.4 创建CFont对象 6.6.5 绘制文本 6.6.6 实例 第7章 数据库编程 7.1 ODBC类 7.1.1 CDatabase类 ...