2009-07-08 7 views
0

텍스트 선택을 변경하지 않고 응용 프로그램의 일부 상태에서 클릭 할 수있는 Winforms 응용 프로그램에 여러 줄 텍스트 상자가 있습니다.C# Winforms 텍스트 상자에서 마우스 클릭 이벤트 무시

여전히 MouseDown (또는 Click) 이벤트에 가입하고 싶습니다. 텍스트 선택에 반응하지 않기를 바랍니다.

나는 MouseEventArgs에서 Handled 또는 Cancel 속성을 원했지만 슬프게도 아니오.

내가 선택한 변경 이벤트를 수신하고 필요할 때 재설정하려고 시도 할 수 있지만 선택 변경 이벤트 이전의 현재 선택을 기억해야하기 때문에 약간의 해킹 느낌이들 수도 있습니다. 누구든지 그보다 더 좋은 제안이 있습니까?

답변

9

System.Windows.Forms.Textbox에서 상속받은 자신 만의 텍스트 상자를 만든 다음 WndProc을 재정의 할 수 있습니다.

WndProc는 운영 체제, 전원 메시지, 입력 등에서 모든 것에 대한 메시지를받는 초기 방법입니다. 메서드의 이름은 Win32 (및 Win16) 일로 후퇴합니다.이 두 주 기능 중 하나는 당신은 "WndProc"또는 Windows 프로 시저를 구현합니다.

이렇게하면 이벤트가 기본 구현에 전달되기 전에 마우스 (또는 다른 메시지)에 대한 Windows 메시지를 가로 챌 수 있습니다.

아래 예제에서 처리 할 기본 컨트롤을 아래로, 위로 이동하거나 두 번 클릭하지 않습니다.

public partial class MyTextBox : TextBox 
{ 
    int WM_LBUTTONDOWN = 0x0201; //513 
    int WM_LBUTTONUP = 0x0202; //514 
    int WM_LBUTTONDBLCLK = 0x0203; //515 

    public MyTextBox() 
    { 
     InitializeComponent(); 
    } 

    protected override void WndProc(ref Message m) 
    { 

     if (m.Msg == WM_LBUTTONDOWN || 
      m.Msg == WM_LBUTTONUP || 
      m.Msg == WM_LBUTTONDBLCLK // && Your State To Check 
      ) 
     { 
      //Dont dispatch message 
      return; 
     } 

     //Dispatch as usual 
     base.WndProc(ref m); 
    } 
} 

남은 것은 메시지를 전달할시기를 결정하기 위해 상태를 확인하는 것입니다.

here을 처리 할 Windows 메시지 목록을 찾을 수 있습니다.

+0

아주 좋았습니다. 감사합니다. 닷넷 스택 아래에서 드릴해야한다는 것을 알고있었습니다. – johnc

+0

여전히 마우스 이벤트 인수를 얻지는 못하지만 이 솔루션을 좋아하고 해결할 수 있습니다 – johnc

+0

마우스 이벤트 args를 전달하고 양식에서 동일한 이벤트 처리기를 사용하는 추가 이벤트를 텍스트 상자에 추가 할 수 있습니다. 그런 식으로 기본 마우스 처리 구현을 우회 할 수 있습니다. –

0

레이어 위에 투명 패널을 겹쳐 놓습니다.

+0

나는 그것도 고려했다. 그러나 그것은 똑같이 완고함을 느꼈다. 어쨌든 BackColor가 투명하지 않으므로 – johnc

+0

투명 함에도 불구하고 선택 변경 이벤트를 롤백하는 것보다 간단 할 수 있습니다. 그래도 무언가를 놓칠 수 있습니다. – johnc

1

Enter 이벤트를 처리하고이 이벤트에서 다른 컨트롤에 포커스를 설정하는 방법은 어떻습니까? 그래도 코드가 적 으면서도 꽤 "해킹하는"것처럼 보입니다.

+0

못 생겼지 만 제대로 작동하는 것처럼 보입니다. 더미 빈 레이블에 초점을 맞추면 입력 이벤트로 이동해야합니다. 나는 이것을 아직 답변으로 받아들이지 않을 것이다. 더 좋은 제안이 없다면, 고마워. – johnc

+0

사실, MouseEvent 인수가 필요하다. Dammit – johnc

+0

나는 아직 그것을 받아들이지 않는 것에 대해 당신을 비난하지 않는다. 누구도 더 좋은 아이디어가 있는지보기 위해이 하나를보고 있습니다 :) – marcc

관련 문제