частично щелкнуть по многослойным окнам win32

При использовании многослойных окон в win32 или atl / wtl c ++, если я устанавливаю альфа главного окна в 0 и рисую на дочернем, фальшивом окне, чтобы его можно было просматривать, и щелкаю по окну, все окно является щелчком мыши.
Я хочу, чтобы можно было щелкать только по областям окна, а не по всему окну, скажем, если я хочу нарисовать окно с закругленными углами, я делаю щелчок по нижнему / главному окну, но я не хочу, чтобы верхнее «поддельное» окно, через которое нужно кликнуть, я хочу, чтобы можно было кликать по нему. Как я могу это сделать?
Где я так далеко
В функции OnInitDialog главного окна:

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

и когда я создаю поддельное окно:

m_hFakeWnd = ::CreateWindowEx( WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_LEFT
, m_strWndClassName
, NULL
, WS_VISIBLE | WS_OVERLAPPED
, rc.left
, rc.top
, rc.Width()
, rc.Height()
, GetSafeHwnd()
, NULL
, ::GetModuleHandle(NULL)
, NULL
);

ЕСЛИ я установил флажок WS_EX_TRANSPARENT, фальшивое окно доступно для щелчка, а главное — через щелчок, но! это ни на что не отвечает! щелчок / перетаскивание. никто.

1

Решение

Похоже, вы закрываете другое окно исключительно с целью перехвата кликов?

В любом случае, вам нужно обрабатывать окна WM_NCHITTEST сообщение, чтобы система могла узнать, что конкретная позиция прозрачна, и в этом случае вы возвращаетесь HTTRANSPARENT:

В окне, которое в настоящее время закрыто другим окном в том же потоке (сообщение будет отправлено нижележащим окнам в том же потоке, пока одно из них не вернет код, не являющийся HTTRANSPARENT).

0

Другие решения

Используйте альфа 1 вместо 0 в регионах, где вы хотите принимать клики. Окно по-прежнему будет полностью невидимым, но области альфа 1 будут регистрировать щелчки и движения мыши как обычно.

Обратите внимание, что для получения альфа на пиксель вам нужно использовать UpdateLayeredWindow скорее, чем SetLayeredWindowAttributes,

0

Сделайте два окна, одно со свойствами перехода по клику, а другое с обычными.

0
По вопросам рекламы [email protected]