문제
환경 : .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;
}
}
추가 읽기 :