윈도우 프로그램을 개발하다 보면, form간의 데이터 전달이나 메서드 호출을 해야되는 경우가 있다.
귀찮은 개발자는 자식 폼을 띄울 경우, 생성자에 this를 넘기곤 한다. 하지만 갠히 넘겨 받은 폼에서는 부모 폼으로 강제 형 변환을 해서 메서드를 호출 했다가는 크로스 스레드 호출할 수 없다는 문제를 종종 만나곤 한다.
물론 invoke 메서드를 호출해서
예를 들면
this.mainForm.Invoke(this.mainForm.DelegateShowJobRateInstance, new object[] { result }); //어디서 발췌...-_-;
이런 식으로 부모 폼의 델리게이트를 호출해서 부모폼의 메서드를 호출하는 방법도 있다.
물론 자주 쓰는 방법 이다.
하지만 지금 다룰 내용은 form handle에 대해 알아보려고 한다.
form 도 마찬가지 이겠지만, Control 클래스에서 상속받은 넘 이므로, 컨트롤의 창 핸들(HWND)값을 가지고 있다. 이 핸들 값은 IntPtr 구조체 타입의 Control.Handle 속성을 이용해 얻을 수 있는데, 이 핸들을 이용하면, 창(form)의 참조를 얻을 수 있다.
form1.cs 와 form2.cs가 있다고 가정하자.
form1의 특정 버튼을 클릭해서 form2에 핸들을 넘겨줬다면,
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//form1.cs 일부
private void btnPop_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.SetHandle = this.Handle;//form2의 프로퍼티에 핸들을 넘긴다.
form2.Show();
}
public void CallBtnEvent()
{
MessageBox.Show("핸들을 이용해서 호출된 메서드");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//form2.cs 일부
private IntPtr formHandle = IntPtr.Zero; //핸들 초기화
public IntPtr SetHandle
{
set { this.formHandle = value; }
}
//자식form에서 핸들 참조여부에 따라 있을경우, 부모form의 메서드를 호출한다.
private void btnCallTest_Click(object sender, EventArgs e)
{
if (this.formHandle == IntPtr.Zero)
{
MessageBox.Show("Handle is not Assigned!");
return;
}
Control ctl = Control.FromHandle(this.formHandle);
if (ctl == null)
{
MessageBox.Show("Another Form is null!");
return;
}
Form1 form1 = (Form1)ctl;
form1.CallBtnEvent();
}
핸들을 넘겼을 경우, 자식폼에서 버튼(btnCallTest)을 클릭했을경우, 부모폼의 메서드를 호출하게 된다.
부모 폼의 메서드 호출하는 방법은 많지만, 핸들을 이용한 방법을 알아봤습니다.
기본을 활용해서 마니마니 응용해보세요 홍홍홍~