2012-11-20 5 views
1

win32 또는 atl/wtl C++에서 레이어 된 윈도우를 사용하는 경우 메인 윈도우의 알파를 0으로 설정하고 아이를 페인트하면 가짜 윈도우를 볼 수 있고 윈도우를 클릭하면 전체 창은 클릭 연결입니다. 둥근 모서리 창을 페인트하고 싶을 때 아래쪽/주 창을 클릭 할 수있게 만들지 만 원하지 않는다고 가정 해 봅시다. 전체 창이 아니라 전체 창의 부분 만 클릭하여 만들 수 있습니다. 위의 "가짜"창을 클릭하면 해당 창을 클릭 할 수 있기를 원합니다. 어떻게해야합니까?부분적으로 계층화 된 윈도우를 통해 부분적으로 클릭 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 플래그에게 가짜 창을 제거 설정 메인 윈도우의의 OnInitDialog 함수에서 : 내가 지금까지 오전 메인이 클릭 연결되는 동안 클릭 할 수 있습니다. 그것은 아무것도 응답하지 않습니다! 클릭/끌기. 없음.

+0

인력 제공! 나는 이것을 필요로한다! –

답변

0

클릭을 가로 채기위한 목적으로 다른 창을 덮는 것처럼 들리는가요? 현재 다른 창에 의해 덮여 창에서

: 어쨌든

, 당신은 어떤 경우에 당신은 HTTRANSPARENT를 반환, 시스템이 특정 위치가 투명 알려 수 있도록하기 위해 윈도우의 WM_NCHITTEST 메시지를 처리해야 동일한 스레드 (메시지가 HTTRANSPARENT가 아닌 코드를 반환 할 때까지 동일한 스레드의 기본 윈도우로 전송됩니다).

+0

목적은 클릭 수를 가로 채는 것이 아니라, 그것을 덮어서 사용자 정의 도형 창을 만들 수 있습니다. 예를 들어, 도넛 창을 만들고 싶으면 창 안쪽에있는 것처럼 구멍을 클릭하고 싶습니다. –

+0

좋아요, 그래서 하위 가짜 창에서 WS_EX_TRANSPARENT를 제거하고 하위 창에서 WM_NCHITTEST 메시지를 처리하므로 가장 낮은 (주) 창이 올바르게 수신되지만 위조 된 창에서 모든 메시지를받을 수 없습니다 WM_MOUSEMOVE, WM_LBUTTONDOWN. 무슨 일이야 ? –

+0

이렇게 호기심이 많습니다. spy ++를 사용하여 창에서받은 메시지를보고 WM_MOUSEMOVE를 수신합니다. –

0

두 개의 창을 하나는 클릭 연결 속성으로 만들고 다른 하나는 정상적인 창으로 만듭니다.

0

클릭을 허용하려는 영역에서 0 대신 알파 1을 사용하십시오. 창은 완전히 보이지 않지만 알파 1 영역은 클릭 수와 마우스 움직임을 정상적으로 등록합니다.

픽셀 당 알파를 얻으려면 SetLayeredWindowAttributes 대신 UpdateLayeredWindow을 사용해야합니다.