API

컨트롤(체크박스)

알 수 없는 사용자 2011. 9. 20. 16:11

체크박스는 참, 거짓의 진위적인 선택을 입력받을 때 주로 사용된다.

스타일에 따라 4가지 종류의 체크박스가 있다.

선택가능한 옵션의 개수에 따라 두가지 상태를 가지는 체크박스(BS_CHECKBOX)와 세가지 상태를 가지는 체크박스(BS_3STATE)로 구분된다.
두가지 상태를 가지는 체크박스는 선택/비선택
세가지 상태를 가지는 체크박스는 선택/비선택/Grayed

동작방법에 따라 자동체크 박스와 수동체크 박스가 있다.
체크 박스의 상태가 변경될 때마다 어떤 처리를 해야하고 체크조건이 복잡한 경우라면 수동 체크 박스를 사용하고 필요할 때 상태를 조사하기만 하면 될 경우 자동 체크박스를 사용한다.
예를 들어 음소거같은경우 체크를 하면 음이 소거되어야 하며 대화상자가 닫힐 때 적용되는 것이 아니므로 수동으로 사용하는 것이 바람직하다.

WinMain

WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);

컨트롤의 배경색과 윈도우의 배경색을 맞추기 위해 변경

WndProc

HDC hdc;
PAINTSTRUCT ps;
static HWND c1,c2,c3,c4;
static BOOL bEllipse = FALSE;

LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  c1 = CreateWindow(TEXT("button"),TEXT("Draw Ellipse?"),WS_CHILD|WS_VISIBLE|
    BS_CHECKBOX,20,20,160,25,hWnd,(HMENU)0,g_hInst,NULL);

  c2 = CreateWindow(TEXT("button"),TEXT("Good bye Message?"),WS_CHILD|WS_VISIBLE|
    BS_AUTOCHECKBOX,20,50,160,25,hWnd,(HMENU)1,g_hInst,NULL);

  c3 = CreateWindow(TEXT("button"),TEXT("3State"),WS_CHILD|WS_VISIBLE|
    BS_3STATE,20,80,160,25,hWnd,(HMENU)2,g_hInst,NULL);
  
  c4 = CreateWindow(TEXT("button"),TEXT("Auto 3State"),WS_CHILD|WS_VISIBLE|
    BS_AUTO3STATE,20,110,160,25,hWnd,(HMENU)3,g_hInst,NULL);
  
  return 0;
}

LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  switch(LOWORD(wParam))
  {
    case 0:
      if(SendMessage(c1,BM_GETCHECK,0,0)==BST_UNCHECKED)
      {
        SendMessage(c1,BM_SETCHECK,BST_CHECKED,0);
        bEllipse = TRUE;
      }
      else
      {
        SendMessage(c1,BM_SETCHECK,BST_UNCHECKED,0);
        bEllipse = FALSE;
      }
      InvalidateRect(hWnd,NULL,TRUE);
      break;

    case 2:
      if(SendMessage(c3,BM_GETCHECK,0,0)==BST_UNCHECKED)
      {
        SendMessage(c3,BM_SETCHECK,BST_CHECKED,0);
        bEllipse = FALSE;
      }
      else if(SendMessage(c3,BM_GETCHECK,0,0)==BST_INDETERMINATE)
      {
        SendMessage(c3,BM_SETCHECK,BST_UNCHECKED,0);
        bEllipse = FALSE;
      }
      else
      {
        SendMessage(c3,BM_SETCHECK,BST_INDETERMINATE,0);
        break;
      }
  }
  return 0;
}

LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  hdc = BeginPaint(hWnd, &ps);
  if(bEllipse==TRUE)
  {
    Ellipse(hdc,200,100,400,200);
  }
  else
  {
    Rectangle(hdc,200,100,400,200);
  }
  EndPaint(hWnd, &ps);
  
  return 0;
}

LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  if(SendMessage(c2,BM_GETCHECK,0,0)==BST_CHECKED)
  {
    MessageBox(hWnd,TEXT("Good bye"),TEXT("Check"),MB_OK);
  }
  PostQuitMessage(0);
  return 0;
}

4가지 종류의 체크박스를 모두 만들어 보기 위해 c1~c4까지 윈도우 핸들 변수를 선언


실행결과



첫번째 체크박스(ID 0번)의 선택 상태에 따라 사각형이 그려지기도 하고 타원형이 그려지기도 한다.
체크박스가 눌러지는 즉시 이 체크 박스는 부모 윈도우로 BN_CLICKED 통지 메시지를 보낸다. 부모 윈도우는 0번 컨트롤인 Draw Ellipse 체크 박스가 눌러질 때 마다 체크박스의 상태를 조사해서 체크 상태를 토글하고 bEllipse변수의 값도 값이 토글시킨다.

두번째 체크박스는 선택 상태를 변경하는 시점에서는 아무런 동작도 하지 않지만 이 체크 박스가 선택되어 있으면 프로그램 종료 전에 메시지 박스를 출력한다.
체크 상태를 토글하는데 별다른 조건이 없어 자동체크박스로 만듬


세번째, 네번째 체크박스는 세가지 상태를 가지는 체크 박스의 모양을 살펴보기 위해 만들어만 놓았고
기능은 없다.


컨트롤의 메시지

컨트롤은 자신에게 어떤 변화가 있을 때 마다 부모 윈도우로 메시지를 보내며 이 메시지를 통지메시지라 부른다. 체크박스의 경우 사용자가 마우스로 클릭할 때마다 부모 윈도우로 BN_CLICKED메시지를 보낸다.

부모윈도우가 받은 후 체크 박스로 보낼 수 있는 메시지에는 두 가지가 있다. 

메시지

설    명

BM_GETCHECK

체크박스가 현재 체크되어 있는 상태인지조사하며 wParam, lParam은 사용하지 않는다. 체크상태는 리턴값으로 돌려진다

BM_SETCHECK

체크박스의 체크상태를 변경하며 wParam에 변경할 체크 상태를 지정한다.


BM_GETCHECK에 의해 리턴되는 값, 또는 BM_SETCHECK에 의해 설정되는 체크박스의 상태는 세 가지가 있다.

상  수

의    미

BST_UNCHECKED

0

현재 체크되어 있지 않다

BST_CHECKED

1

현재 체크되어 있다.

BST_INDETERMINATE

2

Grayed

체크박스가 클릭되면 BN_CLICKED 통지메시지가 WM_COMMAND 메시지를 통해 부모에게 전달된다.