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

作为 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

谢谢你们的回答,ajryan,你似乎总是为我的问题提供帮助,所以特别感谢。

值得庆幸的是,这次的答案相当简单......

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

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

其他提示

远程调试是调试视觉问题的天赐之物。设置起来很麻烦,但是准备好用于远程调试的虚拟机肯定会带来回报。

我喜欢做的是在绘制处理以及框架绘制代码本身中设置大量断点。这使您可以有效地“冻结框架”绘画,而无需通过翻转到 devenv 将其破坏。通过这种方式,您可以真实了解谁在按什么顺序绘画,以及您有机会按照您需要的方式插入填充。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top