登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

visual c++中的画笔类CPen使用实例  

2010-08-01 11:41:24|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

画笔类CPen
画笔是一种基本的GDI对象,在绘图之前,一般要为所绘制的图形选择定制的笔。MFC提供的一种名为CPen的包装类,使得使用画笔非常简单。
画笔由CPen类管理,使用CPen类对象时,需用对CPen类对象进行初始化。初始化CPen类的方法有3种:第1种是调用CPen()的构造函数;第2种是通过CPen::CreatePen()函数创建;第3种是通过CPen::CreatePenIndirect()函数,并通过LPLOGPEN结构来设置CPen的属性。
1.CPen的构造函数
CPen类的构造函数有3种形式,具体如下:
① CPen( );
② CPen( int nPenStyle, int nWidth, COLORREF crColor );
throw( CResourceException );
③ CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0,\
const DWORD* lpStyle = NULL );
throw( CResourceException );
参数说明:
nPenStyle:线型,具体取值如表1所示。

表1               nPenStyle取值说明
n_Width:线宽,对于第②种构造函数,如果取值为0,则线宽永远为1个像素宽,与显示模式无关。对于第③种构造函数,如果线型为PS_GEOMETRIC,则线宽以逻辑单位度量;如果线型为PS_COSMETIC,线宽必须为1。
crColor:画线颜色。
polgBrush:为LOGBRUSH结构指针,如果nPenStyle为PS_COSMETIC,则LOGGBRUSH的lbColor成员变量设定画笔颜色,而LOGBRUSH的lbStyle成员变量必须是PS_SOLID。如果nPenStyle为PS_GEOMETRIC,所有的成员变量都必须用于指定画笔的画刷属性。
nStyles:指定线型类型的树目,即lpStyle数组的元素数目,只对PS_USERSTYLE类型的线型有效。对于其他线型,该项必须是0。
lpStyle:一个双字节(DWORD)的数组,数组的第1个元素设定第1个笔画的长度,第2个元素设定第一个间隔的长度,当笔画属性不是PS_USERSTYLE时,该项必须为0。
2.使用CreatePen()创建画笔
使用CPen::CreatePen()函数来创建画笔的方法与使用CPen类的构造函数创建画笔的方法类似,这里不再重复。
3.使用CreatePenIndirect()创建画笔
CreatePenIndirect()成员函数通过LPLOGPEN结构来生成CPen类对象,LPLOGPEN结构的定义如下所示:
typedef struct tagLOGPEN {
UINT    lopnStyle;
POINT    lopnWidth;
COLORREF    lopnColor;
} LOGPEN;
其中,lopnStyle设定线型,lopnWidth设定线宽,lopnColor设定画线颜色。
4.CPen演示实例
(1)创建一个基于对话框的应用程序PenDemo。
(2)打开PenDemoDlg.cpp文件,找到CPenDemoDlg::OnDraw函数,修改这个函数的内容,如下所示:
void CCPenDlg::OnPaint()
{
CPaintDC dc(this);
//绘制白色背景
CRect rect;
this->GetClientRect(&rect);
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
dc.FillRect(&rect,&brush);
brush.DeleteObject();
//画线
CPen * pOldPen;    //记录原始画笔
const int nLeft=30;
CPen LinePen;
long PenStyle[8]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,\
PS_SOLID,PS_SOLID,PS_SOLID};    //线的类型
CString
PenStyleName[8]={"SOLID","DASH","DOT","DASHDOT","DASHDOTDOT","Width=10",\
"Width=20","Width=30"};     //显示的提示文本
int nsize[8]={1,1,1,1,1,10,20,30};     //线的宽度
for(int i=0;i<8;i++)
{
dc.TextOut(nLeft,(i+1)*30,PenStyleName[i]);         //绘制提示文本
LinePen.CreatePen(PenStyle[i],nsize[i],RGB(255,0,0));     //建立CPen对象
if(i==0)
pOldPen=dc.SelectObject(&LinePen);    //记录原画笔
else
dc.SelectObject(&LinePen);
dc.MoveTo(140,(i+1)*30+10);
dc.LineTo(340,(i+1)*30+10);     //画线
LinePen.DeleteObject();        //释放CPen类对象所占的存储空间
}
dc.SelectObject(pOldPen);     //恢复原来的画笔
}
(3)运行结果如图1所示。

图1  CPen类使用实例

  评论这张
 
阅读(4356)| 评论(2)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018