如何通过使用 GDI 对其颜色进行异或处理来在填充的矩形上绘制文本?

Posted

技术标签:

【中文标题】如何通过使用 GDI 对其颜色进行异或处理来在填充的矩形上绘制文本?【英文标题】:How to draw text over filled rectangle by XOR-ing its color with GDI? 【发布时间】:2017-07-07 09:57:25 【问题描述】:

我不确定我用文字表达是否正确。最好的方法是用图像显示它。我正在尝试填充一个矩形,同时反转其中的文本颜色。就像edit 控件一样:

这是一个绘图代码(从WM_PAINT调用):

//Erase background
::FillRect(hDC, &rcClient, ::GetSysColorBrush(COLOR_WINDOW));

//Draw text
::DrawText(hDC, text, text.size(), &rc, 
    DT_LEFT | DT_TOP | DT_EDITCONTROL | DT_NOPREFIX | DT_SINGLELINE);

//Draw highlighted rect & invert text
HGDIOBJ hOldBrush = ::SelectObject(hDC, ::GetSysColorBrush(COLOR_HIGHLIGHT));
::PatBlt(hDC, rcDrawFrame.left, rcDrawFrame.top, rcDrawFrame.Width(), rcDrawFrame.Height(), DSTINVERT);
::SelectObject(hDC, hOldBrush);

但由于某种原因,背景矩形显示为黑色,我知道 COLOR_HIGHLIGHT 在这个系统上是蓝色的:

那么我在这里做错了什么?

【问题讨论】:

尝试用系统颜色来制作你的画笔,比如:CBrush brush_selected(GetSysColor(COLOR_HIGHLIGHT)); 如果这不起作用,请尝试使我建议的刷子成为班级成员,因为它的生命周期。 我认为选定的文本部分呈现在文本之上,而不是异或。 编辑控件不反转颜色。它使用系统COLOR_HIGHLIGHT 颜色绘制选择背景,并使用系统COLOR_HIGHLIGHTTEXT 颜色绘制选定文本。用户可以在控制面板中自定义这些颜色。实际上反转颜色可能很困难,因为在反转颜色中可能不容易看到文本。如果您搜索调整反转颜色以使文本更具可读性,则可以使用算法。 【参考方案1】:

您可能需要考虑不同的策略; drawing the text twice with inverted clipped region.

【讨论】:

谢谢。他用ExcludeClipRect 设置剪切区域然后用ExtSelectClipRgn(RGN_XOR) 反转它并绘制两次的例子起到了作用。不过我很好奇,为什么当我尝试 download a code sample 时,Google Chrome 会将该网站报告为 The site ahead contains harmful programs 也许他们将某些下载归类为“hacktools”,谁知道呢。

以上是关于如何通过使用 GDI 对其颜色进行异或处理来在填充的矩形上绘制文本?的主要内容,如果未能解决你的问题,请参考以下文章

WinAPI/GDI:如何使用 GetDIBits() 为位图合成颜色表?

OpenCV与EmguCV中的漫水填充

如何绘制亮化边框(外发光效果)?

Excel中,如何根据某一行的值,对整列 进行颜色填充?

opencv入门漫水填充算法(Floodfill)

WPF 通过位处理合并图片