상세 컨텐츠

본문 제목

Form Handle

C#

by 탑~! 2010. 10. 12. 11:11

본문

윈도우 프로그램을 개발하다 보면, 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)을 클릭했을경우, 부모폼의 메서드를 호출하게 된다.

출처 :  http://www.endlessdb.com/?mid=dotnet&document_srl=2004

 


'C#' 카테고리의 다른 글

모니터 영역 사이즈 구하기  (0) 2010.12.08
wmi 로 하드웨어 정보 읽기  (0) 2010.10.12
C# WebCam User Control Source  (0) 2010.09.28
C# 의 데이타 유형  (0) 2010.09.09
String.Format  (0) 2010.09.01

관련글 더보기