照着msdn的说明用win api写了一个MDI程序,只要一拖动最外面的Frame窗口,里面的子窗口就狂闪不已,而MFC生成的MDI就一点也不闪。还有masm32v7自带的mdi例子也根本觉察不到闪动。而我用spy++看了消息循环和窗口的style,跟masm32的例子的一模一样,并且所有的窗口过程我都仿造masm例子重写了,结果还着不行。这有可能是什么原因啊?
调试欢乐多
我说的是“消息循环和窗口的style”,所以我才迷惑不解啊。代码太长了,不好贴,愿意帮忙看看的可以ftp来取:
61.132.49.121
user: csdn
pass: visio
void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CDC dc;
CBitmap bitmap; CBitmap* pOldBitmap;
CRect client;
CRect rect;
pDC->GetClipBox(client);//检取无效区
GetClientRect(rect);//检取整个客户区
if(dc.CreateCompatibleDC(pDC))//创建一个与pDC兼容的内存设备环境
{
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),
rect.Height()))//创建一与pDC兼容的位图,大小为整个客户区
{
OnPrepareDC(&dc,NULL);//使dc与pDC具有同样的映射关系
pOldBitmap=dc.SelectObject(&bitmap);//将位图选入内存环境
dc.SelectClipRgn(NULL);//使dc的整个客户区都成无效区
dc.IntersectClipRect(client);//再“与上”检取的无效区,使
//内存环境与pDC检取的无效区相等
}
}
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255)))
return
brush.UnrealizeObject();
dc.FillRect(client,&brush);//将dc的作图区刷新成背景色 if(m_drawObjs.GetCount()!=0)
Draw(&dc);//将所有的画图对象在内存裁减区内重画
pDC->BitBlt(client.left,client.top,client.Width(),client.Height(),
&dc,client.left,client.top,SRCCOPY);//将内存裁减区的位图
//拷贝到窗口裁减区
dc.SelectObject(pOldBitmap); } 当视图重画时,会引起屏幕的闪烁,解决的一个方法是先在内存中画好图形,然后用
位图的方法将内存中画好的图象拷贝到屏幕上。
________供参考
可能我没说清楚,我的mdi程序是用纯Win32 API写的,没使用mfc. mfc的mdi程序是没有这个问题的,我比较过了