如何修复MFC绘画故障?

时间:2020-03-05 18:56:29  来源:igfitidea点击:

我正在尝试为我正在开发的材料系统实现一些拖放功能。该系统的一部分包括一个"材料库",它充当用户硬盘驱动器上已保存材料的存储库(分为几组)。

作为某些UI修饰的一部分,我希望实现"突出显示"类型的功能。拖放时,我们可以合法地将材料放到其上的窗口将非常巧妙地更改颜色,以改善对用户的反馈,即这是有效的操作。

我正在将"基本材料"(只是具有CStatic的CWnd)更改为从未突出显示时的中等灰色背景变为悬停时的蓝色背景。一切运行良好,OnDragEnter和OnDragExit消息看起来很健壮,并设置了一个指示突出显示状态的标志。然后在OnCtrlColor中执行以下操作:

if (!m_bHighlighted) {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}

但是,如我们在屏幕快照中所见,绘画在拖动的对象下方出现了"毛刺",而原来的灰色留在了适当位置。它看起来真的很丑,基本上破坏了整个效果。

有什么办法可以解决这个问题?

解决方案

回答

看起来CStatic几乎不知道是否需要重新绘制自身,因此可拖动对象的背景颜色被留下了。也许尝试使CStatic无效,然后看看是否有帮助?

回答

远程调试是调试视觉问题的天赐之物。设置很麻烦,但是一定要准备好用于远程调试的VM,这肯定会有所收获。

我想做的是在我的绘画处理以及框架绘画代码本身中设置大量的断点。这样一来,我们就可以有效地"冻结"绘画,而不会因拖入devenv而使绘画沉闷。通过这种方式,我们可以获取谁按什么顺序绘画的真实图片,以及在哪里有机会打破需要的填充方式。

回答

谢谢大家,ajryan,我们似乎总是为我的问题提供帮助,非常感谢。

值得庆幸的是,这次答案很简单。

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

这将关闭所拖动图像的绘制,然后向进入的窗口发送消息以在突出显示的状态下重新绘制,最后在顶部重新绘制所拖动的图像。似乎已经完成了trick俩。