본문 바로가기
Programming/C#

C#_13 : WinForm으로 만드는 사용자 인터페이스1

by 공부합시다홍아 2020. 6. 12.

WinForm 

폼 디자이너에게 툴을 제공해서 프로그래머가 그림 그리듯 UI를 만들 수 있게 합니다. 도구 상자에서 버튼이나 콤보박스 등의 컨트롤을 끌어다 윈도우 위에 올려놓으면 컴파일 후의 프로그램과 똑같은 UI가 만들어진다. 이른바 WYSIWYG ( What You See Is What You Get ) 방식의 개발을 지원합니다.

컨트롤을 윈도우 위에 배치할 때마다 폼 디자이너는 우리에게 프로그램의 UI를 표시하는 한편, 뒤로는 관련 C#코드를 자동으로 만들어줍니다. 프로퍼티를 변경할 때, 이벤트 처리기를 추가할 때도 자동으로 코드를 수정합니다. 

C# 코드로 WINFORM 윈도우 만들기

  • 윈도우를 만드는 절차

  1.     윈도우 클래스를 정의합니다. ( 윈도우에 대한 정보를 가지고 있는 구조체 )

  2.     정의된 윈도우 클래스를 등록합니다.

  3.     윈도우를 생성합니다.

  4.     윈도우를 사용자에게 보여줍니다.

  5.     메시지 루프를 돌면서 프로그램을 시작합니다. 

하지만 이것은 WIN32 APT를 이용하여 윈도우를 만들 때의 이야기 입니다. .NET 프레임워크는 이러한 과정들을 잘 포장해서 개발자들이 간편하게 윈도우를 개발할  수 있도록 WinForm 클래스 라이브러리를 제공합니다. 

WinForm 클래스를 이용한 윈도우 생성 절차는 다음과 같다.

  1. System.Windows.Forms.Form 클래스에서 파생된 윈도우 폼 클래스를 선언합니다.

  2. 1번에서 만든 클래스의 인스턴스를 System.Windows.Forms.Application.Run() 메소드에 매개 변수로 넘겨 호출합니다.

위의 그림은 WinForm을 이용하여 아주 간단하게 윈도우를 생성할 수 있다는 것을 보여줍니다. 

간단한 시스템과 호출문을 이용하여 WinForm을 출력시킬 수 있습니다. 

 

Application 클래스 

Application 클래스는 크게 두 가지 역할을 수행하는 데 하나는 윈도우 으용 프로그램을 시작하고 종료시키는 메소드를 제공하는 것이고 또 다른 하나는 윈도우 메시지를 처리하는 것이라고 할 수 있습니다. 

응용 프로그램을 시작하도록 하는 메소드는 우리가 조금 전에 만들었던 예제 프로그램에서 본 것처럼 Application.Run()입니다. 그리고 응용프로그램을 종료시키는 메소드는 Application.Exit()입니다. 

어느곳에서든 Application.Exit()를 호출하면 해당 응용 프로그램은 종료합니다. 

 

Application 클래스의 재밌는 기능 중 하나인 "메시지 필터링" 기능이 있습니다.

윈도우 기반의 응용 프로그램들은 갑자기 일어나는 사건(이벤트 : Event)에 반응해서 코드가 실행되는 이른바 이벤트 기반 방식으로 만들어집니다. 

이벤트들은 일견 사용자가 직접 응용 프로그램에 대해 일으킨 것처럼 보이지만, 사실은 윈도우 운영체제가 일으킨 것이다. 사용자가 마우스나 키보드 같은 하드웨어를 제어하면 인터럽트가 발생하고 이 인터럽트를 윈도우 운영체제가 받아들입니다. 운영체제는 다시 이 인터럽트를 바탕으로 윈도우 메시지를 만든 뒤 이벤트를 받아야 하는 응용프로그램에 보내준다. 

한편, 윈도우 메시지는 종류가 매우 다양합니다. 윈도우 응용 프로그램은 마우스 이동이나 클릭, 키보드 입력처럼 미리 시스템에 정의되어 있는 메시지를 받지만, 다른 응용프로그램이 자체적으로 정의한 메시지도 받을 수 있다. 

Application 클래스는 응용 프로그램이 받고 있는 수 많은 메시지 중에 관심 있는 메시지만 걸러낼 수 있는 메시지 필터링 기능을 갖고 있습니다. 

윈도우 운영체제에서 정의하고 있는 메시지는 식별 번호(ID)가 붙어져 있습니다.  예를 들어 WM_LBUTTONDOWN 메시지는 ID가 0x201로 정의되어 있습니다.

Application 클래스는 특정 ID를 갖는 메시지를 걸러내는 필터를 함께 등록해뒀다가 응용 프로그램에 메시지가 전달되면 해당 필터를 동작시킵니다. 만약 메시지의 ID가 필터에서 관심을 갖고 있는 값이라면 필터는 메시지를 요리하고, 그렇지 않다면 메시지를 거르지 않고 메시지를 받아야 하는 폼이나 컨트롤로 보내서 이벤트를 발생시킵니다. 

메시지 발생 --> 메시지 필터 --> 이벤트 발생 --> 이벤트 처리기

 

Message의 구조체 

  • HWnd : 메시지를 받는 윈도우의 핸들입니다. 핸들은 윈도우의 인스턴스를 식별하고 관리하기 위해 운영체제가 붙여놓은 번호이다.

  • Msg     : 메시지 ID

  • LParam: 메시지를 처리하는 데 필요한 정보가 담겨있다.

  • RParam: 메시지를 처리하는 데 필요한 부가 정보가 담겨 있다.

  • Result   : 메시지 처리에 대한 응답으로 윈도우 운영체제에 반환되는 값을 지정한다.

 

728x90

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

c# 15 : 리플랙션  (0) 2020.06.15
C# 14 : 람다식  (0) 2020.06.15
c#_12 : LINQ , JOIN  (0) 2020.06.12
c#_11 : 대리자와 이벤트  (0) 2020.06.12
c#_10 : 인덱서와 예외처리  (0) 2020.06.11