用户感到不适应甚至招至用户的反感。
使用CClientDC的应用程序与此类似,只不过我们通常在一些需要直
接在窗口的客户区进行绘制的场合创建和使用该设置上下文对象。比
如在一些使用鼠标绘图的应用程序中,当用户在客户区中单击鼠标
时,我们通常需要直接在客户区中绘制出相应的图形,而不必等到
WM_PAINT消息发送。对于这样的应用程序,我们一般在鼠标的移动和
单击事件的处理函数中创建类型为CClientDC的设置上下文对象,并
通过该设备上下文对象进行绘制。如果使用了AppWizard来生成MFC应
用程序的话,我们一般使用ClassWizard来完成添加这些消息处理成
员函数和相应的消息映射项。
如前所述,在WM_PAINT消息的处理函数中,我们一般不使用
CClientDC对象,而应该使用CPaintDC对象。
在下面的小节中,我们将讲述MFC中的GDI绘图对象类的使用。
第二节 画笔对象
MFC类CPen封装了GDI中的画笔对象,画笔对象代表了进行绘制时所用
的线条。我们一般通过两个步骤来创建画笔对象:首先构造一个CPen
对象,再调用对象的CreatePen成员函数。成员函数CreatePen按指定
的样式、宽度等属性创建一个逻辑画笔,然后将该画笔与CPen对象相
关联。
9。2。1 创建画笔
成员函数CreatePen有两种形式。第一种形式的如下:
BOOL CreatePen( int nPenStyle; int nWidth; COLORREF crColor );
参数nPenStyle代表了画笔的样式,可以为下列值之一:
…………………………………………………………Page 529……………………………………………………………
PS_SOLID: 创建一个实线画笔
PS_DASH: 创建一个虚线画笔。一个虚线画笔
的宽度不能超过一个设备单位。
PS_DOT: 创建一个点线画笔。一个点划线画
笔的宽度不能超过一个设备单位。
PS_DASHDOT: 创建一个点划线画笔。同样,这种
样式的画笔宽度也不能超过一个设
备单位。
PS_DASHDOTDOT: 创建一个双点划线画笔。这种样式
的画笔宽度也不能超过一个设备单
位
PS_NULL: 创建一个空画笔
PS_INSIDEFRAME: 对于那些指定一个边界矩形的GDI输
出函数,具有这种样式的画笔将线
条绘制到输出形状框架的内侧。而
对于那些没有指定边界矩形的GDI输
出函数,这种画笔的绘制区域则不
受框架的限制。
参数nWidth以逻辑单位给出画笔的宽度。如果参数nWidth为零,则无
论当前使用何种映射模式,所创建和画笔的宽度都为一个象素。参数
crColor为画笔的颜色,这里可以使用RGB宏来生成合适的颜色值。
另一种形式的CreatePen函数使用如下的参数:
BOOL CreatePen( int nPenStyle; int nWidth; const LOGBRUSH* pLogBrush;
int nStyleCount = 0; const DWORD* lpStyle = NULL );
这种形式的CreatePen可以创建一个具有指定的宽度、样式和刷子属
性的逻辑修饰 (cosmetic)或几何 (geometric)画笔。参数nPenStyle指
定了画笔的样式,它可以为PS_COSMETIC、PS_GEOMETRIC或它们与一
些附加属性的组合,详细的说明这里不进行说明,如果需要的话你可
以参考联机文档中对构造函数CPen::CPen的说明。nWidth以逻辑单位
指定画笔的宽度,如果nPenStyle参数包括了PS_COSMETIC的话,参数
nWidth必须为1。参数pLogBrush为指向一个LOGBRUSH结构的指针,该
LOGBRUSH结构定义了画笔的刷子属性。最末两个参数nStyleCount和
…………………………………………………………Page 530……………………………………………………………
lpStyle定义了画笔的每一划及它们之间的空白的长度。
画笔对象实际上也可以一步创建,这时所使用的构造函数也使用与函
数CreatePen相一致的参数。以使用一步创建的方式创建画笔对象
时,我们通过捕获一个异常是否发生来判断是否出错。
9。2。2 使用画笔在设备上下文中进行输出
一旦画笔对象创建成功之后,即可使用CDC类的成员函数
SelectObject将其选入设备描述表中进行各种输出。
下面的示例程序PenDemo演示了画笔对象的使用。
创建工程PenDemo的方法同在9。1。2中引入的示例程序
MulticlrdCaption相同。您可以参照上一节的讲述来创建工程
PenDemo。其代码清单如下:
#include
#include
#include
// 派生应用程序类
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// 派生窗口类
class CMyWnd : public CFrameWnd
{
protected:
// 声明消息处理函数
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();
…………………………………………………………Page 531……………………………………………………………
};
// 初始化应用程序实例
BOOL CMyApp::InitInstance()
{
// 创建应用程序的主窗口
CMyWnd *pWnd=new CMyWnd;
pWnd…》Create(NULL; 〃各种画笔的示例〃);
// 显示应用程序主窗口并刷新其客户区
pWnd…》ShowWindow(SW_SHOW);
pWnd…》UpdateWindow();
// 在主窗口关闭时终止应用程序的执行线程
m_pMainWnd=pWnd;
return TRUE;
}
// 声明唯一的应用程序对象
CMyApp MyApp;
// 应用程序主窗口的消息映射
BEGIN_MESSAGE_MAP(CMyWnd; CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// 应用程序主窗口的重绘函数
void CMyWnd::OnPaint()
{
// 获得窗口的客户区设备上下文句柄
CPaintDC dc(this);
// 定义一个画笔数组
…………………………………………………………Page 532……………………………………………………………
CPen pen'8';
// 创建实线画笔
pen'0'。CreatePen(PS_SOLID; 10; RGB(255; 0; 0));
// 创建虚线画笔
pen'1'。CreatePen(PS_DASH; 1; RGB(0; 255; 0));
// 创建点线画笔
pen'2'。CreatePen(PS_DOT; 1; RGB(0; 0; 255));
// 创建点划线画笔
pen'3'。CreatePen(PS_DASHDOT; 1; RGB(0; 255; 255));
// 创建双点划线画笔
pen'4'。CreatePen(PS_DASHDOTDOT; 1; RGB(255; 0; 255));
// 创建空画笔
pen'5'。CreatePen(PS_NULL; 1; RGB(255; 255; 0));
// 创建内侧实线画笔
pen'6'。CreatePen(PS_INSIDEFRAME; 10; RGB(0; 0; 0));
// 创建具有刷子属性的几何画笔
LOGBRUSH lb;
lb。lbStyle=BS_HATCHED;
lb。lbColor=RGB(128; 128; 128);
lb。lbHatch=HS_DIAGCROSS;
pen'7'。CreatePen(PS_GEOMETRIC; 10; &lb);
// 保存指向设备上下文原有画笔的指针
CPen *pOldPen;
// 以实线画笔绘制矩形
pOldPen=dc。SelectObject(&pen'0');
dc。Rectangle(10; 10; 110; 110);
…………………………………………………………P
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 最新章:第26章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 最新章:第17章
- Linux实用培训教程(PDF)
- -Page 1-rrktqt的个人空间 Linux实用培训教程第一部分 作者:红联Linux实用培训教程第一部分-共三部分解的Linux知识,循序渐进的介绍Linux相关知识,从入门到提高,希望对所有学习Linux的朋友都有帮助 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章
- 最新章:第42章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- 路由器基本知识及应用实例(DOC格式)
- 第二章 路由器第一节 路由器发展概述自从1984年问世至今,路由器已经走过了近20年的快速技术发展历程。路由器的应用领域不断扩展、从单一的互通网关逐渐扩展到覆盖广域网、城域网乃至用户接入的各个领域。近年来,路由器早已逐渐脱离单纯用于企业网出口和互联的概念,开始成为运营网络和各种专用业务网络的核心设备
- 最新章:第48章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章