WS_EX_LAYERED 父级的 Win32 编辑控件在其背景透明时不接收鼠标/单击事件
Posted
技术标签:
【中文标题】WS_EX_LAYERED 父级的 Win32 编辑控件在其背景透明时不接收鼠标/单击事件【英文标题】:Win32 Edit Controls of WS_EX_LAYERED parent dont receive mouse/click events when their background is transparent 【发布时间】:2012-12-29 21:18:04 【问题描述】:我想将一些编辑字段放在启动屏幕的顶部,该屏幕在另一个***窗口中呈现(透明 PNG,类似于 http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_part_ii.html)。
我创建了一个始终位于初始屏幕顶部的辅助窗口,并使用 WS_EX_LAYERED 使其也透明。
现在我通过捕获 WM_CTLCOLOREDIT 设置 wndproc 中编辑字段的背景颜色。
这很好用,我的输入控件是透明的(例如不可见),并且只有输入的文本在初始屏幕上可见。
现在问题来了,表示此处为文本框的鼠标光标不起作用,我也无法单击该框使其成为焦点。如果我不使编辑控件的背景透明,问题就会全部消失。透明时也没有 WM_NCHITTEST。我唯一一次获得鼠标光标是如果框中已经输入了(可见)文本
g_HWNControlsParent = CreateWindowEx( WS_EX_LAYERED,.....);
hwLoginField = CreateWindowEx(NULL,"EDIT", "-User-", WS_CHILD|WS_VISIBLE|WS_TABSTOP, ....g_HWNControlsParent);
SetLayeredWindowAttributes(g_HWNControlsParent,RGB(0, 0, 0), 0, LWA_COLORKEY) ;
在 HWNControlsParent wndproc 中
case WM_CTLCOLOREDIT: // BG Color of Input Fields
HDC hdc = (HDC)wParam;
SetTextColor(hdc, RGB(230,230,230));
SetBkColor(hdc, RGB(0,0,0)); // Color of Background where Text is entered
SetDCBrushColor(hdc, RGB(0,0,0)); // Color of Background where no Text is
return (LRESULT) GetStockObject(DC_BRUSH); // return a DC brush.
【问题讨论】:
这是设计使然。对用户眼睛透明的窗口的任何部分对鼠标点击也是透明的。他们被送到下面的窗户。您无法更改此设置。 【参考方案1】:如果您对透明区域使用 1 而不是 0 的 alpha,它们仍然是透明的,但会响应鼠标点击。
【讨论】:
你的意思是 SetLayeredWindowAttributes(g_HWNControlsParent,RGB(0, 0, 0), 1, LWA_COLORKEY) ; ?这也不起作用 使用LWA_COLORKEY
时不能指定alpha,你需要通过UpdateLayeredWindow
使用per-pixel alpha。
我尝试使用 UpdateLayeredWindow - 在这种情况下一切都是透明的 - 甚至是编辑框中的文本 - 但是观察到正确的鼠标行为 - 你有一个正确工作的例子吗?
@Steve 你能解决你的问题吗?如果你这样做了,你能否将代码作为一个项目发布,以便其他人可以学习。非常感谢!
不符合预期,我添加了一个解决方法 - 我在我的 windowproc 中捕获了 WM_LBUTTONDOWN 等。然后我检查鼠标光标是否在定义的矩形内 (PtInRect(&passwordEdit,g_CursorPoint)) - 如果是这种情况我手动传播焦点 (SetFocus(GetDlgItem(g_HWNLoginParent, ID_PASSWORD_EDIT)); ) - 基本上我定义了坐标/宽度的矩形我的输入字段在哪里,然后手动检查点击是否会在他们的位置。以上是关于WS_EX_LAYERED 父级的 Win32 编辑控件在其背景透明时不接收鼠标/单击事件的主要内容,如果未能解决你的问题,请参考以下文章