https://www.hdzikao.com

CPaintDC成员函数(CClientDC几种DC及区别)【cclientdc与cpaintdc的区别】

[导读] 大家好,今天小热关注到一个比较有意思的话题,就是关于CPaintDC的问题,于是小编就整理了3个相关介绍CPaintDC的解答,让我们一起看看吧。 文章目录: CPaintDC成员函数 CClientDC几种DC及区别

CPaintDC成员函数(CClientDC几种DC及区别)【cclientdc与cpaintdc的区别】

大家好,今天小热关注到一个比较有意思的话题,就是关于CPaintDC的问题,于是小编就整理了3个相关介绍CPaintDC的解答,让我们一起看看吧。

文章目录:

  1. CPaintDC成员函数
  2. CClientDC几种DC及区别
  3. GetDC获取到的句柄可用来干嘛?

一、CPaintDC成员函数

CPaintDC类包含两个重要的成员变量,分别是m_ps和m_hWnd。

m_ps是一个公开的PAINTSTRUCT类型成员,它是通过CWnd::BeginPaint函数传递并填充的。这个PAINTSTRUCT结构包含了应用程序用于在与CPaintDC相关联的窗口的客户区进行绘制所需的所有信息。通过PAINTSTRUCT,你可以访问设备环境句柄,但更直接的方式是通过m_hDC,这是CPaintDC从CDC类继承来的。

m_hWnd则是CPaintDC对象所绑定的HWND,它是一个受保护的HWND类型变量,用于标识CPaintDC所关联的窗口句柄。

CPaintDC类的构造函数CPaintDC接受一个CWnd*类型的参数pWnd,其目的是为了创建一个CPaintDC对象,用于绘画应用程序窗口。在构造函数内部,会调用Windows的BeginPaint函数来获取PAINTSTRUCT,并将其存储在m_ps中。如果Windows在调用GetDC时失败,或者系统已无可用设备环境,构造函数会抛出CResourceException异常。Windows系统在任何给定时刻,通常只有五个公共显示环境可供应用程序竞争。[1][2]

扩展资料

CPaintDC类是一个来自CDC的设备环境类。它在构造期间执行CWnd::BeginPaint,在析构期间执行CWnd::EndPaint。   一个CPaintDC对象只在响应一个WM_PAINT消息的时候被使用,通常是在你的OnPaint消息处理成员函数中。

二、CClientDC几种DC及区别

CClientDC,也被称作客户区设备上下文,主要用于在特定窗口的客户区进行输出,它与窗口关联,并允许开发者访问窗口的客户区域。其构造时会通过GetDC获取设备上下文,而在析构时则会释放DC。使用时,通常在窗口或当前活动视图的上下文中创建,如:CClientDC dc(this); 然后可以进行文本输出,如dc.TextOut(10, 10, str, str.GetLength()); 如果在CScrollView中使用,还需确保调用OnPrepareDC(&dc)来调整设备上下文的坐标。

CPaintDC是另一种设备上下文,用于响应窗口重绘消息(WM_PAINT)时的绘图输出。构造时会通过BeginPaint获取设备上下文,析构时调用EndPaint释放。EndPaint除了释放DC,还会清除消息队列中的WM_PAINT消息。因此,处理窗口重画时,必须使用CPaintDC,否则会导致WM_PAINT消息不断循环,影响窗口的正常绘制。CPaintDC只适用于处理WM_PAINT消息。

CWindowDC则是关联特定窗口,开发者可以在窗口的任何部分,包括边界和标题区域进行绘图。这种设备上下文与WM_NCPAINT消息一同发送。它的坐标原点位于屏幕的左上角,与CClientDC和CPaintDC有所不同。

总结CClientDC、CPaintDC和CWindowDC的区别,CWindowDC的绘图范围更广泛,可以绘制非客户区,而CClientDC和CPaintDC则限于客户区。CClientDC和CPaintDC的坐标原点都在客户区,但CPaintDC是在OnPaint消息响应中使用,用于整体重画,保持窗口完整;CClientDC则适用于非响应WM_PAINT的情况,进行实时绘制,只重画指定区域。

三、GetDC获取到的句柄可用来干嘛?

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消息一起发送

说明:在绘图时推荐使用CClientDC,CPaintDC和CWindowDC对象,而不推荐直接使用CDC对象。

到此,以上就是小编对于CPaintDC的问题就介绍到这了,希望介绍关于CPaintDC的3点解答对大家有用。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读