- 浏览: 2031223 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1578__declspec(novtable) 的用法 __d ... -
解决URLDownloadToFile缓存问题的两种方法
2010-09-09 15:18 2906解决URLDownloadToFile缓存问题的两种方法 ... -
修改richedit背景
2010-07-19 22:52 1647RichEditCtrl::SetBackgroundCo ... -
使用ADO封装类的数据库程序开发实例(下)
2010-07-12 15:30 1473使用ADO封装类的数据库 ... -
使用ADO封装类的数据库程序开发实例(上)
2010-07-12 15:28 1215使用ADO封装类的数据库 ... -
VC防止窗口和控件闪烁的方法
2010-07-09 21:16 20221、将Invalidate()替换为Invalidate ... -
防止窗口闪烁地办法
2010-07-09 21:13 1512防止窗口闪烁地办法 也许我们都碰到过这种情况,当你 ... -
使用ADO _ConnectionPtr
2010-07-06 16:04 5265// GetUser.cpp : Defines the ... -
VC用ADO访问数据库全攻略
2010-07-06 15:29 1799VC用ADO访问数据库全 ... -
深入GetMessage和PeekMessage (引自-MSDN技术组)
2010-06-10 16:59 3726深入GetMessage和PeekMessage (引自 ... -
界面编程总结(1)
2010-06-02 13:32 4011原文地址:http://blog.csdn.net/byx ... -
获取信息的有关Windows API
2010-05-27 10:01 3146获取信息的有关Windows API 1.窗口信息 ... -
VC中如何实现窗口的隐藏
2010-05-13 10:08 7862VC中如何实现窗口的隐藏 用MFC做的Dialog ... -
SetConsoleCtrlHandler 处理控制台消息
2010-05-07 17:32 18142SetConsoleCtrlHandler 处理控制台消 ... -
解决决错误: error C2850: 'PCH header file'
2010-04-27 19:45 1953解决决错误: error C2850: 'PCH hea ... -
VC利用GDI+显示透明的PNG图片
2010-04-12 16:59 115381.在你将要使用GDI+的工程中,完成初始化 ... -
GDI+编程基础(一)GDI+ Vs GDI
2010-04-12 15:59 2336下载源代码一、GDI GDI是位于应用程序与不同硬件之间 ... -
VC画图
2010-04-12 15:50 1538BOOL DrawPic(HDC hdc, TCHAR* ... -
对话框的数据交换--MFC深入浅出
2010-04-12 10:43 2457对话框数据交换指以下两种动作,或者是把内存数据写入对应的控 ... -
MFC中获取命令行参数的几种方法
2010-04-08 18:09 2970在MFC程序中,可以用以下几种方法来获取命令行参数。为方便 ...
相关推荐
本资源包“VC++ GDI+编程必备的源码库”包含了GDI+编程的各种示例,旨在帮助开发者深入理解和应用GDI+技术。 GDI+的核心概念主要包括以下几个方面: 1. **图形对象**:GDI+中的图形对象包括笔(Pen)、刷子(Brush...
在VC++中使用GDI+进行编程,可以实现丰富的图形绘制、图像处理以及文本渲染等功能。这个"VC++ GDI+编程必备的源码库.zip"文件应该包含了多种GDI+的实例代码,对于学习和理解GDI+编程非常有帮助。 1. **GDI+基础**:...
**三、VC++ GDI+编程的字体和文本绘制** 在GDI+中,可以使用`Font`类创建字体对象,指定字体名称、大小、样式。`StringFormat`类用于控制文本的对齐方式、换行等属性。然后,通过`Graphics.DrawString`方法绘制文本...
5. **文本渲染**:提供高质量的文本绘制,支持文本对齐、换行、旋转和缩放。 6. **图像处理**:包括缩放、旋转、裁剪、平移等操作,以及滤镜效果如模糊、锐化等。 7. **路径绘图**:通过Path对象可以组合直线、...
VC++作为Visual Studio的一部分,是Microsoft提供的一个强大C++编程环境,常用于Windows应用开发,包括GDI+的应用。 GDI+的主要知识点包括: 1. **基本绘图对象**:GDI+提供了一些基本绘图对象,如Pen(画笔)、...
GDI+的`DrawString`方法可以轻松地绘制带有格式的文本,而`DrawLine`和`DrawRectangle`等方法则简化了图形绘制。 GDI+的出现是为了弥补GDI在图形绘制上的不足,它提高了性能,简化了编程模型,并引入了更多的现代...
《精通GDI+编程》是一本专为VC++开发者设计的深入指南,旨在帮助读者全面理解和掌握GDI+(Graphics Device Interface Plus)技术。GDI+是微软Windows平台上的一个图形绘制库,提供了丰富的绘图功能,使得程序员可以...
3. **文本渲染**:GDI+提供了高质量的文本绘制功能,支持字体、字号、颜色和排列方式的设置。 4. **图形路径**:创建和绘制复杂图形路径,包括贝塞尔曲线和二次曲线。 5. **变换**:了解和应用平移、旋转、缩放和...
在Windows编程领域,VC++(Microsoft Visual C++)是一个强大的开发环境,而GDI+(Graphics Device Interface Plus)是微软推出的一种图形绘制技术,用于在Windows应用程序中创建和操作图形。GDI+扩展了传统的GDI,...
3. **文本渲染**:GDI+的TextRenderer类提供了高质量的文本绘制功能,支持字体选择、文本颜色、对齐方式等设置。通过TextFormatFlags枚举,可以控制文本的显示样式,如是否换行、是否右对齐等。 4. **绘图路径**:...
GDI+(Graphics Device Interface Plus)是Windows XP和Windows Server 2003操作系统中的...在实际编程中,例如在VC++环境中,开发者可以利用GDI+的类库,结合具体的代码实例,轻松实现复杂的图形绘制和图像处理任务。
4. **文本渲染**:GDI+的TextRenderer类提供了高质量的文本绘制功能,可以调整文本对齐方式、行间距和字符间距。此外,还可以通过StringFormat类控制文本的排列和换行方式。 5. **绘图上下文**:Graphics类是GDI+的...
5. **添加文字**:GDI提供了DrawText函数,可以方便地在画布上绘制文本,支持调整字体、大小、颜色和对齐方式。 6. **图像缩放**:图像缩放涉及到图像处理技术,可以使用 StretchDIBits 或 SetDIBits 等函数来调整...
**VC++ GDI图形编程** 是...通过学习和理解这些示例,开发者可以深入掌握GDI编程技巧,进一步提升在VC++环境中开发图形和图像应用的能力。在实际项目中,结合MFC库,可以构建出功能强大且用户友好的图形应用程序。
### VC GDI 编程中的字体与文本绘制详解 #### 一、引言 在Windows图形用户界面(GUI)开发中,Visual C++ (VC++) 结合图形设备接口(GDI)提供了一套强大的工具集,用于实现丰富的图形界面功能。其中,字体和文本的...
尽管GDI+和OpenGL在用途上都是图形编程接口,但它们的设计理念和使用方式有所不同。OpenGL是一个面向对象、基于状态的图形库,强调硬件加速和低级控制,而GDI+则更倾向于提供一个易于使用的API,适合那些不需要底层...
为了深入了解VC++ GDI编程,你可以参考微软的官方文档、技术论坛、在线教程,以及专门讨论GDI编程的书籍。实践是最好的老师,尝试编写简单的图形绘制程序,逐步提升你的技能。 总结来说,VC++ GDI图形图像编程是...
这个开发包是专为在Visual C++ 6.0环境下使用GDI+而设计的,旨在解决传统GDI编程中的复杂性和效率问题。 在传统的GDI编程中,开发者需要处理大量的图形设备句柄,如设备上下文(HDC),这使得代码变得复杂且难以...
在Windows编程领域,GDI+(Graphics Device Interface Plus)是一个强大的图形绘制库,它扩展了传统的GDI(Graphics Device Interface)功能,提供了更多的图形处理能力,包括矢量图形、位图操作、颜色空间管理和...