그룹 상자는 다른 컨트롤이 들어있는 정적 컨트롤입니다. 올바르게 배치 된 경우 사용자 인터페이스를 직관적으로 만들기 위해 모든 것을 "그룹화"하기 위해 설계되었습니다. 따라서 GroupBox를 대신하여 사용할 수있는 이벤트가 거의 없습니다.
GroupBox에서 상속 된 클래스를 하위 클래스로 만들고 마우스 이동 이벤트를 가로 채기 위해 새 클래스를 만들 수 있습니다.이전에 사용한 적이있는 매우 유용한 클래스가 있으며 하위 클래 싱을 수행하고 MouseMove에 대한 이벤트를 트리거하는 것은 정말 쉽습니다.
서브 클래스가 어떻게 작동하는지 알기 위해이 here을 보아라. 좋아, VB.NET으로 작성되었지만, C#으로 변환하는 것은 정말 쉽다. 내가 상상하는 코드이다.
참고 : 여기에 포함 된 코드는 내 머리 위로 가기 때문에 오류가있을 수 있지만 그 것이 핵심입니다.
편집 : 조 화이트의 의견에 대응, 나는 수정 된 코드를 포함하고는 ... WM_MOUSEMOVE를 보내 내가 VS 2008 프로에서이 문제를 재현하는 방법에 대한 아래의 단계를 살펴 않습니다.
public class MyGroupBox : System.Windows.Forms.GroupBox
{
private SubClass sc;
private const int WM_MOUSEMOVE = 0x200;
public delegate void MyMouseMoveEventHandler(object sender, System.EventArgs e);
public event MyMouseMoveEventHandler MyMouseMove;
public MyGroupBox()
: base()
{
sc = new SubClass(this.Handle, true);
sc.SubClassedWndProc += new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
}
protected override void Dispose(bool disposing)
{
if (sc.SubClassed)
{
sc.SubClassedWndProc -= new SubClass.SubClassWndProcEventHandler(sc_SubClassedWndProc);
sc.SubClassed = false;
}
base.Dispose(disposing);
}
private void OnMyMouseMove()
{
if (this.MyMouseMove != null) this.MyMouseMove(this, System.EventArgs.Empty);
}
void sc_SubClassedWndProc(ref Message m)
{
if (m.Msg == WM_MOUSEMOVE) this.OnMyMouseMove();
}
}
#region SubClass Classing Handler Class
public class SubClass : System.Windows.Forms.NativeWindow
{
public delegate void
SubClassWndProcEventHandler(ref System.Windows.Forms.Message m);
public event SubClassWndProcEventHandler SubClassedWndProc;
private bool IsSubClassed = false;
public SubClass(IntPtr Handle, bool _SubClass)
{
base.AssignHandle(Handle);
this.IsSubClassed = _SubClass;
}
public bool SubClassed
{
get { return this.IsSubClassed; }
set { this.IsSubClassed = value; }
}
protected override void WndProc(ref Message m)
{
if (this.IsSubClassed)
{
OnSubClassedWndProc(ref m);
}
base.WndProc(ref m);
}
#region HiWord Message Cracker
public int HiWord(int Number)
{
return ((Number >> 16) & 0xffff);
}
#endregion
#region LoWord Message Cracker
public int LoWord(int Number)
{
return (Number & 0xffff);
}
#endregion
#region MakeLong Message Cracker
public int MakeLong(int LoWord, int HiWord)
{
return (HiWord << 16) | (LoWord & 0xffff);
}
#endregion
#region MakeLParam Message Cracker
public IntPtr MakeLParam(int LoWord, int HiWord)
{
return (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
}
#endregion
private void OnSubClassedWndProc(ref Message m)
{
if (SubClassedWndProc != null)
{
this.SubClassedWndProc(ref m);
}
}
}
#endregion
- 간단한 빈 양식을 만듭니다.
- 드래그 그룹 도구 팔레트에서 상자와 양식에 드롭, 기본 이름은 당신의 폼 디자이너의 코드에서
groupBox1
- 될이 작업을 수행하여 코드 참조를 변경합니다 :
System.Windows.Forms.GroupBox groupBox1;
WindowsApplication.MyGroupBox groupBox1;
에 InitializeComponent()
내 메서드를 사용하여 GroupBox의 인스턴스를 다음으로 변경하십시오. this.groupBox1 = new WindowsApplication.MyGroupBox();
- 저장하고 컴파일 만하면됩니다.
- 디자이너 창으로 돌아가서 그룹 상자를 클릭하고 속성 도구 상자 내에서
MyMouseMove
이벤트를 찾아 연결합니다.
- 이벤트 핸들러는 다음과 같이 보일 것이다 :
private void groupBox1_MyMouseMove(object sender, EventArgs e)
{
System.Diagnostics.Debug.WriteLine("MyMouseMove!");
}
는 응용 프로그램을 실행하고 매번 당신이 출력 표시되는 그룹 상자 내부의 마우스 이동 'MyMouseMove를!'.
희망 사항은 힌트를 제공합니다. 감사합니다. 탐.
다른 응답이'WM_MOUSEMOVE'이 있는지 확인하기 때문에 나는 회의적 :
이것은 다음과 같은 방법을 트리거합니다 그룹 박스에 보내지도 않습니다. 이 코드가 실제로 GroupBox와 작동하는지 테스트 해 보셨습니까? –
@Joe White : 제 수정 된 코드와이 코드가 작동하도록하는 단계를 참조하십시오. HTH. 안부 인사, 톰. – t0mm13b