CDC,CClientDC,CPaintDC,CWindowDC 比较区别
来源:互联网 发布:李小龙英雄再现 源码 编辑:程序博客网 时间:2024/05/01 21:09
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 point) {
// TODO: Add your message handler code here and/or call default CWindowDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
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 point) {
// TODO: Add your message handler code here and/or call default CWindowDC dc(this); dc.MoveTo(m_ptOrigin); dc.LineTo(point);
CView::OnLButtonUp(nFlags, point);
- CDC,CClientDC,CPaintDC,CWindowDC 比较区别
- CDC,CClientDC,CPaintDC,CWindowDC 比较区别
- CDC,CClientDC,CPaintDC,CWindowDC 比较区别
- CDC,CClientDC,CPaintDC,CWindowDC 比较区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CPaintDC 、CWindowDC、 CClientDC、 CDC
- CClientDC,CPaintDC,CWindowDC,CDC
- CDC,CPaintDC,CWindowDC,CClientDC
- HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别
- HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别
- CDC,CPaintDC,CClientDC,CWindowDC的区别
- HDC,CDC,CPaintDC,CClientDC,CWindowDC区别
- CClientDC CDC CPaintDC CWindowDC 的区别
- CClientDC CDC CPaintDC CWindowDC 的区别
- MFC分割窗口防止用户改变窗格的大小
- tar、zip 、unzip 打包与压缩
- java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)
- 改写linux窗口程序设计的Qt例子(4)
- android图像处理系列之六--给图片添加边框(下)-图片叠加
- CDC,CClientDC,CPaintDC,CWindowDC 比较区别
- linux 多次创建不同的UDP socket进行通信,最终通信用的UDP 源端口以最后一次创建的socket使用的源端口为准
- CSS3 Box-sizing
- android 应用程序的目录结构
- android图片特效处理之怀旧效果
- Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
- 机器视觉开源处理库汇总
- PostGreSQL入门教程(一)- 安装及简介
- Android图像处理(2):怀旧效果