C++ 使编辑控件透明的WinAPI(win32)

C++ 使编辑控件透明的WinAPI(win32),c++,c,winapi,controls,transparent,C++,C,Winapi,Controls,Transparent,这是我的代码的相关部分: case WM_CTLCOLORBTN: case WM_CTLCOLOREDIT: case WM_CTLCOLORSTATIC: SetBkMode(HDC(wParam),TRANSPARENT); return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH))); 它使所有控件(包括编辑控件)的背景透明。但当某些文本被键入时,它会自动覆盖,看起来很凌乱。如何重置可见区域并根据当前情况重新绘制?我是否应该在WM

这是我的代码的相关部分:

case WM_CTLCOLORBTN:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
    SetBkMode(HDC(wParam),TRANSPARENT);
    return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH)));
它使所有控件(包括编辑控件)的背景透明。但当某些文本被键入时,它会自动覆盖,看起来很凌乱。如何重置可见区域并根据当前情况重新绘制?我是否应该在
WM_命令
s
EN_CHANGE
WM_PAINT
或其他内容中处理某些内容

下面是它当前的样子:

我意识到,一旦控件被隐藏并再次显示,它将按照预期修复可见性

case WM_COMMAND:
    if(HIWORD(wParam)==EN_CHANGE)
    {
        ShowWindow(HWND(lParam),SW_HIDE);
        ShowWindow(HWND(lParam),SW_SHOW);
        SetFocus(HWND(lParam));
    }
    break;
case WM_CTLCOLORBTN:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORSTATIC:
    SetBkMode(HDC(wParam),TRANSPARENT);
    return LRESULT(HBRUSH(GetStockObject(NULL_BRUSH)));
结果:

它完全按照您的要求执行-背景是透明的,因此在您键入新内容时,以前写入的任何内容都不会被删除。@MarkRansom是的,但如何删除以前写入的文本?通常会自动执行,WM_ERASE使用您选择的画笔调用,然后使用与背景相同的画笔写入文本。您已经显式绕过了所有这些。@markransem我声明了一个变量,
bool-changing
EN\u CHANGE
上变为
true
,然后
WM\u CTLCOLOR…
在这种情况下,消息返回的不是
NULL\u BRUSH
。所以它像往常一样擦除背景。但它不再是透明的,我将编辑这个问题,以提供最小的可复制性example@RemyLebeau是的,我的意思当然是
WM_ERASEBKGND
-这不是我每天都在做的事情,所以我知道我有可能弄错了。谢谢你的更正。另外,在
WM_PAINT
中手动绘制文本无法修复它,您仍然需要以某种方式删除旧文本。最好的方法是告诉底层窗口先重新绘制自身,但这可能会变得复杂。为什么要使用
GetFocus()
?您知道您的编辑控件有焦点,
EN_CHANGE
EN_UPDATE
都在它们的
lParam
中为您提供编辑控件的
HWND
。如果(更改),是否真的需要使用
if(更改)
?如果下面的控件已擦除背景,则似乎没有必要擦除背景。