【问题标题】:How do you draw a highlighted/selected bitmap on Windows?如何在 Windows 上绘制突出显示/选定的位图?
【发布时间】:2011-11-20 10:01:27
【问题描述】:

我正在使用标准 Win32 API 编写程序。当用户在我的程序中选择图片时,我想绘制位图以使其突出显示/选中。使用标准的 Windows 隐喻,这意味着绘制一个使用系统突出显示颜色抖动的位图版本(我不确定“抖动”在技术上是正确的术语,但请参阅下面的示例)。我已经尝试了几种方法来使用 BitBlt 和类似功能来实现这一点,但我似乎无法弄清楚我需要的确切步骤。如果有一个标准的 Win32 函数可以处理这个问题,我找不到它。有谁知道我如何做到这一点?

未选中的图像应如下所示:

选定的图像应如下所示:

【问题讨论】:

  • 我建议不要抖动,而是更改背景颜色或绘制轮廓边框。例如,当您突出显示桌面上的某个项目时,图标本身不会改变,但背景会改变颜色。这种方法的好处是用户仍然可以清楚地看到原始图片。此外,有些图像可能很难与抖动版本区分开来,尤其是当原件与选择颜色相似时。在图像外部使用颜色可以避免这个问题。
  • 是的,总体上我绝对同意你的理念,但我的目标是尽可能地模仿 Chrome 网络浏览器使用的图像选择,这就是它的作用。
  • 在列表中选择项目与内容(从 qu 中不清楚这适用于您的情况)可能需要不同的 UI:列表中的项目通常在它们周围有足够的空间,所以如果它们被倒置,一些倒边框也会显示。内容比较棘手;图像没有边框空间,这就是文本编辑器使用变色方法的原因。因此,如果您实际上将图像作为文本内容的一部分并与文本内容一起突出显示,那么这是与 Chrome 一致的适当做法。但如果这些是列表中的图像,这与 Chrome 所做的情况不同。

标签: c winapi


【解决方案1】:

我不知道如何直接执行此操作(例如,使用 BitBlt 和朋友),但图像列表对象会为您执行此操作:

HBITMAP hBitmapImage = ...; // cookie monster
HBITMAP hBitmapMask = ...; // all black
HIMAGELIST hImageList = ImageList_Create(width, height, ILC_COLOR32 | ILC_MASK, 1, 0);
ImageList_Add(hImageList, hBitmapImage, hBitmapMask);
ImageList_Draw(hImageList, 0, hDC, x, y, ILD_SELECTED);

结果(左侧为原始,右侧选中):

【讨论】:

  • 我发现使用全白蒙版可以在我的代码中看起来更好。您可以将其与高亮边框相结合,让您的用户更加明显。
【解决方案2】:

看起来 GDI AlphaBlend() 应该可以完成这项工作;使用高亮颜色创建一个小的实心位图,使用 AlphaBlend 将其覆盖在原始位图上,使用 BLENDFUNCTION.SourceConstantAlpha 字段指定透明度。

【讨论】:

  • 这是我最初尝试的,但结果很丑;我认为您需要先对源图像进行预乘。我懒得采取额外的步骤,ImageList 已经以与系统一致的方式为您完成了。当然,如果您想要不同的效果(颜色、alpha 等),您必须自己完成所有工作。
【解决方案3】:

那么,您究竟希望如何突出显示它?它可能是图像周围的框架,在这种情况下,您只需要 FrameRect 周围。或者您可能想PatBlt 图片。或者使用示例代码查看这篇文章以获取另一个想法:Glow and Shadow Effects using Windows GDI

【讨论】:

  • 我想绘制使用系统高亮颜色抖动的图像,正如我在问题中提到的那样。我更新了我的问题以包含我正在寻找的效果的示例。
【解决方案4】:

您可能还想使用反转操作之一反转图像以显示选择。例如,要反转 HDC 上已经存在的内容,请传递要反转的区域坐标:

BitBlt(HDc, XPos, YPos, Width, Height, NULL, 0, 0, DSTINVERT);

【讨论】:

  • 谢谢,但这并不是我真正想要的效果。我编辑了我的问题以包含一个示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2021-01-06
  • 2018-12-24
相关资源
最近更新 更多