发现VC6的一个BUG 在基于对话框的程序中,如果你派生了对话框的OnPaint函数,然后你把ClassWiziad自动生成的那个声明语句:CPaintDC dc(this);删除的话,当对话框显示后,会发现资源占用率为100%,程序老在那儿重绘。就因为这个原因,昨天害的我一下午调试,一个语句一个语句的注释,最后发现竟然是这个原因。所以,提醒一下,如果你重载了OnPaint函数,一定不要把那个声明语句去掉,不管你后面用不用那个dc。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在SDK编程中有这样一个规定,处理PAINT消息时,允许使用已有DC,但不允许定义新的DC因此这也不是BUG. 你把其他代码再删掉一些,会发现更多BUG的。 晕了,不知道上面这些人看了我写的没。我并需要那个dc,我也不在那个dc上绘图,对我的程序来说,那个dc没有任何用处。当然,我在OnPaint中会获取另一个dc来绘图的。CPaintDC dc(this);这不是一个简单的声明语句吗?我不用这个dc为什么不能删除这一行? 楼主有点很哟,万千人都在用VC,几乎没听说有BUG,而你却发现了,微软应给你颁奖了,呵呵呵呵 那就给你说说清楚:CPaintDC::CPaintDC(CWnd* pWnd){ ASSERT_VALID(pWnd); ASSERT(::IsWindow(pWnd->m_hWnd)); if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps))) AfxThrowResourceException();}CPaintDC::~CPaintDC(){ ASSERT(m_hDC != NULL); ASSERT(::IsWindow(m_hWnd)); ::EndPaint(m_hWnd, &m_ps); Detach();}你自己处理WM_PAINT消息,就要调用BeginPaint和EndPaint,CPaintDC为你做了。你把它删除了,WM_PAINT消息得不到处理,当然出问题。我在OnPaint中会获取另一个dc来绘图的+++++++++++++++++++++++++++++++++++++++这不是画蛇添足是什么? 哈哈~~~照此类推,偶还发现了VS2005的BUG~ 删除可以,但必须在这个消息里面BeginPaint和EndPaint一下,否则系统认为没有处理会继续触发这个消息,资源占用率当然就会100%了。 如何将位图对象保存为BMP文件 对话框的的贴图问题 如何自己实现“标题栏”的最大化,最小化按钮? 如何在VS2005安装与部署的时候自动安装多个应用程序安装包? 问一个类似互斥的问题。 高手帮忙,表格排序! 今天不解决,明天老板打屁屁了! vc中如何调出操作系统的“日期和时间 属性”那个对话框 能否把ADO连接数据库查询的代码写到线程函数里面? 怎样设置定时器?Help!高手们帮忙 一个关于LISTCTRL上数据存储问题,大家来看看,谢谢!!! 种子算法,现在问题是算法能达到要求,但有BUG,附源码 在ATL和MFC混合编程中,如何在MFC继承的类中调用ATL接口中声明的方法。
因此这也不是BUG.
{
ASSERT_VALID(pWnd);
ASSERT(::IsWindow(pWnd->m_hWnd)); if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps)))
AfxThrowResourceException();
}CPaintDC::~CPaintDC()
{
ASSERT(m_hDC != NULL);
ASSERT(::IsWindow(m_hWnd)); ::EndPaint(m_hWnd, &m_ps);
Detach();
}你自己处理WM_PAINT消息,就要调用BeginPaint和EndPaint,CPaintDC为你做了。
你把它删除了,WM_PAINT消息得不到处理,当然出问题。
我在OnPaint中会获取另一个dc来绘图的
+++++++++++++++++++++++++++++++++++++++
这不是画蛇添足是什么?