ImageVerifierCode 换一换
格式:DOCX , 页数:5 ,大小:17.28KB ,
资源ID:16691496      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16691496.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC橡皮筋画线实现文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC橡皮筋画线实现文档格式.docx

1、:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView:ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView:OnFilePrintPreview)END_MESSAGE_MAP()第二个是在头文件中,如:protected:/AFX_MSG(CTextView)afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);/AFX_MSGDECLARE_MESSAGE_M

2、AP()第三个,也是在源文件中的函数功能实现,如:void CTextView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defaultm_p=point;CView:OnLButtonDown(nFlags, point);OnLButtonUp(UINT nFlags, CPoint point) HDC hdc;hdc=:GetDC(m_hWnd);MoveToEx(hdc,m_p.x,m_p.y,NULL);LineTo(hdc,poin

3、t.x,point.y);ReleaseDC(m_hWnd,hdc);OnLButtonUp(nFlags, point); 这是我们利用向导添加系统消息,就是上述改动,但有时我们要手工添加消息,就有以下步骤,看和向导添加消息有什么不同, 1.首先在源文件中的开始位置定义一个用户消息,如#define WM_MYMESSAGE WM_USER+1 2.然后在头文件中定义消息处理函数,这是和向导添加消息一样的(同样的位置),如: afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam); 3.再就在源文件中添加自定义消息映射宏,这也是和向导

4、添加消息一样的(同样的位置),如: ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) 4 .最后在相关函数中,进行消息的发送操作,就可以消息有效了,如: SendMessage(WM_MYMESSAGE);/消息的发送有三种方式,详细参见MSDN 下面我们来看画线操作的实现,参见void CTextView:OnLButtonUp(UINT nFlags, CPoint point)的代码,首先是添加类的变量,m_p在构造函数中初始化,再在void CTextView:OnLButtonDown(UINT nFlags, CPoint point) 中赋值,point也

5、是一个类CPoint ,它表示当前操作时,光标的位置.从代码中我们可以看到首先定义了一个HDC,它是设备描述表的句柄,我们在作画时也必须先定义一个作画的设备,才能往下进行操作,当然在这里我们也可以用如CClientDC,CDC,CWindowDC,来实现这一功能.HDC定义的一个变量用hdc=:来得到当前视图类的句柄,相关操作后也要用 :来释放.这里的画线是用GDI的方法来实现的.这里注意一下我们用的GetDC函数是Windows GDI 的函数,是一个全局函数. 上面提到了除了用HDC创建设备的方法还有其他方法. 我们换用CDC来实现述功能,源代码改成: void CTextView: CD

6、C *pDC=GetDC();pDC-MoveTo(m_p);LineTo(point);ReleaseDC(pDC); 运行后我们可以看到利用CDC同样也能画线功能,但是我们会发现这里的GetDC()和ReleaseDC(pDC)前没有:,也就是说这里的这两个函数不是全局函数,其实这两个函数是封装在CDC这个类里的成员函数,而且MoveTo(m_p)和LineTo(point)也是成员函数,所以用指针调用. 接下来我们用CClientDC来实现.实际上我们参见MSDN的话就会发现,CClientDC是由CDC这个类派生出来的,所以它继承了CDC的所有功能,也有自己的一些功能实现.而且在CCl

7、ientDC类中的构造函数中就调用了GetDC这个函数,在它的析构函数中也调用了ReleaseDC函数,这就使的当我们创建CClientDC对象时,就已经获取了视图类的句柄,当它执行完后又通过析构函数释放了句柄.下面我们看它怎么实现: CClientDC dc(this);dc.MoveTo(m_p);dc.LineTo(point); 如果我们细心的话,会发现上面实现的实在视图框架中才能画线,假如我们要实现在框架类中也能画线,该怎么实现呢?其实很简单,只要把CClientDC dc(this);改成CClientDC dc(GetParent();就行了假如我们要实现在整个桌面上都能画线的话

8、就改成CClientDC dc(GetDesktopWindow();从上我们可以看出我们画线的区域是要看我们是调用的哪个类的指针对象.如果我们想实现在非客户区也能实现画线的话就把CClientDC dc(this);改成CWindowDC dc(this);就能实现. 简单的画线可以实现了,我们了解画线的基本实现过程,如果我们要能实现更复杂的操作,就要我们添加相应的代码来实现了.如果我们想画出的线条具有不同的颜色该怎么办呢? 第一步,我们就要创建画笔,用CPen这个类, 第二步就要把创建的画笔选到设备描述表中去,用SelectObject()函数,注意的是SelectObject()返回的是

9、选前画笔的指针,因为我们在做完操作后,还是要把原来的画笔选回的.具体的实现看下面的代码:CPen pen(PS_SOLID,0,RGB(0,255,0);CClientDC dc(this);CPen *pold=dc.SelectObject(&pen); dc.MoveTo(m_p);dc.SelectObject(pold);如果我们想得到其他颜色或者线形就参见MSDN,改变相应的参数就OK了. 我们想改变填充的颜色式样又怎么实现呢? 当然还是要先创建笔刷对象,这里注意我们用dc.FillRect(CRect(m_p,point),&brush);这个函数时并不需要把笔刷选到设备描叙表中

10、,因为笔刷就直接用来填充了,如下面代码:CBrush brush(RGB(0,255,0);dc.FillRect(CRect(m_p,point),& 我们在这个基础上来实现位图画刷的功能,首先还是要添加一个位图资源或者导入一个位图资源,设其ID为IDB_BITMAP1;如下代码:CBitmap bitmap;bitmap.LoadBitmap (IDB_BITMAP1);CBrush brush(&bitmap); 我们在说明一下画刷中的一个特例,就是透明画刷的实现,一般情况下我们要实现某一个类的一个功能就通过MSDN先到这个类的构造函数中去看有没有参数来实现这个功能,然后再到它的初使化函

11、数中去看能不能通过初始化函数来实现,CBrush *pbrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);CBrush *pold=dc.SelectObject(pbrush);dc.Rectangle (CRect(m_p,point); 我们注意到,我们用了一个GetStockObject(NULL_BRUSH)函数来得到一个透明画刷,但是它返回的是一个HGDIOBJ类型,而我们需要调用的是一个CBrush类型,这里在CBrush类中FromHandle函数,它是一个静态的转化函数,从源代码可以看出它能把HBRUSH类型转化

12、为CBrush类型,而GetStockObject(NULL_BRUSH)返回的是HGDIOBJ类型,所以我们用了一个强制转化符,因为这里是用矩形填充是后画盖住前画来实现透明画刷的,所以要选入设备描叙表,最后要选回原来的画刷. 这里说到了静态函数,注意静态函数不能调用非静态成员函数和变量的,而非静态成员函数是可以引用静态成员函数或变量的,但要切记静态成员变量必须初始化,在类的外部初始化如: int point:x=0; 前面我们所实现的还只是画一条直线,要画曲线该如何实现呢? 首先我们要添加一个BOOL型的变量,并初始化m_d=FALSE,然后添加一个WM_MOUSEMOVE的消息,添加了一个OnMouseMove()函数,根据BOOL行变量来判断,添加相关代码就可以实现了,如:void CSdView:m_d=TRUE;m_d=FALSE;OnMouseMove(UINT nFlags, CPoint point) if(m_d=TRUE)OnMouseMove(nFlags, point);当然还可以进行更复杂的绘图,另外还可以用SetROP2();函数来设置绘图模式,详细参见MSDN

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

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