MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 多年VC的困惑,该如何处理

多年VC的困惑,该如何处理

www.MyException.Cn  网友分享于:2013-04-27  浏览:61次
多年VC的困惑
学VC有大半年了,今天发现有几个基本的问题都没有搞清楚.
  建一个对话框,里面放一个树状控件.现在想把对话框的背景弄成渐变色.
  void CTestView::OnPaint()
{
//CPaintDC dc(this); // device context for painting,少这个后树状控件没有了
HDC hdc=::GetDC(m_hWnd);
RECT rect;
GetClientRect(&rect);

  //颜色渐变函数
DrawGradientV(hdc,RGB(49,68,212),RGB(147,255,255),rect);

::ReleaseDC(m_hWnd,hdc);
}
  我的问题是:
1)凡是对于背景的操作,比如画图,贴图等。是响应OnPaint()还是OnEraseBkgnd??????我知道都可以,但是谁能说说区别和各自优缺点?
2)上述OnPaint函数中,都是获得dc,都可以画背景,但是
  //CPaintDC dc(this); // 少这个后树状控件没有了????????
HDC hdc=::GetDC(m_hWnd);//CPaintDC dc(this)区别和联系????????
求解,希望大家都说说,讨论都有分,我现在是越来越迷茫了!!!
谢谢!!!!谢谢!!!!

------解决方案--------------------
1. 都可以,一般放到OnPaint函数中,OnEraseBkgnd函数return TRUE; 如果你觉得闪动比较厉害的话。
2. CPaintDC It performs a CWnd::BeginPaint at construction time and CWnd::EndPaint at destruction time. 绘制完父窗口,会再绘制所有的子窗口。如果你没有设置WS_CLIPCHILDREN属性的话。
------解决方案--------------------
僧推月下门和僧敲月下门都是可以的,这种地方推敲太多纯属浪费时间。
------解决方案--------------------
楼主个标题党。。
------解决方案--------------------
1)凡是对于背景的操作,比如画图,贴图等。是响应OnPaint()还是OnEraseBkgnd??????我知道都可以,但是谁能说说区别和各自优缺点?
先执行OnEraseBkgnd,再执行OnPaint,执行OnEraseBkgnd时可以选择是否执行OnPaint
也就是说如果你只重写OnPaint,系统会自动先执行OnEraseBkgnd的,即擦除背景,貌似擦完了还有别的

如果重写OnEraseBkgnd,并return true,就不会执行OnPaint,好处是减少重绘时间

防止闪烁首先在OnEraseBkgnd指定区域不重绘,其次在内存中把图画完,最后在外部直接draw

2)上述OnPaint函数中,都是获得dc,都可以画背景,但是
//CPaintDC dc(this); // 少这个后树状控件没有了????????
HDC hdc=::GetDC(m_hWnd);//CPaintDC dc(this)区别和联系????????
都是dc的知识 关键词有了,自己百度或google,找几篇文章看看,最好结合msdn看
------解决方案--------------------
闪的话,要用双缓冲的,先拷贝到内存,然后再拷到屏幕。
------解决方案--------------------
闪的话,要用双缓冲的,先拷贝到内存,然后再拷到屏幕。 

------解决方案--------------------
注释//CPaintDC dc(this);后,树状控件不是没有了,是没刷新没显示出来,因为你没激活Window的BeginPaint
------解决方案--------------------
探讨
引用:

1. 都可以,一般放到OnPaint函数中,OnEraseBkgnd函数return TRUE; 如果你觉得闪动比较厉害的话。
2. CPaintDC It performs a CWnd::BeginPaint at construction time and CWnd::EndPaint at destruction time. 绘制完父窗口,会再绘制所有的子窗……

------解决方案--------------------
多年VC的困惑
学VC有大半年了,今天发现有几个基本的问题都没有搞清楚.[

亮了
------解决方案--------------------
你这样 处理onpaint 界面会闪的吧?
CPaintDC 的构造方法中会调用 BeginPaint ,析构中会调用EndPaint。
这个两个api很重要,BeginPaint 会把当前的无效区设置为有效。

如果当前没有 无效区 ,系统就不会再发送 wm_paint 消息了
------解决方案--------------------
OnPaint应该用CPaintDC
不要用别的dc
CPaintDC也只是用在OnPaint函数中
别的地方不要用
------解决方案--------------------
如果窗口有无效区,CPaintDC()引起EraseBkgnd,背景擦除后回到paint,你的绘制代码执行。paint退出时窗口变有效。

------解决方案--------------------
2)上述OnPaint函数中,都是获得dc,都可以画背景,但是
//CPaintDC dc(this); // 少这个后树状控件没有了????????
HDC hdc=::GetDC(m_hWnd);//CPaintDC dc(this)区别和联系????????

Windows能够识别那些仅需要重绘的区域,比如你把一个窗口的一半拖动到屏幕外面,然后再把它拖回到屏幕中央,那么他只重绘被屏幕盖住看不见的那一半区域,而另一半没有被屏幕盖住的部分是不会重绘的,这样就很大程度上避免了闪烁和提高了绘制速度。

如果你用HDC hdc=::GetDC(m_hWnd);//那么上面所说的Windows支持的只绘制无效区域的功能等于没有实现,不管被盖住的是仅仅一丁点的区域还是全部区域,他全部给你重绘了。

CPaintDC dc(this); // 如果你用这种DC(其实内部是用的BeginPaint和EndPaint)那么它就只重绘无效(也就是被遮盖住的区域)区域,最大的好处就是避免闪烁。

文章评论

不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
 程序员的样子
程序员的样子
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
鲜为人知的编程真相
鲜为人知的编程真相
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
总结2014中国互联网十大段子
总结2014中国互联网十大段子
为什么程序员都是夜猫子
为什么程序员都是夜猫子
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员都该阅读的书
程序员都该阅读的书
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员应该关注的一些事儿
程序员应该关注的一些事儿
一个程序员的时间管理
一个程序员的时间管理
中美印日四国程序员比较
中美印日四国程序员比较
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
旅行,写作,编程
旅行,写作,编程
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
我是如何打败拖延症的
我是如何打败拖延症的
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
老程序员的下场
老程序员的下场
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
如何成为一名黑客
如何成为一名黑客
我的丈夫是个程序员
我的丈夫是个程序员
每天工作4小时的程序员
每天工作4小时的程序员
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
编程语言是女人
编程语言是女人
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
漫画:程序员的工作
漫画:程序员的工作
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Java程序员必看电影
Java程序员必看电影
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员必看的十大电影
程序员必看的十大电影
程序员和编码员之间的区别
程序员和编码员之间的区别
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有