CPaintDC CDC
来源:互联网 发布:淘宝gucci天猫旗舰店 编辑:程序博客网 时间:2024/05/22 02:16
from:http://blog.csdn.net/c__allen/article/details/7704359
今天在对话框上绘制图形时遇到了一个问题,直接上代码:
下面是对话框重载的OnPaint函数:
- CRect rect;
- CDC *pDC = GetDC();
- CDC memDC;
- GetClientRect(&rect);
- CBitmap memBitmap;
- memDC.CreateCompatibleDC(NULL);
- memBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
- memDC.SetBkMode(TRANSPARENT);
- memDC.SelectObject(&memBitmap);
- COLORREF bkColor = ::GetSysColor(COLOR_3DFACE);//得到系统颜色
- memDC.FillSolidRect(rect.left, rect.top,rect.Width(), rect.Height(),bkColor);//绘制背景
- memDC.FillSolidRect(rect.left, rect.bottom-40,rect.Width(), rect.Height(),RGB(80,80,80));
- pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
- CDialog::OnPaint();
这段代码的本意是绘制一个矩形框,然后调用CDialog::Onpaint()把原来对话框上的控件也显示出来。
但出现的问题刚开始却让人摸不着头脑:点击“显示桌面”,最小化所有的窗口,再弹出该对话框时,绘制的矩形框会消失;但使对话框被屏幕遮挡,只显示其一部分,再把对话框拖回屏幕中间完整显示的时候,对话框上除矩形框之外的所有控件会消失。
然后再看看改动后正常的代码:
- CPaintDC dc(this);
- CRect rect;
- CDC *pDC = &dc;
- CDC memDC;
- GetClientRect(&rect);
- CBitmap memBitmap;
- memDC.CreateCompatibleDC(NULL);
- memBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
- memDC.SetBkMode(TRANSPARENT);
- memDC.SelectObject(&memBitmap);
- COLORREF bkColor = ::GetSysColor(COLOR_3DFACE);//得到系统颜色
- memDC.FillSolidRect(rect.left, rect.top,rect.Width(), rect.Height(),bkColor);//绘制背景
- memDC.FillSolidRect(rect.left, rect.bottom-40,rect.Width(), rect.Height(),RGB(80,80,80));
- pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
- ReleaseDC(pDC);
改变的地方就是把获取DC的方式:CDC *pDC = GetDC() 改成了CpaintDC dc(this),然后取消调用Cdialog::Onpaint()函数,这是为什么呢?
CPaintDC的独到之处就在于,它在构造函数中调用了CWnd::BeginPaint在析构时调用了CWnd::EndPaint,而且它只能响应WM_ONPAINT消息(所以直接调用OnPaint()是没用的,因为它不产生WM_PAINT消息)。而这个BeginPaint会发送WM_ONERASEBKGND消息,因此,它只擦除指定的背景并重画,不影响对话框内的其他控件。值得注意的是,在这操作之后不要再调用CDialog::Onpaint函数。
而之前的方法之所以不成功是因为:
BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。其中无效区域是指需要重画的区域,无效的意思是:当前内容是旧的,过时的。
- CPaintDC CDC
- CPaintDC和CDC
- CPaintDC和CDC
- CDC,CClientDC,CPaintDC类
- CPaintDC 、CWindowDC、 CClientDC、 CDC
- CClientDC,CPaintDC,CWindowDC,CDC
- CDC,CPaintDC,CWindowDC,CClientDC
- HDC,CDC,CWindowDC,CClientDC,CPaintDC
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- CDC,CPaintDC,CClientDC,CWindowDC区别
- HDC,CDC,CWindowDC,CClientDC,CPaintDC基础
- HDC,CDC,CWindowDC,CClientDC,CPaintDC基础
- HDC,CDC,CWindowDC,CClientDC,CPaintDC基础
- HDC,CDC,CWindowDC,CClientDC,CPaintDC基础
- HDC,CDC,CClientDC,CPaintDC,CWindowDC的区别
- oracle锁表问题
- 存储过程
- JointJS:可与Visio相媲美的开源在线制图工具
- Android内存泄露案例分析
- snprintf与sprintf
- CPaintDC CDC
- appium + xml + web 自动化测试框架设想及实践分享
- 新兴技术:不会过曝的相机
- 双向循环链表基本操作(初始化,插入,删除,清空,销毁,访问前驱,后继等)
- Python学习网站(更新到20150908)
- 机器学习算法需要注意的一些问题,算法一些问题
- leetcode 268: Missing Number
- 秀出你的开源项目,拿奖金,赢捐助
- C#实现远程开机(局域网测试通过)