GDI对象之画笔CPen

上传人:平*** 文档编号:15546539 上传时间:2017-11-04 格式:DOC 页数:7 大小:135.28KB
返回 下载 相关 举报
GDI对象之画笔CPen_第1页
第1页 / 共7页
GDI对象之画笔CPen_第2页
第2页 / 共7页
GDI对象之画笔CPen_第3页
第3页 / 共7页
GDI对象之画笔CPen_第4页
第4页 / 共7页
GDI对象之画笔CPen_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《GDI对象之画笔CPen》由会员分享,可在线阅读,更多相关《GDI对象之画笔CPen(7页珍藏版)》请在金锄头文库上搜索。

1、首页 软件开发 VS2010/MFC 编程入门之五十(图形图像: GDI 对象之画笔 CPen)VS2010/MFC编程入门之五十(图形图像:GDI 对象之画笔CPen)分类标签: 编程入门 VS2010 VC MFC 上一节中鸡啄米讲了 CDC 类及其屏幕绘图函数,本节的主要内容是 GDI 对象之画笔CPen。GDI对象在 MFC 中,CGdiObject 类是 GDI 对象的基类,通过查阅 MSDN 我们可以看到,CGdiObject 类有六个直接的派生类,GDI 对象主要也是这六个,分别是:CBitmap、CBrush、CFont 、CPalette、CPen 和 CRgn。在这六个 G

2、DI 对象中,最常用的莫过于画笔和画刷了,即 CPen 类和 CBrush 类。本文就主要讲解画笔的使用。画笔的应用实例鸡啄米在这里直接通过一个波形图的实例,来详细讲解画笔的使用方法。首先介绍此实例要实现的功能:在对话框上有一个 Picture 控件,将此控件的背景填充为黑色;启动一个定时器,每次定时器到时,所有波形数据都前移一个单位,并获取一个 80 以内的随机数作为波形的最后一个数据,然后以绿色画笔在绘图控件上绘制波形。这样就实现了波形的绘制及动态变化。下面是具体实施步骤:1、创建一个基于对话框的 MFC 工程,名字设为“Example50”。2、在自动生成的对话框模板 IDD_EXAMP

3、LE50_DIALOG 中,删除“TODO: Place dialog controls here.”静态文本框 ,添加一个 Picture 控件,ID 设为 IDC_WAVE_DRAW。 3、为 Picture 控件 IDC_WAVE_DRAW 添加 CStatic 变量,名称设为 m_picDraw。4、在文件 Example50Dlg.h 文件中 CExample50Dlg 类声明的上面添加宏定义:C+代码1. #define POINT_COUNT 100 此符号常量的意义是波形的点数,这里 用 define 将其定义为符号常量 是为了方便以后可能的修改,假如我们以后想将点数改为 20

4、0,则只改此宏定义就可以了: #define POINT_COUNT 200,而如果没有使用符号常量,在程序中直接使用了 100,那么就需要将所有使用 100 的位置找出来,并替换为 200,这样不仅麻烦也很容易出错,所以最好是将其定义为符号常量。5、在 CExample50Dlg.h 文件中为 CExample50Dlg 类添加成员数组:C+代码1. int m_nzValuesPOINT_COUNT; 此数组用于存放波形数据。6、在 CExample50Dlg 类的构造函数中为数组 m_nzValues 的元素赋初值:C+代码1. CExample50Dlg:CExample50Dlg(C

5、Wnd* pParent /*=NULL*/) 2. : CDialogEx(CExample50Dlg:IDD, pParent) 3. 4. m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); 5. 6. / 将数组 m_nzValues的元素都初始化为 0 7. memset(m_nzValues, 0, sizeof(int) * POINT_COUNT); 8. 7、在 CExample50Dlg 对话框的初始化成员函数 CExample50Dlg:OnInitDialog()中,构造随机数生成器,并启动定时器。CExample50Dlg:O

6、nInitDialog()修改如下:C+代码1. BOOL CExample50Dlg:OnInitDialog() 2. 3. CDialogEx:OnInitDialog(); 4. 5. / Add About. menu item to system menu. 6. 7. / IDM_ABOUTBOX must be in the system command range. 8. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); 9. ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); 21. pSy

7、sMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 22. 23. 24. 25. / Set the icon for this dialog. The framework does this automatically 26. / when the applications main window is not a dialog 27. SetIcon(m_hIcon, TRUE); / Set big icon 28. SetIcon(m_hIcon, FALSE); / Set small icon 29. 30. / TO

8、DO: Add extra initialization here 31. 32. / 以时间为种子来构造随机数生成器 33. srand(unsigned)time(NULL); 34. 35. / 启动定时器, ID为 1,定时时间为 200ms 36. SetTimer(1, 200, NULL); 37. 38. return TRUE; / return TRUE unless you set the focus to a control 39. 8、为 CExample50Dlg 类添加波形绘制的成员函数 CExample50Dlg:DrawWave(CDC *pDC, CRect

9、 &rectPicture),参数分别为设备上下文指针和绘图的矩形区域。C+代码1. void CExample50Dlg:DrawWave(CDC *pDC, CRect &rectPicture) 2. 3. float fDeltaX; / x轴相邻两个绘图点的坐标距离 4. float fDeltaY; / y轴每个逻辑单位对应的坐标值 5. int nX; / 在连线时用于存储绘图点的横坐标 6. int nY; / 在连线时用于存储绘图点的纵坐标 7. CPen newPen; / 用于创建新画笔 8. CPen *pOldPen; / 用于存放旧画笔 9. CBrush newB

10、rush; / 用于创建新画刷 10. CBrush *pOldBrush; / 用于存放旧画刷 11. 12. / 计算 fDeltaX和 fDeltaY 13. fDeltaX = (float)rectPicture.Width() / (POINT_COUNT - 1); 14. fDeltaY = (float)rectPicture.Height() / 80; 15. 16. / 创建黑色新画刷 17. newBrush.CreateSolidBrush(RGB(0,0,0); 18. / 选择新画刷,并将旧画刷的指针保存到 pOldBrush 19. pOldBrush = p

11、DC-SelectObject(&newBrush); 20. / 以黑色画刷为绘图控件填充黑色,形成黑色背景 21. pDC-Rectangle(rectPicture); 22. / 恢复旧画刷 23. pDC-SelectObject(pOldBrush); 24. / 删除新画刷 25. newBrush.DeleteObject(); 26. 27. / 创建实心画笔,粗度为 1,颜色为绿色 28. newPen.CreatePen(PS_SOLID, 1, RGB(0,255,0); 29. / 选择新画笔,并将旧画笔的指针保存到 pOldPen 30. pOldPen = pDC

12、-SelectObject(&newPen); 31. 32. / 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点 33. pDC-MoveTo(rectPicture.left, rectPicture.bottom); 34. / 计算 m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线 35. for (int i=0; iLineTo(nX, nY); 40. 41. 42. / 恢复旧画笔 43. pDC-SelectObject(pOldPen); 44. / 删除新画笔 45. newPen.DeleteObject(); 46. 9、有了定时器和绘

13、图成员函数,我们就可以在 WM_TIMER 消息的响应函数中添加对波形数据的定时处理和对波形的定时绘制了。定时器及 WM_TIMER 消息处理函数的添加方法如果忘记了,可以再到 VS2010/MFC 编程入门之四十四(MFC 常用类:定时器 Timer)温习下。WM_TIMER 消息的处理函数修改如下:C+代码1. void CExample50Dlg:OnTimer(UINT_PTR nIDEvent) 2. 3. / TODO: Add your message handler code here and/or call default 4. CRect rectPicture; 5. 6

14、. / 将数组中的所有元素前移一个单位,第一个元素丢弃 7. for (int i=0; iPOINT_COUNT-1; i+) 8. 9. m_nzValuesi = m_nzValuesi+1; 10. 11. / 为最后一个元素赋一个 80以内的随机数值(整型) 12. m_nzValuesPOINT_COUNT-1 = rand() % 80; 13. 14. / 获取绘图控件的客户区坐标 15. / (客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标) 16. m_picDraw.GetClientRect(&rectPicture); 17. 18. / 绘制波形图 19. DrawWave(m_picDraw.GetDC(), rectPicture); 20. 21. CDialogEx:OnTimer(nIDEvent); 22.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号