关于WNDCLASS结构体的style成员变量的疑问?

赤勇玄心行天道 2019-03-15 07:42:03
1、MSDN说CS_VREDRAW和CS_HREDRAW标记会在窗口移动或大小改变的时候会重绘整个窗口,但我测试了发现只有在大小改变的时候会重绘整个窗口,移动的时候则不会,请问是这样吗?

2、CS_OWNDC标记和CS_CLASSDC标记难道不冲突吗?前一个说每个窗口都有一个DC,后一个说每个窗口都用相同的DC,这到底啥意思?

3、CS_PARENTDC标记的意思是不是说该窗口类的窗口用父窗口的DC?
...全文
106 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
在各位大神的帮助下,我终于彻底搞懂了,赶紧贴出来。

CS_OWNDC(0x00000020):
如果设置本标记,表示为属于本窗口类的每个窗口自动分配一个唯一私有的设备上下文,也就是从属于本窗口类的任何一个窗口多次调用GetDC()函数时获得的设备上下文始终不变,且不需要调用ReleaseDC()函数释放设备上下文,在窗口销毁时系统会自动释放。注意,尽管这样是很方便,但它必须慎重使用,因为每个设备上下文大约要占800个字节的内存。
CS_CLASSDC(0x00000040):
如果设置本标记,表示为属于本窗口类的所有窗口自动分配一个唯一公用的设备上下文,也就是属于从本窗口类的所有窗口调用GetDC()函数时获得的设备上下文都是一样的,且不需要调用ReleaseDC()函数释放设备上下文,在窗口销毁时系统会自动释放。当多线程同时使用该设备上下文时,系统只允许一个线程成功完成其绘画操作,此时其他线程将获得的是临时的设备上下文。
CS_PARENTDC(0x00000080):
如果设置本标记,表示属于本窗口类的每个窗口的客户区范围扩充到父窗口的客户区上,但坐标不变。这样窗口的设备上下文在超出本窗口的客户区上绘画时就画在了父窗口的客户区上,且该设备上下文存储在已经分配好的系统缓冲区中,从而提高系统性能,但还是需要调用ReleaseDC()函数释放设备上下文。注意:调用GetDC()函数时获得的设备上下文是临时的,且不是父窗口的。
如果不设置本标记,表示属于本窗口类的每个窗口的设备上下文只能画在自己窗口的客户区上。这样窗口的设备上下文在超出本窗口的客户区上绘画时就看不见了。
注意:CS_OWNDC、CS_CLASSDC、CS_PARENTDC标记最多只能选择一个。
如果选择“CS_OWNDC | CS_CLASSDC”,则以CS_OWNDC为准。
如果选择“CS_OWNDC | CS_PARENTDC”,则以CS_PARENTDC为准。
如果选择“CS_CLASSDC | CS_PARENTDC”,则以CS_PARENTDC为准。
如果选择“CS_OWNDC | CS_CLASSDC | CS_PARENTDC”,则以CS_PARENTDC为准。
Eleven 2019-03-18
  • 打赏
  • 举报
回复
CS_CLASSDC: 该窗口类的所有窗口实例都共享一个窗口类DC。
CS_OWNDC: 给予每个窗口实例它本身的DC。注意,尽管这样是很方便,但它必须慎重使用,因为每个DC大约要占800个字节的内存。
CS_PARENTDC: 将子窗口的裁剪区域设置到父窗口的DC中去,这样子窗口便可以在父窗口上绘制自身。注意,这是子窗口还是从系统缓存中获取DC,而不是使用父窗口的DC。使用该风格可以提高系统性能。
worldy 2019-03-18
  • 打赏
  • 举报
回复
1、MSDN说CS_VREDRAW和CS_HREDRAW标记会在窗口移动或大小改变的时候会重绘整个窗口,但我测试了发现只有在大小改变的时候会重绘整个窗口,移动的时候则不会,请问是这样吗?

实际上只有z轴移动(由后移动到前面)和窗口变大时才会重绘窗口,其他则不会

2、CS_OWNDC标记和CS_CLASSDC标记难道不冲突吗?前一个说每个窗口都有一个DC,后一个说每个窗口都用相同的DC,这到底啥意思?
CS_CLASSDC 类的所有窗口类公用一个独立的DC,CS_OWNDC每个窗口有独立的DC

3、CS_PARENTDC标记的意思是不是说该窗口类的窗口用父窗口的DC?
使用父窗口的DC,很少用
zh359780498 2019-03-18
  • 打赏
  • 举报
回复
窗口移动到屏幕范围外移出来的时候也会触发窗口重绘,不过这里重绘的无效区域是刚显示那块区域
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
1 移动的时候则不会
2 CS_OWNDC 拥有一个DC (否则是 ,临时 创建一个 DC)
CS_CLASSDC 所有类对象拥有同一个DC
3 使用父窗口的DC


2、如果CS_OWNDC和CS_CLASSDC同时指定,会怎么样?
schlafenhamster 2019-03-16
  • 打赏
  • 举报
回复
2、如果CS_OWNDC和CS_CLASSDC同时指定,会怎么样?
没必要 吧 ?
schlafenhamster 2019-03-15
  • 打赏
  • 举报
回复
1 移动的时候则不会
2 CS_OWNDC 拥有一个DC (否则是 ,临时 创建一个 DC)
CS_CLASSDC 所有类对象拥有同一个DC
3 使用父窗口的DC

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧