描述:
如下两段类似的代码,为什么第一段正常工作,第二段却不能?
代码段1(正常工作):
CMetaFileDC dcMeta;
dcMeta.Create();
dcMeta.FillSolidRect(&rc1, RGB(0,0,0)); // 在两个不同位置绘制矩形
dcMeta.FillSolidRect(&rc2, RGB(1,1,1));
hMetaFile = dcMeta.Close(); // hMetaFile是一个MetaFile句柄,用于记录绘图信息
// 在OnDraw中,我判断hMetaFile是否为空,不是则调用:
//
// pdc->PlayMetaFile(hMetaFile);
// DeleteMetaFile(hMetaFile);
// hMetaFile = NULL;
//
// 进行绘制。
InvalidateControl(&rc1);
InvalidateControl(&rc2); // 在控件上刷新两个矩形
控件的绘制我使用内存位图加内存DC,每次将rcInvalid矩形从内存位图中复制到pdc中。
代码段2(不正常工作):
由于某些原因,我将绘制矩形的过程拆分成两个子绘制过程,如下:
// 绘制第一个矩形
CMetaFileDC dcMeta1;
dcMeta1.Create();
dcMeta1.FillSolidRect(&rc1, RGB(0,0,0));
hMetaFile = dcMeta1.Close();
InvalidateControl(&rc1);
// 绘制第二个矩形
CMetaFileDC dcMeta2;
dcMeta2.Create();
dcMeta2.FillSolidRect(&rc2, RGB(1,1,1));
hMetaFile = dcMeta2.Close();
InvalidateControl(&rc2);
可是这段代码并不工作。我试着在OnDraw中追踪,发现绘制第一个矩形的InvalidateControl(&rc1)并没有触发OnDraw(),导致绘图不能进行。所以问题应该就出在InvalidateControl身上。我试着用InvaidateRect()替代,这回更过分,根本就不刷新,只有当我用什么东西把控件盖住再拿开,才能真正看到变化。
我这么编的前提思路就是“InvalidateControl‘必然’会触发OnDraw”,如何确保这种必然性?或者为什么不存在这种必然性?
请高手指点!!
解决方案1:
或考虑用控件事件驱动。
解决方案2:InvalidateControl调用后马上用COleControl::Refresh