삽질의 현장/- .NET

#098_닷넷(.NET)_ WinForm - 컨트롤 (Control)

shovelman 2015. 11. 21. 14:04


안녕하세요 삽잡이입니다.


이번시간에는 WinForm에 대한 Control을 알아보려고합니다.



참고로, 지금부터는 'designer.cs' 에 있는 코드는 '디자이너 코드',

그리고 우리 프로그래머가 다루는 코드는 그냥 '코드'라고 칭하겠습니다.

   



control은 사용자와 대화하고, 

사용자에게 보여주기 위한 모든 속성과 메서드를 말합니다.



우선, 디자니어쪽 코드를 보시면 아시겠지만,

이런 범접할 수 없는 아우라(?)를 풍기는 코드가 있지요.


이 코드는 신경 안써도 됩니다.

이 아래부터 우리 개발자들이 신경쓸 코드입니다.



'Windows Form 디자이너에서 생성한 코드'를 열어보시면

메인 Form을 비롯한 추가된 컨트롤들에 대한 코드들이 정의되어있습니다.



생성코드와 컨트롤에 대한 참조자를 확인할 수 있는 것이지요.


그런데, 이 컨트롤들은 또 Form에서 어떻게 사용될수 있을까요...

당연히 '상속'을 받으니 가능하겠죠 허허...



위로 갈 수록 조상님 클래스들입니다... 허허...


Window API 배웠을 때 생각나십니까?

CWND, CDC 이런 것들이 엄청 많이 속성, 기능 가지고 있었죠.


WinForm에서는 Control이 어마어마하게 많이 가지고 있습니다.


컨트롤 내에느

마우스를 클릭하거나, 키보드를 누르는 등에 대한

핵심적인 이벤트들 또한 제공이 기본적으로 됩니다.


지난 시간에 봤을 때 이벤트 핸들러의 매개변수로 EventArgs 형식을 받지 않았습니까?

그런데, WinForm에서는 더욱 세부적인 EventArgs 형식을 받을 수 있습니다.


 

즉, 기존 EventArgs 기능에 해당 이벤트에 관련된 속성이 좀 더 추가가 되었다 이겁니다.


마우스에 대한 이벤트 핸들러라면 MouseEventAgrs,

키보드에 대한 이벤트 핸들러라면 KeyEventArgs

이렇게 말입니다.


이렇게 핸들러를 통해 이벤트가 발생하면 적절한 행동을 취할 수 있습니다.

예를 들어서, 키가 눌리면 이에 맞는 핸들러 함수가 호출되고,

키에 관련된 속성들이 들어있는 매개변수가 들어갑니다.



Form 클래스에서 계속해서 부모 클래스를 찾아 들어가보시길 바랍니다.


어마어마 하지않습니까?

여기에는 control에 관련된 수 많은 이벤트들이 존재합니다.



그런데, 쭉 내려가보시면 

On으로 시작되는 가상 메서드들이 존재함을 확인하실 수 있습니다.




사용자에 반응하는 모든!

상속이 가능한 가상 메서드들입니다.


Form에서는 사용자 메시지를 처리하는데 크게 두가지의 방법이 존재합니다.


바로, 이벤트 핸들러를 사용하는 '이벤트 방식'과,

부모의 것을 가져와서 사용하는 '오버라이딩 방식' 입니다.



예를 들어, 마우스를 클릭했을 시 OnMouseDown() 메서드가 호출되는 것이었지요.

Control 클래스에 Virtual 메서드들로 만들어져있기 때문에
오버라이딩 하여 사용할 수 있다 이겁니다.

기존에는 이벤트를 사용했던 것이고,
이번에는 오버라이드 방식으로 사용하는 것을 소개해드린 것이지요.

그렇게 되면 
굳이, 핸들러 등록 필요 없이 사용이 가능합니다.


WinForm에서는 역시, 다이얼로그도 제공을 합니다.

API, MFC에서는 윈도우창 따로 만들고, 다이얼로그 따로 만들었었죠.

즉, 만드는 함수가 달랐다는 것이죠.

그런데, WinForm에서는 다이얼로그나, 메인 Form이나 모두 Form입니다.


WinForm은 다이얼로그를 만드는 메서드가 따로 없고,

다 Form이라는 소리입니다.


그러면, 어떻게 다이얼로그와 Main Form을 구분할 수 있을까요?

바로 '속성'들을 변경하여 다이얼로그 동작을 위한 준비를 하면 됩니다.



다이얼로그를 만들기 위해서 새로운 WinForm을 띄우고 

속성을 변경해줍니다.



이런식으로 속성을 수정해줍니다.


즉, 속성을 바꿔주면 다이얼로그로써 동작이 가능하다는 것입니다.



필자는 'MyDlg'라는 이름으로 다이얼로그를 위한 Form을 만들었습니다.

따라서, 이 이름의 객체를 생성해주고,

Form 클래스에서 제공해주는 'ShowDialog()' 메서드를 통해 객체를 띄울 수 있습니다.


Show() 메서드를 통해 다이얼로그를 띄울 수 있긴합니다.

그런데 뭔가 어색하죠... 허허... 다이얼로그의 맛이 안납니다.

다이얼로그 박스는 기본적으로 

부모 위에 뜨게 되고 다른 곳으로 포커스가 가지 않는습니다.

그런데, Show() 를 사용하게 되면 부모가 위에 뜰 수 있게 되지요.




지금부터는 Winform 뿐 아니라, 

다른 GUI 프로그램을 만들 때에도 필요한 개념에 대해서 

한번 생각해보려고합니다.



만약, 이처럼 Rect Count에 값을 넣고, 

OK 버튼을 클릭 시 Count 값을 Main Form에 가져오려면 어떻게 해야할까요?


즉, OK 버튼을 누르면 동작하면서 입력된 값을

해당 다이얼로그를 띄운 녀석에게 되돌려주려면 어떻게 해야하냐 이겁니다.


해당 다이얼로그가 종료되면 

입력된 값도 사라지기 때문에 따로 보관을 해줘야합니다.


 


따라서, 문자열을 보관할 수 있도록 속성을 만들어주던지 한 다음에

값을 보관시켜주면 됩니다.


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!