2016-10-25 9 views
2

저는 경계선없는 창을 가지고 있는데,이 창의 유일한 자식은 항상 창 크기로 제 3 자 구성 요소입니다. 해당 구성 요소는 자신의 재량에 따라 특정 영역에서 WM_MOUSEDOWN이 발생했을 때이를 알려주고 (경계선없는 것처럼) 창을 이동하거나 크기를 조정할 수 있기를 원합니다. 또한 문제의 이벤트를 결정하려고합니다.이벤트가 어린이에게 발생했을 때 경계선없는 창에서 Windows에서 사용자 마우스 중심 이동 또는 사용자 정의 창 테두리 크기를 조정하려면 어떻게해야합니까?

창에 경계선이없고 자식 창이 이미 마우스 메시지를 받았기 때문에 WM_NCHITTEST을 덮어 쓸 수 있다고 생각하지 않습니다. (또는 다른 말로, 내 아이가 캡처하는 동안/WM_LBUTTONDOWN를 얻을? 아니면 단지 첫번째 활성화시 전에 부모 윈도우는 항상 WM_NCHITTEST를 얻을 수 있습니까?)

GTK +가 수동으로 모달 이벤트 루프를 실행하는 데 WM_NCLBUTTONDOWNDefWindowProc()를 호출하는 데 사용. 이것을하는 방법입니까?

SC_MOVE의 내용은 WM_SYSCOMMAND? 키보드 중심의 윈도우 이동 및 크기 조절을위한 것이지 마우스 구동 마우스가 아닌 것입니까?

아니면 수동으로해야합니까? 메시지 필터 상수 중 하나를 사용하는 자체의 모달 루프라는 것을 알고 있으며 Aero Snap을 수동으로 수행해야한다는 것을 알고 있습니다.

Windows Vista 이상에서는이 작업이 필요합니다.

감사합니다.

답변

3

부모 창이 경계선이 아니며 하위 창으로 완전히 덮여 있기 때문에 부모에게는 기본적으로 WM_NCHITTEST이 수신되지 않습니다. 모든 WM_NCHITTEST 메시지는 아동이 먼저 받게됩니다.

그러나 약간의 추가 코딩으로 사용자가 부모 창 크기를 조정할 수 있습니다.

  1. 서브 클래스 자식 창은 WM_NCHITTEST 메시지를 가로 챌 수 : 당신이 처리 할 수있는 몇 가지 방법이 있습니다. 받은 메시지를 먼저 자식의 기본 메시지 처리기에 전달하고 HTCLIENT을 반환하고 lParam에 제공된 화면 좌표가 부모 창에서 크기를 조정할 영역 내에 있으면 대신 HTTRANSPARENT을 반환하십시오.

    자식 윈도우의 mousedown 이벤트에
    HTBOTTOM 
    HTBOTTOMLEFT 
    HTBOTTOMRIGHT 
    HTLEFT 
    HTRIGHT 
    HTTOP 
    HTTOPLEFT 
    HTTOPRIGHT 
    
  2. 변환 : 그 다음 WM_NCHITTEST를 처리하고 원하는 크기 조정의 유형에 따라 다음 값 중 하나를 반환 할 수있는, 옆에 부모 창으로 전송 될 WM_NCHITTEST의 원인이됩니다 제공된 클라이언트 좌표의 좌표를 화면 좌표로 입력 한 다음 ReleaseCapture()을 호출하고 WM_NCLBUTTONDOWN 메시지를 부모 창에 보내고 wParam을 위에서 언급 한 값 중 하나로 설정하고 화면 좌표에 lParam을 설정합니다.자식 윈도우의 mouseDown 이벤트에

  3. 0으로 SC_SIZEwParam 플러스 아래에 원하는 값 및 lParam을 설정, ReleaseCapture()를 호출하고 부모 창에 WM_SYSCOMMAND 메시지를 보내

    SC_SIZE_HTLEFT = 1 
    SC_SIZE_HTRIGHT = 2 
    SC_SIZE_HTTOP = 3 
    SC_SIZE_HTTOPLEFT = 4 
    SC_SIZE_HTTOPRIGHT = 5 
    SC_SIZE_HTBOTTOM = 6 
    SC_SIZE_HTBOTTOMLEFT = 7 
    SC_SIZE_HTBOTTOMRIGHT = 8 
    

하나 way는 부모 윈도우의 크기를 정상적으로 조정할 수있게 해주 며, 한 가지만 제외하고 모든 것을 포함하는 모든 작업 (마우스 추적, 물리기 등)을 허용합니다. # 1은 사용자가 부모 창에 직접 마우스를 올려 놓은 것처럼 OS를 속여서 OS가 "크기 조정 테두리"가 사용되는 시각적 피드백을 제공 할 수 있습니다. # 2 및 # 3은 시각적 피드백을 제공하지 않으므로 원하는 경우 SetCursor()을 통해 직접 처리해야합니다.

  1. 서브 클래스 WM_NCHITTEST 메시지가 다음 해당 지역의 HTTRANSPARENT를 반환하고, 할 수있는 아이가 부모가 :

    당신은 사용자가 크기를 조정하지 않고 주변의 부모 창을 드래그 할 수 있도록하려면

    다음 중 하나를 수행 할 수 있습니다 창 프로세스 WM_NCHITTESTHTCAPTION을 반환합니다. 자식 윈도우의 mouseDown 이벤트에
  2. , ReleaseCapture()를 호출 SC_DRAGMOVE-wParam 설정, 부모 윈도우에 WM_SYSCOMMAND 메시지를 전송 (문서화되어 있지만, 그 값은 일명, SC_MOVE + 2$F012이다), 그리고 0

    lParam 세트
+0

내 유일한 옵션은 어쨌든 WM_NCHITTEST를 사용하는 것입니까? 지금은 드래그 크기를 조절하는 신호가 'WM_LBUTTONDOWN' 핸들러 동안 전송되도록 문서화 되었기 때문에 나는 묻고있다. 비록 API를 아무 문제없이 변경할 수 있습니다. 낮은 비트 속임수도'SC_SIZE'와 함께 작동합니까? – andlabs

+0

'WMNCHITTEST'은 당신 만의 * 옵션이 아닙니다. 그리고 네,'SC_SIZE'는 비슷한 낮은 비트 트릭을 가지고 있습니다. 나는 나의 대답을 업데이트했다. –

+0

쿨, 고마워. 그리고 표준 방식으로 완벽을 기하기 위해서, 하위 클래스 인 WM_NCHITTEST만으로는 충분하지 않을 수도 있습니다. – andlabs