관리 메뉴

드럼치는 프로그래머

[API/MFC] 버튼, 버튼의 통지코드, 컨트롤 메세지 본문

★─Programing/☆─API | MFC

[API/MFC] 버튼, 버튼의 통지코드, 컨트롤 메세지

드럼치는한동이 2012. 3. 15. 18:47

1. 버튼

기본적인 컨트롤 만들기는 7-1에서 설명하였다. 인제 부족한 부분을 보충해보자.

CreateWindow함수에서 3번째 인수인 윈도우 스타일 부분에 들어갈 수 있는 스타일의 종류이다.

즉 button 클래스로 만들수 있는 버튼의 종류이다.

 

(1). 버튼 모양 관련 스타일

Value                            Meaning

BS_PUSHBUTTON                    푸시 버튼
BS_DEFPUSHBUTTON                 디폴트 푸시 버튼
BS_CHECKBOX                      체크 박스
BS_3STATE                        3가지 상태를 가지는 체크 박스
BS_AUTOCEHCKBOX                  자동 체크 박스
BS_AUTO3STATE                    3가지 상태를 가지는 자동 체크 박스
BS_RADIOBUTTON                   라디오 버튼

BS_AUTORADIOBUTTON               그룹박스 안에서 사용되는 자동 라디오 버튼
BS_GROUPBOX                      그룹 박스

BS_BITMAP                        버튼의 모양을 비트맵으로 만든다.

BS_FLAT                          버튼의 모양을 2차원으로 만든다. 
                          기본 쉐이딩으로 3차원을 만들때 적용하지 않는다. (??)

BS_ICON                          버튼의 모양을 아이콘으로 만든다.

 

*AUTO가 붙은 스타일은 기본적으로 지정해 주지 않아도 체크박스를 누르면 체크모양이 나오거나 사라지고, 라디오 버튼을 누르면

 

라디오 버튼안에 점이 생긴다. AUTO가 붙지 않은 스타일로 만들었을 경우 이러한 처리를 해주지 않는다.

 

 

(2).텍스트 정렬 관련 스타일

Value                             Meaning
BS_TEXT                           버튼의 텍스트를 표시하게 한다. (Default)

BS_BOTTOM                         텍스트를 사각형의 바닥에 정렬시킨다.

BS_TOP                            텍스트를 사각형의 위쪽에 정렬시킨다.

BS_CENTER                         텍스트를 사각형의 가운데 정렬시킨다.

BS_LEFT                           텍스트를 사각형의 왼쪽에 정렬시킨다. 
                          단 체크박스나 라디오 버튼은 위치가 변하지 않는다.

BS_RIGHT                          텍스트를 사각형의 오른쪽에 정렬시킨다.
                          단 체크박스나 라디오 버튼은 위치가 변하지 않는다.

BS_MULTILINE                      버튼의 가로 크기보다 문자열이 크다면
                          (길다면) 여러줄로 문자열을 출력해준다

BS_LEFTTEXT                       라디오 버튼이나 체크박스를 사용할 때 
                          텍스트는 왼쪽으로 버튼은 오른쪽으로 배치해준다.

BS_RIGHTBUTTON                    라디오 버튼이나 체크박스를 사용할 때
                          텍스트는 왼쪽으로 버튼은 오른쪽으로 배치해준다.

                                  (BS_LEFTTEXT와 같다.)

 

 

다음은 버튼 클래스가 발생시킬수 있는 통지메세지와 발생된 상황이다. (자식 컨트롤 -> 부모 윈도우)

Message                    Description
BN_CLICKED                 사용자에 의해 버튼이 클릭됐을 때.
BN_DBLCLK                  사용자에 의해 버튼이 더블클릭됐을 때.

BN_DOUBLECLICKED           사용자에 의해 버튼이 더블클릭됐을 때.

BN_DISABLE                 버튼이 비활성화 되었을 때.
BN_PUSHED                  사용자에 의해 버튼이 눌렸을 때.

BN_HILITE                  사용자에 의해 버튼이 눌렸을 때.
BN_KILLFOCUS               버튼이 키보드의 포커스를 잃었을 때.
BN_PAINT                   버튼이 새로 그려져야 할 때.
BN_SETFOCUS                버튼이 키보드의 포커스를 얻었을 때. 
BN_UNPUSHED                버튼이 떼어졌을 때.

BN_UNHILITE                버튼이 떼어졌을 때.

 

 

다음은 부모윈도우가 버튼에 보낼 수 있는 메세지이다 (부모 윈도우 -> 자식 컨트롤)

Message           Default action
BM_CLICK          버튼을 클릭한다고 메세지를 보낸다.
                  그럼 자식컨트롤은 버튼이 클릭됬다고
                  BN_CLICKED 통지코드를 발생시킨다.

BM_GETCHECK       체크 박스의 상태를 얻어온다.
BM_SETCHECK       체크 박스의 체크 상태를 변경하며 wParam에 변경할
                  체크 상태를 보내주면 된다.

BM_GETIMAGE       버튼의 비트맵이나 아이콘의 핸들을 얻어온다.
BM_SETIMAGE       버튼의 비트맵이나 아이콘의 핸들을 설정한다.
BM_GETSTATE       버튼의 체크상태나 푸쉬상태 포커스 상태를 얻어온다.
BM_SETSTATE       버튼의 체크상태나 푸쉬상태 포커스 상태를 설정한다.

BM_SETSTYLE       버튼의 스타일을 설정한다.

 

* 부모윈도우가 자식컨트롤에 메세지를 보낼 때 에는 자식 컨트롤의 핸들이 필요하다. 때문에 자식 컨트롤에 메세지를

 

보낼 일이 있으면 자식 컨트롤을 만든 후 반환된 핸들을 HWND 형의 변수에 담아둔다.

 

ex)

CreateWindow(

L"button",                            //버튼 클래스로 만든다.

L"hi~안녕하세요~모시모시~",         //캡션에 출력할 문자열

WS_CHILD | WS_VISIBLE |               //컨트롤이라면 반드시 들어가야 하는 스타일

BS_RIGHT | BS_MULTILINE | BS_PUSHBUTTON, //오른쪽 정렬, 멀티라인, 기본버튼
                                           스타일로 만든다

20,20,100,100,                        //20,20위치에 100,100크기의 버튼크기

hwnd,                                 //버튼의 부모윈도우 설정

(HMENU)0,                             //버튼의 ID 설정

g_hInstance,                          //윈도우가 만들어질 프로그램 인스턴스

NULL);

 

출력 : 20,20위치에 100,100크기의 버튼이 만들어진다. 문자열이 버튼크기보다 커서 자동으로 줄바꿈(멀티라인)이 되고

오른쪽 정렬을 적용했기때문에 버튼의 오른쪽에 문자열이 달라붙어있다.

 

ex2)

static HWND b1;                    //자식컨트롤의 핸들을 받을 윈도우 핸들

  case WM_CREATE:
   b1 = CreateWindow(L"button",L"hi~안녕하세요~모시모시~", WS_CHILD | WS_VISIBLE | BS_RIGHT | BS_MULTILINE | BS_PUSHBUTTON, 20,20,100,100,hwnd,(HMENU)0,g_hInstance,NULL);  //버튼을 만든다. 만든 버튼의 핸들은 b1에 저장한다.
   return 0;
  case WM_COMMAND:                 //통지코드를 처리할 부분
  
  //통지코드를 발생시킨 컨트롤의 ID (LOWORD(wParam))
  switch(LOWORD(wParam)){   
    case 0:

     if(HIWORD(wParam) == BN_CLICKED){
        //통지 메세지가 BN_CLICKED이면 메세지 박스 출력
        MessageBox(hwnd,L"버튼이 클릭되었음.",L"알림",MB_OK);    
     }
    break;
   }
   return 0;
  case WM_CHAR:                         //키보드 처리
   switch(wParam){
    case 'a':                           //키보드에 'a'가 눌리면
     SendMessage(b1,BM_CLICK,0,0);      //b1에 BM_CLICK 메세지를 보낸다.
    break;
   }
   return 0;



[출처] http://blog.naver.com/nawoo?Redirect=Log&logNo=80103048474
Comments