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_命令
sEN_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(更改)
?如果下面的控件已擦除背景,则似乎没有必要擦除背景。