CDC和CPaintDC、CClientDC、CWindowDC_第1页
CDC和CPaintDC、CClientDC、CWindowDC_第2页
CDC和CPaintDC、CClientDC、CWindowDC_第3页
CDC和CPaintDC、CClientDC、CWindowDC_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CDC,CClientDC,CPaintDC,CWindowDC 比较区别MFC中的CDC,CClientDC,CPaintDC,CWindowDC的区别CDC是Windows绘图设备的基类。CClientDC:(1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。CPaintDC:(1)用于响应窗口重绘消息(WM_PAINT)是的绘图输出。(2)CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。 EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则 WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。(3)CPaintDC也只能用在WM_PAINT消息处理之中。CWindowDC:(1)可在非客户区绘制图形,而CClientDC,CPaintDC只能在客户区绘制图形。(2)坐标原点是在屏幕的左上角,CClientDC,CPaintDC下坐标原点是在客户区的左上角。(3)关联一特定窗口,允许开发者在目标窗口的任何一部分进行绘图,包含边界与标题,这种DC同WM_NCPAINT消息一起发送。=CPaintDC用于响应窗口重绘消息(WM_PAINT)是的绘图输出。CPaintDC在构造函数中调用BeginPaint() 取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。EndPaint()除了释放设备上下文外,还负责从消息队列中清除 WM_PAINT消息。因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT消息无法从消息队列中清除,将引起不断的窗口重画。 CPaintDC也只能用在WM_PAINT消息处理之中。系统何时发送WM_PAINT消息?系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小 化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制 操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和InvalidateRgn函数来完成的。 InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生WM_PAINT消息。系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息 呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过 InvalidateRect和InvaliateRgn使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次 重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适 的时机发送WM_PAINT消息的机制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟 并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage 发送一条WM_PAINT消息来强制立即重画,但不如使用Windows GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送 WM_PAINT消息而不管Update Region是否为空等。说明:在绘图时推荐使用CClientDC,CPaintDC和CWindowDC对象,而不推荐直接使用CDC对象。建立项目,采用单文档结构HDC:首先在CYourClassView类中add windows message handler, 一个是LButtonDown, 另一个是LButtonUp. 添加成员变量:m_ptOrigin用来记录初始点位置。在view结构体中初始化m_ptOrigin变量:CYourClassView: CYourClassView () / TODO: add construction code here m_ptOrigin=0;在LButtonDown函数里面添加代码:void CYourClassView:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default m_ptOrigin=point; CView:OnLButtonDown(nFlags, point);在LButtonUp中添加代码,首先使用HDC:void CYourClassView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default HDC hdc; hdc=:GetWindowDC(m_hWnd); MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); LineTo(hdc,point.x,point.y); :ReleaseDC(m_hWnd,hdc);CView:OnLButtonUp(nFlags, point);使用CDC:void CYourClassView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CDC *pdc=GetDC(); pdc-MoveTo(m_ptOrigin); pdc-LineTo(point); ReleaseDC(pdc);CView:OnLButtonUp(nFlags, point);使用CClientDC:void CYourClassView:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default CClientDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);CView:OnLButtonUp(nFlags, point);使用CWindowDC:void CYourClassView:OnLButtonUp(UINT nFlags, CPoint p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论