Win32 API

2013.10.14_API_Control(체크박스/라디오박스)

성엽이 2013. 10. 14. 19:12

API                                


Check Box 

#include <windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;

LPCTSTR lpszClass = TEXT("KKIMSSI");  // 창 제목 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)  // WinMain , API Main 함수
{                                                    // nCmdShow 인자의 갯수가 온다
  HWND hWnd;    // Window Handler                                  // LPSTR 는 char * 배열 C의 main 의 2번째 인자
  MSG Message;    
  WNDCLASS WndClass;  /* 1. 윈도우 구조체 생성 ( Class ) */
  g_hInst = hInstance;  

  /* 2.1 구조체에 값을 넣어 스타일을 변화시켜준다 */
  WndClass.cbClsExtra     = 0;
  WndClass.cbWndExtra     = 0;
  WndClass.hbrBackground   = (HBRUSH)(COLOR_BTNFACE+1);    // 바탕색
  WndClass.hCursor     = LoadCursor(NULL, IDC_ARROW);        // 마우스 모양
  WndClass.hIcon       = LoadIcon(NULL, IDI_APPLICATION);
  WndClass.hInstance     = hInstance;
  WndClass.lpfnWndProc   = WndProc;
  WndClass.lpszClassName   = lpszClass;
  WndClass.lpszMenuName   = NULL;
  WndClass.style       = CS_HREDRAW|CS_VREDRAW;
  /* 2.2 앞에 모든 Class 값을 등록시켜주는 함수 */
  RegisterClass(&WndClass);  

  /* 3. 창 만들기 */
  hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,(HMENU)NULL,hInstance,NULL);
  /* 4. 창을 화면에 출력 하는 함수 */
  ShowWindow(hWnd,nCmdShow);

  /* 5. 창에서 일어나는 메세지 처리 (클릭, 닫기 등등..) */
  while(GetMessage(&Message,NULL,0,0))
  {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return (int)Message.wParam;
}

/* 마우스나 키보드를 움직이면 OS 에서 자동으로 호출 */
/* 메세지 처리는 여기서 처리된다 */
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  static HWND c1;
  static HWND c2;
  static HWND c3;
  static HWND c4;

  static BOOL bEllipse = FALSE;

  switch(iMessage)
  {
  case WM_CREATE:
    c1 = CreateWindow(TEXT("button"),TEXT("Draw Ellipse?"), WS_CHILD | WS_VISIBLE |
      BS_CHECKBOX, 202016025, hWnd,(HMENU)0, g_hInst, NULL);      // 수동 체크
                                          // case 0 주석 처리 해보면 알수있음
    c2 = CreateWindow(TEXT("button"),TEXT("Good Bye Message?"), WS_CHILD | WS_VISIBLE |
      BS_AUTOCHECKBOX, 205016025, hWnd,(HMENU)1, g_hInst, NULL);    // 자동 체크 : 수동으로 신호처리를 하지 않아도 체크표시가됨
    c3 = CreateWindow(TEXT("button"),TEXT("3State"), WS_CHILD | WS_VISIBLE |  
      BS_3STATE, 208016025, hWnd,(HMENU)2, g_hInst, NULL);        // 상태를 수동으로 처리해줘야함
    c4 = CreateWindow(TEXT("button"),TEXT("Auto 3State?"), WS_CHILD | WS_VISIBLE |
      BS_AUTO3STATE, 2011016025, hWnd,(HMENU)3, g_hInst, NULL);      // 체크표시상태가 알아서 변함
    return 0;
  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    // CHECHBOX
    case 0:
      if(SendMessage(c1,BM_GETCHECK,0,0== BST_UNCHECKED)  // 체크버튼 c1에 신호를 보내서 Check 상태로 return 값을 받음
      {
        SendMessage(c1,BM_SETCHECK,BST_CHECKED,0);
        bEllipse = TRUE;
      }
      else
      {
        SendMessage(c1, BM_SETCHECK,BST_UNCHECKED,0);
        bEllipse = FALSE;
      }
      InvalidateRect(hWnd,NULL,TRUE);
      break;
    // 3STATE
    case 2:
      if(SendMessage(c3,BM_GETCHECK,0,0== BST_UNCHECKED)
      {
        SendMessage(c3,BM_SETCHECK,BST_CHECKED,0);
      }
      else
      {
        if(SendMessage(c3, BM_GETCHECK,0,0== BST_INDETERMINATE)
        {
          SendMessage(c3,BM_SETCHECK,BST_UNCHECKED,0);
        }
        else
        {
          SendMessage(c3,BM_SETCHECK,BST_INDETERMINATE,0);
        }
        
      }
      break;
    }
    return 0;
  case WM_PAINT:
    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;
  case WM_DESTROY:
    if(SendMessage(c2,BM_GETCHECK,0,0== BST_CHECKED)
    {  
      MessageBox(hWnd, TEXT("Good Bye"), TEXT("Check"),MB_OK);
    }
    PostQuitMessage(0);
    return 0;
  }
  return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


 

 ▶ AUTOCHECKBOX <=> CHECKBOX 와 AUTO3STATE <=> 3STATE 의 차이점이 중요 !! 

 AUTO~ 를 사용하면 WM_COMMAND 에 수동으로 작성하지 않아도 체크박스안의 체크상태가

변한다. AUTO~ 가 없으면 변화가 없다.



 Ellipse - Rectagle

01

  

 3State ( 3가지 상태 )


012



 Good Bye Box Check 시 , 사용을 종료하면 윈도우박스창이 출력

 



 Radio Box

#include <windows.h>


LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;

LPCTSTR lpszClass = TEXT("KKIMSSI");  // 창 제목 

enum{
  ID_R1 = 101,
  ID_R2,
  ID_R3,
  ID_R4,
  ID_R5,
  ID_R6,
};

HWND r1;
HWND r2;
HWND r3;
HWND r4;
HWND r5;
HWND r6;

int Graph = 0;
COLORREF Color = RGB(0,0,0);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)  // WinMain , API Main 함수
{                                                    // nCmdShow 인자의 갯수가 온다
  HWND hWnd;    // Window Handler                                  // LPSTR 는 char * 배열 C의 main 의 2번째 인자
  MSG Message;    
  WNDCLASS WndClass;  /* 1. 윈도우 구조체 생성 ( Class ) */
  g_hInst = hInstance;  

  /* 2.1 구조체에 값을 넣어 스타일을 변화시켜준다 */
  WndClass.cbClsExtra     = 0;
  WndClass.cbWndExtra     = 0;
  WndClass.hbrBackground   = (HBRUSH)GetStockObject(WHITE_BRUSH);    // 바탕색
  WndClass.hCursor     = LoadCursor(NULL, IDC_ARROW);        // 마우스 모양
  WndClass.hIcon       = LoadIcon(NULL, IDI_APPLICATION);
  WndClass.hInstance     = hInstance;
  WndClass.lpfnWndProc   = WndProc;
  WndClass.lpszClassName   = lpszClass;
  WndClass.lpszMenuName   = NULL;
  WndClass.style       = CS_HREDRAW|CS_VREDRAW;
  /* 2.2 앞에 모든 Class 값을 등록시켜주는 함수 */
  RegisterClass(&WndClass);  

  /* 3. 창 만들기 */
  hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,(HMENU)NULL,hInstance,NULL);
  /* 4. 창을 화면에 출력 하는 함수 */
  ShowWindow(hWnd,nCmdShow);

  /* 5. 창에서 일어나는 메세지 처리 (클릭, 닫기 등등..) */
  while(GetMessage(&Message,NULL,0,0))
  {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return (int)Message.wParam;
}

/* 마우스나 키보드를 움직이면 OS 에서 자동으로 호출 */
/* 메세지 처리는 여기서 처리된다 */
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  HBRUSH MyBrush;
  HBRUSH OldBrush;
  HPEN   MyPen;
  HPEN   OldPen;

  switch(iMessage)
  {
  case WM_CREATE:
    CreateWindow(TEXT("button"),TEXT("Graph"),WS_CHILD | WS_VISIBLE |
      BS_GROUPBOX, 55,120110, hWnd, (HMENU)0, g_hInst, NULL);
    CreateWindow(TEXT("button"),TEXT("Color"),WS_CHILD | WS_VISIBLE |
      BS_GROUPBOX, 1455,120110, hWnd, (HMENU)1, g_hInst, NULL);
    r1 = CreateWindow(TEXT("button"),TEXT("Rectangle"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON | WS_GROUP,
      1020,10030, hWnd, (HMENU)ID_R1, g_hInst, NULL);
    r2 = CreateWindow(TEXT("button"),TEXT("Ellipse"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON,
      1050,10030, hWnd, (HMENU)ID_R2, g_hInst, NULL);
    r3 = CreateWindow(TEXT("button"),TEXT("Line"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON,
      1080,10030, hWnd, (HMENU)ID_R3, g_hInst, NULL);
    r4 = CreateWindow(TEXT("button"),TEXT("Black"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON,
      15020,10030, hWnd, (HMENU)ID_R4, g_hInst, NULL);
    r5 = CreateWindow(TEXT("button"),TEXT("Red"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON,
      15050,10030, hWnd, (HMENU)ID_R5, g_hInst, NULL);
    r6 = CreateWindow(TEXT("button"),TEXT("Blue"),WS_CHILD | WS_VISIBLE |
      BS_AUTORADIOBUTTON,
      15080,10030, hWnd, (HMENU)ID_R6, g_hInst, NULL);
    CheckRadioButton(hWnd,ID_R1, ID_R3, ID_R1);
    CheckRadioButton(hWnd,ID_R4, ID_R6, ID_R4);
    break;
  case WM_COMMAND:
    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(0,0,0);
      break;
    case ID_R5:
      Color = RGB(255,0,0);
      break;
    case ID_R6:
      Color = RGB(0,0,255);
      break;
    }
    InvalidateRect(hWnd,NULL,TRUE);
    return 0;
  case WM_PAINT:
    hdc = BeginPaint(hWnd,&ps);
    MyBrush = CreateSolidBrush(Color);    // GDI 오브젝트를 위에서 정해준 RGB 값으로 저장한 후 출력 ( 도형 )
    OldBrush = (HBRUSH)SelectObject(hdc,MyBrush);
    MyPen = CreatePen(PS_SOLID,1,Color);  // GDI 오브젝트를 위에서 정해준 RGB 값으로 저장한 후 출력 ( 도선 )
    OldPen = (HPEN)SelectObject(hdc,MyPen);
    switch (Graph)
    {
    case 0 :
      Rectangle(hdc, 10200200300);
      break;
    case 1 :
      Ellipse(hdc,10200200 ,300 );
      break;
    case 2 :
      MoveToEx(hdc,10,200,NULL);
      LineTo(hdc,200,300);
      break;
    }
    SelectObject(hdc,OldBrush);
    SelectObject(hdc,OldPen);
    DeleteObject(MyBrush);
    DeleteObject(MyPen);
    EndPaint(hWnd,&ps);
    return 0;
  case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
  }
  return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


 Color 변경


012

 Graph 변경 ( 색/그래프 모두 변경 가능 )


012