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

作为一些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 票数:1

远程调试是调试视觉问题的天赐之物。 设置很麻烦,但是一定要准备好用于远程调试的VM才能取得回报。

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

===============>>#2 票数:0

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

===============>>#3 票数:0 已采纳

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

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

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

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

  ask by Ali Parr translate from so

未解决问题?本站智能推荐:

2回复

为什么即使调用UpdateWindow()后绘画消息也会丢失?

我有一个具有以下Windows层次结构的应用程序: 当某些事件在W2中发生时,我调用UpdateWindow : W2的OnPaint处理如下所示: 但是有时在W2中迷失了绘画信息。 尽管UpdateWindow被调用,但没有相应的OnPaint ()被调用。 如
1回复

MFC重绘窗口在画图应用程序中的问题

我正在尝试在MFC上编写Paint,但是在绘制新图形,移动现有图形或调整现有图形大小时,重新绘制窗口存在问题。 当我在每次移动鼠标后使用Invalidate()或InvalidateRect(NULL) ,效果很好,但是在添加3-4位数字后,应用程序崩溃,因为它无法及时重绘所有窗口。 我已经
3回复

C ++ MFC如何绘制Alpha透明矩形

在C ++ MFC应用程序中。 使用dc ( CPaintDC dc(this); ) 如何绘制一个可以调整的Alpha透明度矩形( LPRECT )。 以下是我需要转换为C ++的示例c#代码
2回复

MFC CListCtrl CustomDraw()事件处理程序代码被卡住

我目前遇到问题,一旦我将CListCtrl行涂成红色(代码被卡住),OnNMCustomdrawlistctrlvalues()事件处理程序就被称为不停止,一旦我尝试执行另一个事件(如单击),我的应用程序就会冻结一个按钮。 我有以下代码: 结果是: 在CListCtrl内,
1回复

用计算的HRGN绘画Ownerdrawed CStatic

我有一个继承自CStatic的类,该类是所有者绘制的,并使用SetWindowRgn计算窗口应具有的区域。 在我的DrawItem覆盖中,我尝试使用FillRgn在与计算得出的区域相同的区域中传递,但该方法返回FALSE。 该文件说 返回值:如果函数成功,则返回非零值;否则返回0。
2回复

MFC-在控件上设置背景图片

对于标题的模糊性,我深表歉意,但我不确定我要如何解决当前的问题。 基本上,我有2组按钮。 当用户从一组中选择一个按钮时,我要设置一个指示符,表明该组已被选择。 因此,围绕它们的矩形(蓝色)或为组后面的背景(或背景图像)着色。 最终用户表示,围绕它们的矩形会很好,因此这是优先选择的。 我
3回复

qpainter绘画替代品(性能在Mac上很糟糕)

我有一个类在QWidget中显示音频文件的波形数据(见下面小部件的屏幕截图,然后我仍然使用渐变,这导致性能不佳)。 使用对QPainter::drawLine多次调用,直接在小部件上的paintEvent中绘制音频数据(对QWidget::drawLine的最小调用量相当于小部件的宽度=&
1回复

如何在父窗口小部件的右侧绘画?

我在QScrollArea顶部创建一个自定义QScrollBar。 我做了scroll_bar->setParent(acroll_area) ,现在ScrollBar :: painEvent绘制在QScrollArea上,唯一的问题是它绘制在左侧。 我该如何在右侧绘画。
1回复

使用旋转的QPainter绘画将剪辑裁剪到QImage的错误区域

我有一个QImage代表一张空白的纸和一个QPainter,用于在此图像上绘画。 有时,我会在进行任何绘制操作之前旋转/平移QPainter,以便以“横向”方向绘制到此图像上。 这是代码的简化片段: 不幸的是,这没有按我预期的那样工作。 看来即使画家已旋转,它也没有意识到它可以
3回复

需要一些Qt绘画课程的帮助

我正在尝试编写一个绘图程序(在检测到鼠标按下/保持的情况下绘制),但是我在使用Qt QPainter时遇到了麻烦。 我已经在他们的网站上阅读了文档,我仍然有点迷失。 指向不在他们网站上的教程的链接会很好,或者可以向我解释如何在Qt中完成此任务。 我唯一能做的就是在小部件上绘制点。