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 编辑控件在其背景透明时不接收鼠标/单击事件的主要内容,如果未能解决你的问题,请参考以下文章

在分层窗口的子对话框中未单击 CMFCButton

停止:从传播到父级的活动状态

如何为不是直接父级而是父级父级的嵌套元素设置百分比宽度?

从混合层级中查找多个子级的第一个共同父级

使div占据父级的剩余宽度[重复]

Win32 设置窗口透明度 SetLayerTransparent