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