VS2010和MFC编程入门之50(图形图像:GDI对象之画笔CPen)
-
资源ID:471848643
资源大小:70.96KB
全文页数:9页
- 资源格式: DOCX
下载积分:15金贝
快捷下载
账号登录下载
微信登录下载
微信扫一扫登录
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
|
下载须知 | 常见问题汇总
|
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: 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+ 代码intm_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 < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(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 control8 、为 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 和 fDeltaYfDeltaX = (float)rectPicture.Width() / (POINT_COUNT - 1);fDeltaY = (float)rectPicture.Height() / 80;/ 创建黑色新画刷newBrush.CreateSolidBrush(RGB(0,0,0);/选择新画刷,并将旧画刷的指针保存到pOldBrushpOldBrush = pDC->SelectObject(&newBrush);/ 以黑色画刷为绘图控件填充黑色,形成黑色背景pDC->Rectangle(rectPicture);/ 恢复旧画刷pDC->SelectObject(pOldBrush);/ 删除新画刷newBrush.DeleteObject();/ 创建实心画笔,粗度为 1,颜色为绿色newPen.CreatePen(PS_SOLID, 1, RGB(0,255,0);/选择新画笔,并将旧画笔的指针保存到pOldPenpOldPen = pDC->SelectObject(&newPen);/ 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点pDC->MoveTo(rectPicture.left, rectPicture.bottom);/ 计算 m_nzValues 数组中每个点对应的坐标位置,并依次连接,最终形成曲线for (int i=0; i<POINT_COUNT; i+)nX = rectPicture.left + (int)(i * fDeltaX);nY = rectPicture.bottom - (int)(m_nzValuesi * fDeltaY);pDC->LineTo(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;/ 将数组中