关于MFC中设备环境对象CDC的一些浅显的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 11:09:09
CDC是一种很特殊的类 小弟初学 还有点不是很明白
CDC常用的有CWindowDC CClientDC 和 CPaintDC
CPaintDC的构造函数和析构函数分别调用了BeginPaint()和EndPaint()

问题1是:这个EndPaint()不仅要析构CDC对象 还要结束清楚消息队列中的WM_PAINT消息 请问是不是当窗口需要重绘的时候 windows会不断的发送很多WM_PAINT消息啊(不是就发一个) 不然怎么会需要清楚消息队列中的WM_PAINT 那windows什么时候停止发送WM_PAINT呢?

CWindowDC是获得一个窗口而不是客户区的设备环境的类
问题2:那么请问在这个DC中 坐标(0,0)代表的是相应窗口的左上角(就是那个标题栏的左上角)还是整个屏幕(就是液晶屏幕)的左上角啊?

CClientDC是一个获得相应窗口客户区的设备环境的类 它的构造函数调用GetDC(),而析构函数调用ReleaseDC()
问题3:这个DetDC()如何保证得到的就是一个客户区的DC呢 为什么就不是窗口DC呢 难道对GetDC()的定义就是获得一个客户区的DC嘛? 抱歉 我对这个不是很了解

问题4:我在书上看到一句话 原文是:“我们要记住,视图窗口没有非客户区域,因此CWindowDC更适合框架窗口,而不是视图窗口”
这个我又迷糊了 什么是视图窗口?CView对象代表的那个窗口是没有非客户区的?而那个最大的框架窗口是CMDIFrameWnd对象是有的 是这个意思吗?每个CView外面包的一个框架窗口对象是一个CMDIChildWnd对象才拥有每个子窗口的非客户区?是不是我理解的这样

请高手指教 如果有菜鸟的地方 请不要笑话我 我很笨 尽量用通俗的话 不要复制一大段术语过来 好吗 我肯定会追加分数的
PS 如果我在非客户区乱涂乱画 是不是那些工具栏 菜单栏 甚至标题栏都会被我“涂鸦”呢?那我点击那些地方 会不会就没有作用了?

1
只要存在无效域就会重画,就有WM_PAINT ,EndPaint()作用就是消除无效域,
WM_PAINT 消息优先级别很低,系统会将几个WM_PAINT 无效域叠加,
2
Windows系统最常见的程序,由两个窗口组成,一个是主窗口,一个是视图窗口,就是记事本中间白色的部分,
视图窗口在前,盖住了主窗口,而菜单标题栏却没有被盖住,所以你看到大部分的是视图窗口
CWindowDC获得的是标题栏左上角,CClientDC是获得视图窗口,就是记事本中间白色的左上角
GetDC()是根据类来的,主窗口获得WindowDC

是不是那些工具栏 菜单栏 甚至标题栏都会被我“涂鸦

是的,但是其他地方却不行

原因是 视图窗口在前,盖住了主窗口

问题1
只要被盖住,就要重画,就发一个WM_PAINT

问题2
CWindowDC 包括 由CClientDC+标题栏; CClientDC 标题栏以下部分; CPaintDC 是CClientDC的真子集,且是无效的区域,重新绘制时要用到BeginPaint,EndPaint.如果往一个对话框上绘整个客户区大小的图应该可以用CClientDC,如果小于整个客户区请用CPaintDC

问题3
GetDC()是CWnd类的一个方法,你要注意一下你使用的类都是继承CWnd类的.
直接使用GetDC()相当于this->GetDC();

视图窗口...就是多文档的,框架窗口..是对话框的,
文档的的子文档是可以移动的,位置就不适合用CWindowDC来得到.不然很容易画到外面去..对话框的就固定了,标题栏就那么高..

你非客户区乱涂乱画...还是会被刷回来的,结果就是没效果

1: 在需要重绘的时候就会发,如窗口缩放,遮盖等
2: 代表响应窗口的左上角(含标题栏)
3: GetDc只得到给定窗口的客户区,得到窗口整个用GetWindowDc
4:视图窗口 就是指的CView客户区窗口