【发布时间】:2020-12-14 15:36:13
【问题描述】:
这是我的代码的相关部分:
case WM_CTLCOLORBTN:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
SetBkMode(HDC(wParam),TRANSPARENT);
return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH)));
它使所有控件的背景透明,包括编辑控件。但是当输入一些文本时,它会覆盖自身并且看起来很乱。我应该如何重置可见区域并根据当前情况重绘?我应该在WM_COMMANDs EN_CHANGE 或WM_PAINT 或其他东西中处理一些东西吗?
【问题讨论】:
-
它完全按照您的要求进行 - 背景是透明的,因此当您输入新内容时,之前编写的任何内容都不会被删除。
-
@MarkRansom 是的,但是以前写的文字怎么能被抹掉呢?
-
这通常是自动发生的,使用您选择的画笔调用 WM_ERASE,然后使用与背景相同的画笔写入文本。你已经明确地绕过了所有这些。
-
@MarkRansom 我已经声明了一个变量
bool changing;,它在EN_CHANGE上变为true,然后WM_CTLCOLOR...消息在这种情况下返回NULL_BRUSH以外的其他内容。所以它像往常一样擦除背景。但它不再透明,我将编辑问题以提供最小的可重复示例 -
@RemyLebeau 是的,当然我的意思是
WM_ERASEBKGND- 这不是我每天都在使用的东西,所以我知道我有可能弄错了。感谢您的指正。附:在WM_PAINT中手动绘制文本不会修复它,您仍然需要以某种方式擦除旧文本。最好的方法是告诉底层窗口先重新绘制自己,但这会变得很复杂。
标签: c++ c winapi controls transparent