블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
    - 라디오 버튼은 "button" 클래스에 BS_RADIOBUTTON, BS_AUTORADIOBUTTON 둘 중 하나의 스타일을 지정하면 라디오 버튼이 된다. 체크 박스와 마찬가지로 수동, 자동의 두 가지 종류가 있는데 라디오 버튼이 체크 상태를 스스로 변경하는가 그렇지 않은가의 차이가 있다.
    - 체크 버튼은 진위적인 옵션을 개별적으로 입력받는데 비해 라디오 버튼은 여러가지 선택 사항 중 한가지만 선택할 필요가 있을 때 사용한다. 그래서 하나의 선택 사항에 대해 여러 개의 라디오 버튼들이 그룸을 이루어 사용된다는 특징이 있다.

    - 라디오 버튼의 그룸을 구성할 때  그룸을 이루는 첫 번째 라디오 버튼에만 WS_GROUP 스타일을 주고 나머지 라디오 버튼은 WS_GROUP  스타일을 주지 않으면 된다. 즉, 최초로 WS_GROUP을 가지는 라디오 버튼 부터 다음 WS_GROUP 스타일을 가지는 라디오 버튼 직전까지가 한 그룹이 된다.

    - 예제
    #include "MsgProc.h"

    enum{ID_R1 = 101, ID_R2, ID_R3, ID_R4, ID_R5, ID_R6}; // 열거형
    HWND r1, r2, r3, r4, r5, r6;
    int Graph = 0;
    COLORREF Color = RGB(000);

    LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) // 프로그램 실행시 가장 먼저 실행
    {
      // Graph, Color 두 그룹 박스 컨트롤
      CreateWindow(TEXT("button"), TEXT("Graph"), WS_CHILD|WS_VISIBLE|
        BS_GROUPBOX, 55120110, hWnd, (HMENU)0, g_hInst, NULL); 
      CreateWindow(TEXT("button"), TEXT("Color"), WS_CHILD|WS_VISIBLE|
        BS_GROUPBOX, 1455120110, hWnd, (HMENU)1, g_hInst, NULL);
      // Graph Group 라디오 버튼 생성
      // ID 101, 핸들 r1
      r1 = CreateWindow(TEXT("button"), TEXT("Rectangle"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON|WS_GROUP, 102010030, hWnd, (HMENU)ID_R1, g_hInst, NULL);
      r2 = CreateWindow(TEXT("button"), TEXT("Ellipse"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON, 105010030, hWnd, (HMENU)ID_R2, g_hInst, NULL);
      r3 = CreateWindow(TEXT("button"), TEXT("Line"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON, 108010030, hWnd, (HMENU)ID_R3, g_hInst, NULL);
      // Color Group 라디오 버튼 생성
      r4 = CreateWindow(TEXT("button"), TEXT("Black"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON|WS_GROUP, 1502010030, hWnd, (HMENU)ID_R4, g_hInst, NULL);
      r5 = CreateWindow(TEXT("button"), TEXT("Red"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON, 1505010030, hWnd, (HMENU)ID_R5, g_hInst, NULL);
      r6 = CreateWindow(TEXT("button"), TEXT("Blue"), WS_CHILD|WS_VISIBLE|
        BS_AUTORADIOBUTTON, 1508010030, hWnd, (HMENU)ID_R6, g_hInst, NULL);
      
      CheckRadioButton(hWnd, ID_R1, ID_R3, ID_R1);
      CheckRadioButton(hWnd, ID_R4, ID_R6, ID_R4);

      return 0;
    }
    LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
      switch(LOWORD(wParam))
      {
      case ID_R1:
        Graph = 0;
        break;
      case ID_R2:
        Graph = 1;
        break;
      case ID_R3:
        Graph = 2;
        break;
      case ID_R4:
        Color = RGB(000); // BLACK
        break;
      case ID_R5:
        Color = RGB(25500); // RED
        break;
      case ID_R6:
        Color = RGB(00255); // BLUE
        break;
      }
      InvalidateRect(hWnd, NULL, TRUE); // 전체 영역을 새로 그린다. 즉, paint 메시지 발생
      return 0;
    }
    LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
      return 0;
    }
    LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
      HDC hdc;
      PAINTSTRUCT ps;
      HBRUSH MyBrush, OldBrush;

      hdc = BeginPaint(hWnd, &ps);
      MyBrush = CreateSolidBrush(Color);
      OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);
      switch(Graph)
      {
      case 0:
        Rectangle(hdc, 10200200300);
        break;
      case 1:
        Ellipse(hdc, 10200200300);
        break;
      case 2:
        MoveToEx(hdc, 10200, NULL);
        LineTo(hdc, 200300);
        break;
      }
      SelectObject(hdc, OldBrush);
      DeleteObject(MyBrush);
      EndPaint(hWnd, &ps);
      return 0;
    }
    LRESULT OnDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
    {
      PostQuitMessage(0);
      return 0;
    }
     → 두 개의 라디오 그룹이 있고 각 그룹은 그룹 박스에 의해 둘러싸여 있어 같은 그룹임을 쉽게 알 수 있다.
     → Graph 그룹에서 옵션을 변경하면 Graph 그룹 내의 다른 옵션은 해제되며 Color 그룹도 마찬가지이다.
     → 실행 결과

     → 라디오 버튼의 ID가 열겨형으로 선언되어 있는데 열거형은 첫 열거 상수에만 시작값을 지정하면 나머지는 알아서 1씩 증가하는 값을 가지므로 편집할 때 더 편리하다.

    버튼들을 만든 후 CheckRadioButton 함수를 호출하여 처음 선택될 라디오 버튼을 지정한다.
    BOOL CheckRadioButton(HWND hDlg, int nIDFirst, int nIDLast, int nIDCheck);
     → 첫 번째 인수는 라디오 버튼을 가지는 부모 윈도우(또는 대화상자)의 핸들이며 두 번재와 세 번재 인수는 각각 그룹의 시작 버튼과 끝 버튼이다.
     → 네 번째 인수로 선택될 버튼의 ID를 준다.
     → ID_R1~ID_R3 사이의 도형 그룹에서는 ID_R1을 체크했고, ID_R4~ID_R6 사이의 색상 그룹에서는 ID_R4를 체크했다.

     → WM_PAINT에서는 Color 값에 따라 브러시를 만들어 선택하고 Graph 값에 따라 도형을 그린다. 최초 검정색 사가곃ㅇ이 그려지겠지만 라디오 버튼을 클릭하면 이 값들이 변경되므로 도형과 색상이 바뀐다.
     → 사용자가 라디오 버튼을 클릭하면 BN_CLICKED 통지 메시지가 전달되며 WM_COMMAND에서는 통지 메시지를 보낸 라디오 버튼 ID에 따라 Color 값과 Graph 값을 변경하고 InvaliddateRect를 호출하여 화면을 다시 그린다.

     → 이 예제에서 사용한 라디오 버튼은 자동 라디오 버튼이기 때문에 굳이 WM_COMMAND에서 Graph, Color 변수값을 갱신하지 않아도 된다. WM_COMMAND에서는 InvalidateRect만 호출하고 WM_PAINT에서 그리기 직전에 라디오 버트의 상태를 조사하는 방법을 사용할 수도 있다.

    '내장형 하드웨어 > WINAPI' 카테고리의 다른 글

    WINAPI - EDIT  (1) 2011.09.23
    WINAPI - Static  (1) 2011.09.22
    WINAPI - 체크 박스  (0) 2011.09.20
    WINAPI - 컨트롤(버튼)  (0) 2011.09.19
    WINAPI - Font  (0) 2011.09.16
    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함