2009-05-28 2 views
0

이유 중 하나는 사용자가 실제로 X 버튼을 클릭했을 때를 감지해야한다는 것입니다. 내가 지금까지 가지고하는 것은 이것이다 :창에서 "X"버튼의 좌표를 어떻게 얻을 수 있습니까?

protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == (int)0xa1) //WM_NCLBUTTONDOWN 
     { 
      Point p = new Point((int)m.LParam); 
      p = this.PointToClient(p); 
      if (p.X > 680) 
      { 
       //do what I need to do... 
      } 
     } 

     base.WndProc(ref m); 
    } 

는 기본적으로, 마우스가 윈도우의 비 클라이언트 영역을 클릭하다 "WM_NCLBUTTONDOWN"메시지를 밖을 봐. 그런 다음 LParam에서 X와 Y 좌표를 얻고 마지막으로이를 화면 좌표로 변환합니다. 그래서이 시점에서, 나는 사용자가 비 클라이언트 영역을 클릭했고 폼의 어디에 있는지 알고 있습니다.

제 질문은 어떻게 이러한 좌표가 X 버튼에 있는지 알 수 있습니다. 지금은 680을 하드 코딩하고 있는데, 이는 윈도우의 현재 크기에서 작동하기 때문에 (크기는 크지 않지만) 문제는 XP보다 큰 X 버튼이있는 Windows 7을 사용하고 있다는 것입니다. 따라서 분명히 강화는 실용적이지 않습니다. 선택권. 또한 Y 좌표도 코딩하지 않았으므로 누군가가 창의 오른쪽 가장자리를 클릭하면 해당 코드도 트리거됩니다. 그래서 ... 누구든지 아이디어가 있습니까?

+3

버튼을 누르는 것이 중요합니까? 아니면 사용자가 응용 프로그램을 닫고 있는지 실제로 확인하려고합니까? –

+1

"x 버튼"을 다른 닫기/종료 메시지와 다르게 처리하려는 이유는 무엇입니까? – Tim

+0

이상한 상황이지만 인정 하겠지만 기본적으로 대화 상자입니다. 닫을 때 유효성 검사를 트리거하려고합니다. 표준 FormValidating 이벤트는 Dialog이기 때문에 속성을 작동하지 않습니다 (묻지 않음, 다른 날 다른 게시물 , 나는 그것이 버그라고 생각한다). 그래서 FormClosing 이벤트에서 수동으로 Validation을 처리하고 있습니다 만, 사용자가 X를 클릭했는지 알 필요가 있습니다.이 경우 유효성 검사를 건너 뛰고 싶습니다. 말이된다? – BFree

답변

3

OK 버튼과 Cancel 버튼이 있다고 가정 해 봅시다. 버튼 중 하나를 클릭 할 때 값을 설정하는 것이 좋습니다. 그런 다음 양식의 마감 이벤트에서이 값을 설정하지 않으면 X 버튼을 클릭 한 것입니다. 양식을 닫는 다른 방법이없는 한 나는 ... 잘 모르는 것 같아요

편집 :

가 대신 글로벌 부울을 사용하는, 당신이 당신의 버튼 클릭에 폼의 DialogResult를 속성을 변경할 수 있습니다. 그래도 X 버튼을 클릭하면 DialogResult 값이 무엇인지 잘 모르겠습니다. 시도해 보셔야합니다.

+0

좋아요, 방금 글을 다시 읽었습니다. 그리고 지금 당신이 말하는 것을 보았습니다. 밸리데이션을 촉발시키는 버튼에 대해 불리언 값을 유지하고 싶지는 않았습니다. 다른 해결책이 없다면 나는 이것에 의지해야만 할 수도 있습니다. 지금은이 질문을 계속 열어 둘 것입니다. 아무도 해결책을 제시 할 수 없다면이를 받아 들일 것입니다. 감사!. +1 – BFree

+0

확인이 필요한 플래그를 유지하는 것은 해킹이지만 OP가 원래 요청한 것보다 해킹이 덜합니다. +1 – Tim

+1

당신은 또한 부울 대신 DialogResult를 사용할 수 있습니다. 내 편집을 확인하십시오! –

0

마우스가 닫기 단추 위로 마우스를 가져갈 때 알려주는 WM_NCHITTEST 메시지를 테스트하는 경우.