VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx

上传人:b****6 文档编号:7379204 上传时间:2023-01-23 格式:DOCX 页数:8 大小:60.79KB
下载 相关 举报
VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx_第1页
第1页 / 共8页
VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx_第2页
第2页 / 共8页
VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx_第3页
第3页 / 共8页
VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx_第4页
第4页 / 共8页
VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx

《VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx》由会员分享,可在线阅读,更多相关《VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx(8页珍藏版)》请在冰豆网上搜索。

VS和MFC编程入门之50图形图像GDI对象之画笔CPen.docx

VS和MFC编程入门之50图形图像GDI对象之画笔CPen

VS2010和MFC编程入门之50(图形图像:

GDI对象之画笔CPen)

VS2010MFC编程入门之五十(图形图像:

GDI对象之画笔CPen)

理解了CDC类及其屏幕绘图函数,这里主要内容是GDI对象之画笔CPen。

GDI对象

在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObject类有六个直接的派生类,GDI对象主要也是这六个,分别是:

CBitmap、CBrush、CFont、CPalette、CPen和CRgn。

在这六个GDI对象中,最常用的莫过于画笔和画刷了,即CPen类和CBrush类。

本文就主要讲解画笔的使用。

画笔的应用实例

在这里直接通过一个波形图的实例,来详细讲解画笔的使用方法。

首先介绍此实例要实现的功能:

在对话框上有一个Picture控件,将此控件的背景填充为黑色;启动一个定时器,每次定时器到时,所有波形数据都前移一个单位,并获取一个80以内的随机数作为波形的最后一个数据,然后以绿色画笔在绘图控件上绘制波形。

这样就实现了波形的绘制及动态变化。

下面是具体实施步骤:

1、创建一个基于对话框的MFC工程,名字设为“Example50”。

2、在自动生成的对话框模板IDD_EXAMPLE50_DIALOG中,删除“TODO:

Placedialogcontrolshere.”静态文本框,添加一个Picture控件,ID设为IDC_WAVE_DRAW。

3、为Picture控件IDC_WAVE_DRAW添加CStatic变量,名称设为m_picDraw。

4、在文件Example50Dlg.h文件中CExample50Dlg类声明的上面添加宏定义:

memset(m_nzValues,0,sizeof(int)*POINT_COUNT);

}

7、在CExample50Dlg对话框的初始化成员函数CExample50Dlg:

:

OnInitDialog()中,构造随机数生成器,并启动定时器。

CExample50Dlg:

:

OnInitDialog()修改如下:

 

C++代码

BOOLCExample50Dlg:

:

OnInitDialog()

{

CDialogEx:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

BOOLbNameValid;

CStringstrAboutMenu;

bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

//以时间为种子来构造随机数生成器

srand((unsigned)time(NULL));

//启动定时器,ID为1,定时时间为200ms

SetTimer(1,200,NULL);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

8、为CExample50Dlg类添加波形绘制的成员函数CExample50Dlg:

:

DrawWave(CDC*pDC,CRect&rectPicture),参数分别为设备上下文指针和绘图的矩形区域。

 

C++代码

voidCExample50Dlg:

:

DrawWave(CDC*pDC,CRect&rectPicture)

{

floatfDeltaX;//x轴相邻两个绘图点的坐标距离

floatfDeltaY;//y轴每个逻辑单位对应的坐标值

intnX;//在连线时用于存储绘图点的横坐标

intnY;//在连线时用于存储绘图点的纵坐标

CPennewPen;//用于创建新画笔

CPen*pOldPen;//用于存放旧画笔

CBrushnewBrush;//用于创建新画刷

CBrush*pOldBrush;//用于存放旧画刷

//计算fDeltaX和fDeltaY

fDeltaX=(float)rectPicture.Width()/(POINT_COUNT-1);

fDeltaY=(float)rectPicture.Height()/80;

//创建黑色新画刷

newBrush.CreateSolidBrush(RGB(0,0,0));

//选择新画刷,并将旧画刷的指针保存到pOldBrush

pOldBrush=pDC->SelectObject(&newBrush);

//以黑色画刷为绘图控件填充黑色,形成黑色背景

pDC->Rectangle(rectPicture);

//恢复旧画刷

pDC->SelectObject(pOldBrush);

//删除新画刷

newBrush.DeleteObject();

//创建实心画笔,粗度为1,颜色为绿色

newPen.CreatePen(PS_SOLID,1,RGB(0,255,0));

//选择新画笔,并将旧画笔的指针保存到pOldPen

pOldPen=pDC->SelectObject(&newPen);

//将当前点移动到绘图控件窗口的左下角,以此为波形的起始点

pDC->MoveTo(rectPicture.left,rectPicture.bottom);

//计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线

for(inti=0;i

{

nX=rectPicture.left+(int)(i*fDeltaX);

nY=rectPicture.bottom-(int)(m_nzValues[i]*fDeltaY);

pDC->LineTo(nX,nY);

}

//恢复旧画笔

pDC->SelectObject(pOldPen);

//删除新画笔

newPen.DeleteObject();

}

9、有了定时器和绘图成员函数,我们就可以在WM_TIMER消息的响应函数中添加对波形数据的定时处理和对波形的定时绘制了。

定时器及WM_TIMER消息处理函数的添加方法如果忘记了,可以再到VS2010/MFC编程入门之四十四(MFC常用类:

定时器Timer)温习下。

WM_TIMER消息的处理函数修改如下:

 

C++代码

voidCExample50Dlg:

:

OnTimer(UINT_PTRnIDEvent)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CRectrectPicture;

//将数组中的所有元素前移一个单位,第一个元素丢弃

for(inti=0;i

{

m_nzValues[i]=m_nzValues[i+1];

}

//为最后一个元素赋一个80以内的随机数值(整型)

m_nzValues[POINT_COUNT-1]=rand()%80;

//获取绘图控件的客户区坐标

//(客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标)

m_picDraw.GetClientRect(&rectPicture);

//绘制波形图

DrawWave(m_picDraw.GetDC(),rectPicture);

CDialogEx:

:

OnTimer(nIDEvent);

}

10、在对话框销毁时,定时器应关闭。

所以为CExample50Dlg类添加WM_DESTROY消息的处理函数,并修改如下:

 

C++代码

voidCExample50Dlg:

:

OnDestroy()

{

CDialogEx:

:

OnDestroy();

//TODO:

Addyourmessagehandlercodehere

//关闭定时器

KillTimer

(1);

}

11、一切准备就绪,编译运行。

最终的效果如下图:

关于画笔,就讲到这里了,下一节将为大家简单讲讲画刷的使用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1