2012-11-20 54 views
1

在使用分层的窗口在Win32或ATL/WTL的C++如果我设置主窗口的alpha为0,并画上了孩子,假冒的窗口,以便它是可见的,并单击窗口,整个窗口是点击。 我想只能让窗口的区域点击,而不是整个窗口,比方说,如果我想画一个圆角的窗口,我可以点击底部/主窗口,但我不想上面的“假”窗口点击,我希望能够点击它。我怎么做? 我在哪里至今: 在主窗口的OnInitDialog函数:分层窗口部分通过点击的win32

::SetWindowLong(m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); 
BYTE bTran = 0; 
::SetLayeredWindowAttributes(m_hWnd, 0, bTran, LWA_ALPHA); 

,当我创建了假冒的窗口:

IF,设置消除WS_EX_TRANSPARENT标志的假窗可点击,而主要是点击,但!它不响应任何事情!点击/阻力。没有。

+0

来吧peopleee!我需要这个! –

回答

0

这听起来像你只覆盖另一个窗口拦截点击的目的是什么?

无论如何,你需要为了处理窗口的WM_NCHITTEST消息能够让系统知道特定位置是透明的,在这种情况下你返回HTTRANSPARENT

在当前被另一窗口覆盖的窗口同一个线程(该消息将被发送到同一线程中的底层窗口,直到其中一个返回不是HTTRANSPARENT的代码)。

+0

目的不是单纯地拦截点击,而是覆盖它,以便我能够制作自定义形状窗口。例如,如果我想制作一个甜甜圈窗口,我想单击它的洞,就好像它不存在于窗口内一样。 –

+0

行,所以我已删除从儿童假窗口WS_EX_TRANSPARENT和处理在子窗口的WM_NCHITTEST消息,所以最低(主)窗口正确地接收消息,但不能接收的所有消息在假窗口,消息等WM_MOUSEMOVE,WM_LBUTTONDOWN。发生了什么 ? –

+0

所以这是很奇怪的,我已经使用间谍++看窗口收到消息,并确实接收WM_MOUSEMOVE –

0

使两个窗口,一个与点阅性质,另一个正常的。

0

在要接受点击的区域使用alpha 1而不是0。窗口仍然是完全不可见的,但alpha 1的区域将正常注册点击和鼠标移动。

请注意,要获得每像素alpha,您需要使用UpdateLayeredWindow而不是SetLayeredWindowAttributes