




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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: Place dialog controls here.”静态文本框,添加一个Picture控件,ID设为IDC_WAVE_DRAW。 3、为Picture控件IDC_WAVE_DRAW添加CStatic变量,名称设为m_picDraw。 4、在文件Example50Dlg.h文件中CExample50Dlg类声明的上面添加宏定义:C+代码#define POINT_COUNT 100 此符号常量的意义是波形的点数,这里用define将其定义为符号常量是为了方便以后可能的修改,假如我们以后想将点数改为200,则只改此宏定义就可以了:#define POINT_COUNT 200,而如果没有使用符号常量,在程序中直接使用了100,那么就需要将所有使用100的位置找出来,并替换为200,这样不仅麻烦也很容易出错,所以最好是将其定义为符号常量。 5、在CExample50Dlg.h文件中为CExample50Dlg类添加成员数组:C+代码int m_nzValuesPOINT_COUNT; 此数组用于存放波形数据。 6、在CExample50Dlg类的构造函数中为数组m_nzValues的元素赋初值:C+代码CExample50Dlg:CExample50Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CExample50Dlg:IDD, pParent) m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); / 将数组m_nzValues的元素都初始化为0 memset(m_nzValues, 0, sizeof(int) * POINT_COUNT); 7、在CExample50Dlg对话框的初始化成员函数CExample50Dlg:OnInitDialog()中,构造随机数生成器,并启动定时器。CExample50Dlg:OnInitDialog()修改如下:C+代码BOOL CExample50Dlg:OnInitDialog() CDialogEx:OnInitDialog(); / Add About. menu item to system menu. / IDM_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here / 以时间为种子来构造随机数生成器 srand(unsigned)time(NULL); / 启动定时器,ID为1,定时时间为200ms SetTimer(1, 200, NULL); return TRUE; / return TRUE unless you set the focus to a control 8、为CExample50Dlg类添加波形绘制的成员函数CExample50Dlg:DrawWave(CDC *pDC, CRect &rectPicture),参数分别为设备上下文指针和绘图的矩形区域。C+代码void CExample50Dlg:DrawWave(CDC *pDC, CRect &rectPicture) float fDeltaX; / x轴相邻两个绘图点的坐标距离 float fDeltaY; / y轴每个逻辑单位对应的坐标值 int nX; / 在连线时用于存储绘图点的横坐标 int nY; / 在连线时用于存储绘图点的纵坐标 CPen newPen; / 用于创建新画笔 CPen *pOldPen; / 用于存放旧画笔 CBrush newBrush; / 用于创建新画刷 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 (int i=0; iLineTo(nX, nY); / 恢复旧画笔 pDC-SelectObject(pOldPen); / 删除新画笔 newPen.DeleteObject(); 9、有了定时器和绘图成员函数,我们就可以在WM_TIMER消息的响应函数中添加对波形数据的定时处理和对波形的定时绘制了。定时器及WM_TIMER消息处理函数的添加方法如果忘记了,可以再到VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)温习下。 WM_TIMER消息的处理函数修改如下:C+代码void CExample50Dlg:OnTimer(UINT_PTR nIDEvent) / TODO: Add your message handler code here and/or call default CRect rectPicture; / 将数组中的所有元素前移一个单位,第一个元素丢弃 for (int i=0; iPOINT_COUNT-1; i+) m_nzValuesi = m_nzValuesi+1; / 为最后一个元素赋一个80以内的随机数值(整型) m_nzValuesPOINT_COUNT-1 = rand() % 80; / 获取绘图控件的客户区坐标 / (客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标) m_picDraw.GetClientRect(&rectPicture); / 绘制波形图 DrawWave(m_picDraw.GetDC(), rectPicture); CDialogEx:OnTimer(nIDEvent); 10、在对话框销毁时,定时器应关闭。所以为CExample50Dlg类添加WM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年甘肃陇南事业单位预计将于5月中旬发布考前自测高频考点模拟试题及完整答案详解一套
- 2025年福建省宁德市霞浦县实验幼儿园招聘若干人考前自测高频考点模拟试题附答案详解(完整版)
- 2025年浙江宁波市卫生健康委部分直属事业单位公开招聘高层次人才69人(第二批)考前自测高频考点模拟试题及一套答案详解
- 2025年福建南平武夷有轨电车有限公司招聘1人模拟试卷参考答案详解
- 2025年甘肃省兰州大学土木工程与力学学院聘用制(B岗)人员招聘模拟试卷及一套答案详解
- 保定市人民医院胸腔镜食管癌切除术技术考核
- 2025广西南宁市江南区翠湖路小学春季学期临聘教师招聘1人模拟试卷及完整答案详解1套
- 衡水市人民医院大量输血方案理论与实践考核
- 秦皇岛市中医院淋巴瘤病理分型与治疗方案选择考核
- 沧州市中医院胰腺术后长期随访考核
- 第二届“强国杯”技术技能大赛-工业大数据管理与分析赛项考试题库(含答案)
- 徐州市城市轨道交通1号线一期工程电动客车运营、修理及维护手册
- 制作并观察植物细胞临时装片教学设计(五篇模版)
- 导游证《中国古代建筑》知识考试(重点)题库(含答案)
- 《大气的组成和垂直分层》
- GB/T 2423.17-2024环境试验第2部分:试验方法试验Ka:盐雾
- 第一次月考试卷(月考)-2024-2025学年三年级上册数学人教版
- 新高考生物综合复习《稳态与调节》高考真题汇编(图片版含答案)
- CJT 399-2012 聚氨酯泡沫合成轨枕
- 中小微企业FTTR-B全光组网解决方案
- 第七单元单元任务“视频拍摄脚本写作”统编版高中语文必修上册
评论
0/150
提交评论