如何修复MFC绘画故障?

时间:2008-09-16 16:41:10

标签: c++ mfc paint

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

作为一些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);
}

但是,正如您在屏幕截图中看到的那样,绘画在拖动的对象下方“毛刺”,将原始灰色留在原位。它看起来很丑陋,基本上破坏了整个效果。

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

3 个答案:

答案 0 :(得分:1)

远程调试是调试视觉问题的天赐之物。设置起来很痛苦,但让VM准备好进行远程调试肯定会有所收获。

我喜欢做的是在我的绘画处理中设置大量断点,以及在框架绘制代码本身。这样您就可以有效地“冻结”绘画,而不会通过翻转到devenv来将其拼凑起来。通过这种方式,您可以真实地了解谁以何种顺序进行绘画,以及您有机会按照您需要的方式打破填充的位置。

答案 1 :(得分:0)

看起来CStatic几乎不知道它需要重新绘制自己,因此可拖动对象的背景颜色会被遗忘。也许试着使CStatic无效,看看这有什么用呢?

答案 2 :(得分:0)

感谢你们的答案,ajryan,你似乎总是想出我的问题的帮助,所以非常感谢。

谢天谢地,这次答案相当简单....

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

这将关闭拖动图像的绘制,然后向正在输入的窗口发送消息以在突出显示的状态下重新绘制,然后最终在顶部重绘拖动图像。好像已经成功了。

相关问题