1. BeginPaint和EndPaint用在WM_PAINT消息处理当中;GetDC可以在处理非WM_PAINT消息时获取设备描述表句柄。

2. BeginPaint返回的设备描述表句柄只能在PAINTSTRUCT结构中指定的矩形范围内绘图,并使该矩形区域有效;GetDC返回的设备描述表句柄可以在整个窗口客户区上绘图,但不使客户区中任何可能的无效区域变得有效。

GetWindowDC传回的则是整个窗口的hdc(包括标题栏)

因为存在无效区域,如果是用GETDC来得到地话,程序的

消息队列中间就会有源源不断地出现WM——PAINT的消息,必须调用VALIDATERECT函

数,使无效区域变成有效,但是调用BEGINPAINT中它就自动完成了对后者的调用。

GDI的绘图函数基本上都是有状态的,所有的函数都要求一个HDC类型的句柄。这个HDC的获得有几个途径BeginPaint,GetWindowDC, GetDC.他们的参数都只需要一个HWND就差不多了。记得调用了BeginPaint后要调用EndPaint进行清理,调用GetWindowDC和GetDC后要调ReleaseDC进行清理。在MFC代码中常常遇到的CDC CPaintDC CWindowDC CClientDC。在这里稍作解释。

CDC :例如用GDI画矩形要Rectangle(hDC,...),而使用CDC则是dc.Rectangle(...),由此可见CDC主要是把原本需要HDC作为参数的GDI函数封装了一下,HDC成了它的一个成员变量。

CPaintDC CWindowDC CClientDC:他们都是从CDC继承,分别是对上面所说的BeginPaint,GetWindowDC, GetDC调用对进行封装(CPaintDC构造时调用BeginPaint,析构时调用EndPaint,其余同理)。

BeginPaint:一般用在对WM_PAINT的响应函数中使用

GetWindowDC:可获得整个Window的HDC,而GetDC仅能获得客户区的HDC,区别就在于--

前者有效地绘制区域是整个窗口(边框、标题栏、客户区的总和)。

后者有效地绘制区域仅限于客户区。

两者的坐标系都是相对坐标而非屏幕坐标,原点是(0,0)。即以自己可绘制区域的左上角作为原点。

这里可以顺带的讲讲RECT了,RECT是一个结构,依次有4个成员left,top,right,bottom用来代表一个矩形区域。CRect从RECT继承,提供了一些常用的操作(例如说位移,缩小等等),其实就是改变4个成员的值。完全不用CRect也可以。许多GDI函数都要求一个RECT作为参数,或者类似的用(x,y,cx,cy)作参数,其实也就是一个RECT变种,用了宽度和高度罢了。

java getdc_GetWindowDC-BeginPaint-GetDC 区别详解相关推荐

  1. java中$和 的区别详解_Mybatis之#{}与${}的区别使用详解

    1.两种取值方式的差异 mapper.xml映射文件 select * from t_emp WHERE emp_id=${id} and emp_name=#{name} java查询代码 para ...

  2. JAVA与C++的区别详解

    转自:微点阅读  https://www.weidianyuedu.com JAVA和C++都是面向对象语言.也就是说,它都能够实现面向对象思想(封装,继乘,多态).而由于c++为了照顾大量的C语言使 ...

  3. Java浅克隆与深克隆区别详解与实现,以及String类型属性克隆为什么不受影响?克隆clone()方法中为什么是super.clone()

    1. 浅克隆实现 public class CloneTest {public static void main(String[] args) throws CloneNotSupportedExce ...

  4. java中$和 的区别详解_MyBatis中#{}和${}的区别详解

    区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111& ...

  5. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  6. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  7. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  8. 深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    转载自  深入Synchronized和java.util.concurrent.locks.Lock的区别详解 本篇文章是对Synchronized和java.util.concurrent.loc ...

  9. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  10. java之yield(),sleep(),wait()区别详解-备忘笔记

    java之yield(),sleep(),wait()区别详解-备忘笔记 1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如 ...

最新文章

  1. Hibernate中的实体映射
  2. pythonjson构建二维数组_python二维键值数组生成转json的例子
  3. RSA 前段加密 java 后台解密 已调试通过
  4. Android学习笔记(八)
  5. PlaceHolder和Panel的区别【搜藏】
  6. 第十七:如何搭建Pytest+Allure2环境(重点非常详细)
  7. 项目知识学习篇———PostgreSQL数据库
  8. matlab fspecial
  9. CFS任务的负载均衡(框架篇)
  10. vi编辑器替换字符串命令
  11. Hustoj_liveCD问题总结
  12. 详细解析单片机控制继电器原理图以及其作用
  13. 关于微信 init接口返回的Count和webwxbatchgetcontact post请求的参数Count
  14. unity——删除父物体下面的所有子物体
  15. 学习笔记|视觉语言导航任务
  16. @Valid使用详解
  17. mysql删除表中数据
  18. 北京航空航天大学软件学院2021年保研复试流程介绍+经验分享
  19. 学习OpenFOAM Tutorial snappyHexMesh
  20. 079-mxd-冒险岛-自主学习搭建-单机联机都可以,详细教程

热门文章

  1. 转转大师免费删除PDF文件密码
  2. [原创] 可爱蓝瑞雪....蓝楼。
  3. (三)单片机按键检测
  4. 被动元件(Passive components)
  5. 在Linux中怎样搜索链接文件,如何使用find命令在Linux中查找文件
  6. JavaScript 通过正则测试页面是否出现连续的重复字符
  7. ESP32-C3入门教程 网络 篇(一、 Wi-Fi 使用入门 — 初始化及STA、AP模式)
  8. Elasricsearch搜索速度优化
  9. 基于MATLAB/Simulink的电力电子电路仿真技术——PPT链接
  10. FMS2016设NVMe主题展区 Memblaze展示PBlaze4及FlashRAID