VS和MFC编程入门之50图形图像GDI对象之画笔CPenWord文档格式.docx
- 文档编号:20488961
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:8
- 大小:60.79KB
VS和MFC编程入门之50图形图像GDI对象之画笔CPenWord文档格式.docx
《VS和MFC编程入门之50图形图像GDI对象之画笔CPenWord文档格式.docx》由会员分享,可在线阅读,更多相关《VS和MFC编程入门之50图形图像GDI对象之画笔CPenWord文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
这样就实现了波形的绘制及动态变化。
下面是具体实施步骤:
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);
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),参数分别为设备上下文指针和绘图的矩形区域。
voidCExample50Dlg:
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);
//恢复旧画刷
SelectObject(pOldBrush);
//删除新画刷
newBrush.DeleteObject();
//创建实心画笔,粗度为1,颜色为绿色
newPen.CreatePen(PS_SOLID,1,RGB(0,255,0));
//选择新画笔,并将旧画笔的指针保存到pOldPen
pOldPen=pDC->
newPen);
//将当前点移动到绘图控件窗口的左下角,以此为波形的起始点
MoveTo(rectPicture.left,rectPicture.bottom);
//计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线
for(inti=0;
i<
POINT_COUNT;
i++)
nX=rectPicture.left+(int)(i*fDeltaX);
nY=rectPicture.bottom-(int)(m_nzValues[i]*fDeltaY);
LineTo(nX,nY);
//恢复旧画笔
SelectObject(pOldPen);
//删除新画笔
newPen.DeleteObject();
9、有了定时器和绘图成员函数,我们就可以在WM_TIMER消息的响应函数中添加对波形数据的定时处理和对波形的定时绘制了。
定时器及WM_TIMER消息处理函数的添加方法如果忘记了,可以再到VS2010/MFC编程入门之四十四(MFC常用类:
定时器Timer)温习下。
WM_TIMER消息的处理函数修改如下:
OnTimer(UINT_PTRnIDEvent)
Addyourmessagehandlercodehereand/orcalldefault
CRectrectPicture;
//将数组中的所有元素前移一个单位,第一个元素丢弃
POINT_COUNT-1;
m_nzValues[i]=m_nzValues[i+1];
//为最后一个元素赋一个80以内的随机数值(整型)
m_nzValues[POINT_COUNT-1]=rand()%80;
//获取绘图控件的客户区坐标
//(客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标)
m_picDraw.GetClientRect(&
rectPicture);
//绘制波形图
DrawWave(m_picDraw.GetDC(),rectPicture);
OnTimer(nIDEvent);
10、在对话框销毁时,定时器应关闭。
所以为CExample50Dlg类添加WM_DESTROY消息的处理函数,并修改如下:
OnDestroy()
OnDestroy();
Addyourmessagehandlercodehere
//关闭定时器
KillTimer
(1);
11、一切准备就绪,编译运行。
最终的效果如下图:
关于画笔,就讲到这里了,下一节将为大家简单讲讲画刷的使用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS MFC 编程 入门 50 图形图像 GDI 对象 画笔 CPen