如何修复 MFC 绘画故障?

Posted

技术标签:

【中文标题】如何修复 MFC 绘画故障?【英文标题】:How to fix an MFC Painting Glitch? 【发布时间】:2008-09-16 16:41:09 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

我喜欢在我的绘制处理以及框架绘制代码本身中设置大量断点。这使您可以有效地“定格”这幅画,而不会通过翻转到 devenv 来破坏它。通过这种方式,您可以真正了解谁在按什么顺序进行绘画,以及您有机会在哪里以您需要的方式进行填充。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

这会关闭拖动图像的绘制,然后向正在进入的窗口发送一条消息以在突出显示状态下重新绘制,最后在顶部重新绘制拖动图像。似乎成功了。

【讨论】:

以上是关于如何修复 MFC 绘画故障?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MFC 工具提示的示例代码修复错误?

如何“正确关闭 MFC 无模式对话框并修复资源泄漏”

MFC:如何修复任务管理器输出中的“TODO <文件描述>(32 位)”?

如何修复从 VS2010 升级到 VS2013 的项目中的链接器错误,其中链接器正在寻找不存在的 MFC 库文件?

客户端重新加载页面时如何修复服务器故障?

硬盘电路板损坏故障数据如何修复