문제

환경 : .NET Framework 2.0, vs 2008.

특정 마우스 이벤트를 통과하는 특정 .NET 컨트롤 (레이블, 패널)의 서브 클래스를 만들려고합니다 (MouseDown, MouseMove, MouseUp) 부모 제어 (또는 대안 적으로 최상위 형식). 표준 컨트롤의 경우 이러한 이벤트에 대한 핸들러를 만들어 다음을 수행 할 수 있습니다.

public class TheForm : Form
{
    private Label theLabel;

    private void InitializeComponent()
    {
        theLabel = new Label();
        theLabel.MouseDown += new MouseEventHandler(theLabel_MouseDown);
    }

    private void theLabel_MouseDown(object sender, MouseEventArgs e)
    {
        int xTrans = e.X + this.Location.X;
        int yTrans = e.Y + this.Location.Y;
        MouseEventArgs eTrans = new MouseEventArgs(e.Button, e.Clicks, xTrans, yTrans, e.Delta);
        this.OnMouseDown(eTrans);
    }
}

상위 컨트롤에서 이벤트를 제기하는 방법이 보호되고 부모 컨트롤을위한 예선이 없기 때문에 이벤트 핸들러를 컨트롤의 서브 클래스로 옮길 수 없습니다.

보호 된 멤버에 액세스 할 수 없습니다 System.Windows.Forms.Control.OnMouseDown(System.Windows.Forms.MouseEventArgs) 유형의 예선을 통해 System.Windows.Forms.Control; 예선은 유형이어야합니다 TheProject.NoCaptureLabel (또는 그것에서 파생).

나는 그것을 우선하고있다 WndProc 내 하위 클래스의 제어 방법이지만 누군가가 나에게 더 깨끗한 솔루션을 줄 수 있기를 바랍니다.

도움이 되었습니까?

해결책

예. 많은 검색 후 기사를 찾았습니다. "플로팅 컨트롤, 툴팁 스타일", 사용하는 WndProc 메시지를 변경합니다 WM_NCHITTEST 에게 HTTRANSPARENT, 만들기 Control 마우스 이벤트에 투명합니다.

이를 달성하려면 상속 된 제어를 만듭니다 Label 다음 코드를 추가하십시오.

protected override void WndProc(ref Message m)
{
    const int WM_NCHITTEST = 0x0084;
    const int HTTRANSPARENT = (-1);

    if (m.Msg == WM_NCHITTEST)
    {
        m.Result = (IntPtr)HTTRANSPARENT;
    }
    else
    {
        base.WndProc(ref m);
    }
}

.NET Framework 4 클라이언트 프로파일로 Visual Studio 2010에서 이것을 테스트했습니다.

다른 팁

기본 클래스에 공개/보호 된 방법을 작성하여 이벤트를 제기해야합니다. 그런 다음 파생 클래스 에서이 메소드를 호출하십시오.

또는

이것이 당신이 원하는 것입니까?

public class MyLabel : Label
{
    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        //Do derived class stuff here
    }
}

그만큼 WS_EX_TRANSPARENT 확장 된 창 스타일은 실제로 이것을 수행합니다 (내내 툴팁이 사용하는 것입니다). 많은 핸들러를 코딩하기 위해이 스타일을 적용하는 것을 고려할 수 있습니다.

이렇게하려면 CreateParams 방법:

protected override CreateParams CreateParams
{
  get
  {
    CreateParams cp=base.CreateParams;
    cp.ExStyle|=0x00000020; //WS_EX_TRANSPARENT
    return cp;
  }
}

추가 읽기 :

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top