1. 표준 컨트롤

 

- 컨트롤은 항상 자식 윈도우로만 존재합니다.

 

컨트롤 동작 방식


1) 통지 메시지 : 컨트롤에서 부모 윈도우로 보내는 메시지를 의미한다. 주로 WM_COMMAND를 보내지만 때로는 다른 이름의 통지 메시지를 부모 윈도우에 보내기도 한다. 주로 사용자 행위로 인한 컨트롤 상태 변화를 알리고 메모리 부족 등으로 인한 오류를 전달하기도 함

 

2) 컨트롤 메시지 : 부모 윈도우가 컨트롤에 보내는 메시지. 부모 윈도우는 컨트롤의 상태를 알아내거나 변경하기 위해서 이 메시지를 사용, 컨트롤에 따라 보낼 수 있는 컨트롤 메시지의 종류가 달라짐

 

- 컨트롤도 윈도우 이므로 부모 윈도우는 일반 윈도우를 다룰 때 사용하는 함수를 컨트롤에도 적용할 수 있다.

 

컨트롤의 종류와 상속 관계

 

- 컨트롤 생성 방법은 1)코드를 통해서 직접만드는 방법 과 2) 컨트롤 대화 상자 리소스의 일부로 디자인하는 방법이 있다.

 

▶ 버튼 컨트롤

 

- 종류 푸시 버튼, 체크 박스, 라디오 버튼, 그룹 박스가 있다.

- 컨트롤에 관련된 내용은 자바에서도 배웠으므로 자세한 내용은 생략

 

ex. 컨트롤 생성하는 방법 1 - 코드 실행하여 만들기

 

CButton m_button; //푸시 버튼 생성

m_button.Create(_T("버튼클릭"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(100, 100, 200, 130), this, 101);

 

CButton::Create()

 

BOOL CButton::Create(LPCTSTR lpszCaption, DWORD dwStyle, const Rect& rect, Cwn* pParentWnd, UINT nID);

 

- dwStyle : 컨트롤 스타일, 윈도우 스타일과 버튼 스타일의 조합으로 이루어진다. 윈도우 스타일 중 WS_CHILD 와 WS_VISIBLE은 컨트롤을 만들 때 반드시 들어가야 한다. (버튼 스타일 교재 P360 참조)

- pParentWnd : 부모 윈도우 지정, 컨트롤은 반드시 자식 윈도우로만 존재하므로 부모 윈도우에 NULL값인 경우 오류

- nID : 컨트롤 ID, 부모 윈도우가 서로 다른 자식 윈도우 컨트롤을 구분하기 위해서 필요

 

통지 메시지, 컨트롤 메시지 처리 방법

 

- 컨트롤을 생성하였으면 윈도우에서 컨트롤과 상호작용하기 위해서 통지 메시지와 컨트롤 메시지를 주고 받아야 합니다.

 

1) 각 컨트롤이 보내는 통지 메시지에 대해 메시지 핸들러 함수를 작성

 

- 통지 메시지가 발생하면 자동으로 해당 메시지 핸들러가 호출된다.

 

ex.

ON_BN_CLICK(101, OnButtonClicked) //메시지 맵에 등록

...

void [뷰클래스]::OnButtonClicked(){ //윈도우 클래스에 핸들러 등록

   m_button.SetCheck(BST_CHECKED); // m_button : 해당 컨트롤에 대한 레퍼런스

}

 

ex. 코드를 통해서 버튼 만들기

 

1) 사용한 컨트롤에 대한 객체 선언

 

2) 윈도우(뷰) 클래스 생성 시 호출되는 OnCreate() 함수에 아래와 같이 작성 

 

3) 컨트롤에서 통지 메시지를 처리할 메시지 핸들러 함수 생성, 작성 ※해당 함수가 메시지 핸들러인 듯을 표시 afx_msg



 

4) 메시지 맵에 등록

- 현재 버튼 클릭에 해당 통지 메시지를 받으므로 ON_BN_CLICKED() 매크로를 등록,

※ 컨트롤에서 사용자 입력을 통한 통지 메시지를 윈도우에 전달하기 위해서 컨트롤 형태에 알맞는 매크로를 등록해야 한다. 자세한 내용은 홈페이지 참고

 

실행 화면

 

ex, 대화 상자 리소스에 포함하여 만들기

 

1) 프로젝트 생성 시 아래와 같이 기본 클래스를 CFormView로 바꾼다.

 

2) 대화 상자 리소스를 띄워서 사용한 컨트롤을 알맞는 자리에 배치한다.

 

3) 컨트롤의 레퍼런스를 얻기 위해서 변수를 추가합니다.

 

 

4) 만약 위와 같은 방법은 사용하지 않고 사용자가 윈도우 클래스의 선언부에 직접 선언을 한 경우(m_radio2가 해당) 윈도우(뷰)클래스의 헤더 파일과 구현 파일에 수동으로 추가 해야 합니다.

5) OnInitialUpdate() 함수에 컨트롤을 초기화한다. 이 가상 함수는 뷰가 화면에 보이기 전에 자동으로 호출

 

6) 통지 메시지 핸들러 추가하기



 

 

<출처> https://m.blog.naver.com/PostView.nhn?blogId=qkrghdud0&logNo=220905641256&proxyReferer=https%3A%2F%2Fwww.google.com%2F