본문 바로가기

오래된 흔적/Win32 API

컨트롤 - 버튼

* 컨트롤도 하나의 윈도우이다
* 화면상의 일정한 영역을 차지
* 자신의 고유 메세지를 처리할 수 있는 능력을 가짐
* But, 진짜 윈도우처럼 타이틀 바나 경계선을 가지고 독립적으로 사용되는 것은 아님.
(부모 윈도우의 차이들로 존재해야 함 - WS_CHILD 필수)
* 부모 윈도우가 파괴될때 같이 파괴

* 윈도우즈에 미리 정의되어 있는 클래스
윈도우 클래스 컨트롤
button 버튼, 체크, 라디오
static 텍스트
scrollbar 스크롤 바
edit 에디트
listbox 리스트 박스
combobox 콤보 박스

* CreateWindow 함수 이용

<부모와의 통신>

* 뭔 일이 생겼을때 부모 윈도우로 Notification Message를 보내준다.
* 버튼을 클릭할 경우 WM_COMMAND 메세지를 부모 윈도우에게 보내며 이때 전달되는 정보는 다음과 같다.

인수 설명
HIWORD(wParam) 통지코드
LOWORD(wParam) 컨트롤의 ID
lParam 메시지를 보낸 차일드 윈도우의 윈도우 핸들
 
* 통지코드는 차일드 컨트롤이 왜 메세지를 보냈는가를 나타냄 (ex: 버튼은 항상 BN_CLICKED)

* WM_COMMAND 메시지는 컨트롤의 통지 메세지뿐만 아니라 메뉴 항목, 액셀러레이터 등의 명령을 처리하는 중요한 일을 한다.

* 사용자로부터의 명령이 될만한 것들을 모두 처리한다.
이때, 컨트롤의 ID, 메뉴 ID, 액셀러레이터 ID 등의 모두 LOWORD(wParam)으로 전달되므로 이 세가지 명령들끼리는 0 ~ 65535까지의 범위에서 unique한 ID를 가져야 한다.

또한 그중에서도 컨트롤의 통지 메세지는 통지 코드에 따라 처리를 달리해야 한다.

* WM_COMMAND 메시지의 일반적인 모양

case WM_COMMAND:
    switch(LOWORD(wParam) { // ID에 따른 분기
    case 메뉴1:처리1;break;
    case 메뉴2:처리2;break;
    case 액셀러레이터1:처리3;break;
    case 컨트롤1:
        switch(HIWORD(wParam)) { // 통지 코드에 따른 분기
        case 통지코드1:처리1;break;
        case 통지코드2:처리2;break;
        ...........
        }
        break;
   }
return 0;