2012-11-20 88 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