-
[C#] - WinForm 사용자 정의 컨트롤 사용하기.NET/CSharp 2018. 8. 26. 10:08
사용자 정의 컨트롤은 보통 사용자 만의 컨트롤을 만들거나 ActiveX 컨트롤 을 만들 때 주로 사용됩니다. 개발하면서 겪었던 특징점들을 정리해보고자 한다.
1. Load 이벤트
보통 Load 이벤트는 Form에 추가하여 주로 사용합니다. Form에 추가하여 사용할 경우에는 UserControl 에서 Load 이벤트를 정의하여 사용할 경우는 많지 않다. Load 이벤트가 필요하신분은 아래의 코드를 참고 하시기 바랍니다.
해당 Form 에서 Load 이벤트를 받으면 되기 때문이다. 해당 Load 이벤트는 UserControl 을 ActiveX 컨트롤로 만들어 Internet Explorer 브라우저에 올릴경우에 사용된다.
개발하면서 겪었던 에러
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
그러나 UserControl에 WebBrowser 컨트롤을 추가 할 경우에는 상황이 틀려진다. WebBrowser 컨트롤을 올릴 경우에 에러가 발생한다. 해당 컨트롤을 추가하지만 Dispose 메소드가 호출되고 ObjectDisposedException 예외가 나면서 에러창을 표시된다. 왜 에러가 나는지는 자세하게 찾아 보 질 못하였다. 여유가 있을 때 찾아봐 해당 글에 내용을 추가하겠다. 그리하여 MFC ActiveX 컨트롤 안에 .NET ActiveX 컨트롤을 올려 작업을 하였다.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
MFC ActiveX 컨트롤에 C# ActiveX 컨트롤 올렸더니 Load 이벤트가 호출되지 않았다.
https://stackoverflow.com/questions/2220483/usercontrol-load-event-not-fired
해결은 위에 링크를 통하여 해결 하였다. 부모 컨트롤 OnLoad 이벤트에서 base.OnLoad(e) 호출을 하지 않았기 때문 이였다. UserControl의 Load 이벤트를 정의 하고 싶을 경우에는 OnLoad 이벤트를 재정의 하고 base.OnLoad(e)를 최상단에 정의하자.
protected override void OnLoad(EventArgs e) { base.OnLoad(e); MessageBox.Show("OnLoad"); } private void TestUserControl_Load(object sender, EventArgs e) { MessageBox.Show("TestUserControl_Load"); }
TestUserControl_Load 메시지 박스 후 OnLoad 메시지 박스 가 호출된다.
2. 키 이벤트 받기
UserControl 키 이벤트를 받는 KeyDown, KeyPress, PreviewKeyDown 가 있다. 허나 해당 이벤트를 등록해도 해당 이벤트가 타지 않는 거였다.
https://stackoverflow.com/questions/1152784/capturing-keydown-events-in-a-usercontrol
위에 StackOverflow 정보를 통하여 해결하였다. ProcessCmdKey 메소드를 재정의 하여 특정 키에 대한 입력이 들어왔을때 처리해준다.
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { Keys keys = Keys.Control | Keys.Shift | Keys.Z; if (keys == keyData) { MessageBox.Show("Ctrl + Shift + Z"); return true; } else { return base.ProcessCmdKey(ref msg, keyData); } }
해당 코드는 Ctrl + Shift + Z 조합키가 눌렸을때 메시지 박스를 띄어주고 아닐때에는 기존 정의되어 있는 부모 클래스의 ProcessCmdKey 함수를 호출해준다.
'.NET > CSharp' 카테고리의 다른 글
[C#] - WinForm Form Esc 키 눌렀을때 종료하기 (0) 2018.09.13 [C#] - Debug 모드 일때 실행과 디버그 구분하기 (0) 2018.09.13 [C#] - WinForm 컨트롤 사용하기 (0) 2018.08.26 [C#] - 실행중인 파일 디렉토리 얻기 (0) 2018.07.18 [C#] - WinForm ActiveX 컨트롤 만들기 (1) 2018.06.09