이전 까지 해서 그래픽을 마쳤다..
컨트롤은 이 포스트 하나에 꾸역꾸역 넣어을 생각입니다.
왜냐하면 이번장은 거의 보편적으로 사용하는 방법이 같기 때문이고 은근히 지겨울지도 모르기 때문이다.
그렇다면 컨트롤이 무엇인가? 컨트롤은 인터페이스를 이루는 도구이다.
그러면 인터페이스는 또 무엇인가?
우리는 흔히 일상생활에서도 인터페이스 인터페이스 하는데 인터페이스의 정의는 무엇일까?
간단하게 설명하자.
여러분은 tv리모컨이 있는가?
그렇다면 물어보겠다 리모컨을 사용하는데 있어서 여러분은 그내부 구조와 원리를 이해를 하고
사용하는가? 그건 아니지 않는가 그냥 버튼 누르면 그만인다.
굳이 내부를 알필요가없고 모른다고해서 사용을 못하는건 아니다 왜냐하면 리모컨제작자가 사용자가 사용하기 편하게
디자인을 해두었기때문이다 그리고 인터페이스는 사용자에게 편의를 제공하지만 반대로 보면 내부를 지키는 기능을 한다.
즉 윈도우를 키면 윈도우에 시작버튼 화면 전체가 인터페이스라고 보면 된다 자동차로 보면 기어 핸들 등등 운전사가 제어하는 부분이
인터페이스인것이다 내부는 인터페이스에서 입력받은 기능을 수행하면 되는것이다.
그 수행의 과정을 의문을 품을 이유는 개발자를 목표를 하는 사람이 아니라면 알필요도없고 쓸때도 없는것이다.
자 그럼 윈도우에서 제공하는 컨트롤 클래스을 알아보도록 하자.
등이 있다.
참고로 컨트롤도 하나의 윈도우이다. 화면상의 일장한 영역을 차지하며 자신의 고유 메시지를 처리할 수 있는 능력을
가지고있다. 그렇다고 독립적으로 만들수있는건 아니다 무조건 부모 윈도우가 있어야 사용이 가능하며 부모윈도우가 만들어
질때 (WM_CREATE) 메세지가 발생했을때 만든다. 위에서 설명하였듯 컨트롤도 하나의 윈도임으로.
CreateWindow함수를 사용한다.
접기
BS_PUSHBUTTON
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,WPARAM wParam, LPARAM lParam){
switch(iMessage){
case WM_CREATE:
CreateWindow(TEXT("button"),TEXT("GFP Button 0"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20,20,500,25,hWnd,(HMENU)GFPBUTTON,wndnsakura,NULL);
CreateWindow(TEXT("button"),TEXT("GFP Button 1"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20,50,500,25,hWnd,(HMENU)GFPBUTTON1,wndnsakura,NULL);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam)){
case GFPBUTTON:
MessageBox(hWnd,TEXT("GFP Button 0"),TEXT("GFP Button 0"),MB_OK);
break;
case GFPBUTTON1:
MessageBox(hWnd,TEXT("GFP Button 1"),TEXT("GFP Button 1"),MB_OK);
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
CreateWindow(클래스명,버튼제목,스타일,x,y,w,h,이 윈도의 자식으로 생성,id지정,wndnsakura,NULL);
이다. 클래스명은 위에 표에 적어놨고 버튼제목은 사용자 정의 이며 스타일은 or연산으로 조합가능합니다.
WS_CHILD | WS_VISIBLE 은 거의 고정이긴 하지만 의미는 자식윈도 WS_VISIBLE은 ShowWindow함수 대신 사용
한다.
그다음 연산은.
스타일인데 스타일은 다음과 같다.
BS_PUSHBUTTON
푸쉬 버튼
BS_DEFPUSHBUTTON
디폴트 푸시 버튼
BS_CHECKBOX
체크 박스
BS_3STATE
3가지 상태를 가지는 체크 박스
BS_AUTOCHECKBOX
자동 체크 박스
BS_AUTO3STATE
3가지 상태를 가지는 자동 체크 박스
BS_RADIOBUTTON
라디오 버튼
BS_AUTORADIOBUTTON
자동 라이오 버튼
BS_GROUPBOX
그룹박스
등 이 있다.
버튼을 누르면 WM_COMMAND 메세지를 부모 윈도우에게 보내며 이때 전달되는 정보는 다음과 같다.
HIWORD(wParam)
통지 코드
LOWORD(wParam)
컨트롤의 ID
lParam
메세지를 보낸 차일드 윈도우의 윈도우 핸들
통지 코드는 자식이 어떤 통지를 보냈냐는 것인데 버튼같은 경우 BN_CLICKED이므로 이 값을 특별히 검출할 필요없다.
하지만 에디트나 리스트 박스같은경우는 통지코드도 봐야한다.
컨트롤의 아이디는 CreateWindow의 함수 id지정 인수로 받아온다.
부모 윈도우의 WM_COMMAND에서 LOWORD(wParam)값을 조사하여 이벤트를 발생시킨다.
BS_CHECKBOX
BS_AUTOCHECKBOX
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
static BOOL drawflag=false;
static HWND check,check1;
switch(iMessage){
case WM_CREATE:
CreateWindow(TEXT("button"),TEXT("GFP Button 0"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20,20,500,25,hWnd,(HMENU)GFPBUTTON,wndnsakura,NULL);
CreateWindow(TEXT("button"),TEXT("GFP Button 1"),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20,50,500,25,hWnd,(HMENU)GFPBUTTON1,wndnsakura,NULL);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
check=CreateWindow(TEXT("button"),TEXT("Draw Ellipse"),WS_CHILD | WS_VISIBLE | BS_CHECKBOX,20,80,500,25,hWnd,(HMENU)GFPCHECK,wndnsakura,NULL);
check1=CreateWindow(TEXT("button"),TEXT("Good bye Message"),WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,20,110,500,25,hWnd,(HMENU)GFPCHECK1,wndnsakura,NULL);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam)){
case GFPBUTTON:
MessageBox(hWnd,TEXT("GFP Button 0"),TEXT("GFP Button 0"),MB_OK);
break;
case GFPBUTTON1:
MessageBox(hWnd,TEXT("GFP Button 1"),TEXT("GFP Button 1"),MB_OK);
break;
case GFPCHECK:
if(SendMessage(check,BM_GETCHECK,0,0)==BST_UNCHECKED){
SendMessage(check,BM_SETCHECK,BST_CHECKED,0);
drawflag=TRUE;
}
else{
SendMessage(check,BM_SETCHECK,BST_UNCHECKED,0);
drawflag=FALSE;
}
InvalidateRect(hWnd,NULL,true);
break;
}
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
if(drawflag){
Ellipse(hdc,300,200,600,300);
}
else{
Rectangle(hdc,300,200,600,300);
}
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
if(SendMessage(check1,BM_GETCHECK,0,0)){
MessageBox(hWnd,TEXT("체크박스에 체크가 되어있어요"),TEXT("체크"),MB_OK);
}
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
컨트롤은 자신에게 어떤 변화가 있을때 마다 부모 윈도우로 메세지를 보낸다.
이 메세지를 통지 메세지라고 한다.
부모 윈도우가 체크 박스로 보낼수 있는 메세지는
BM_GETCHECK 체크 박스가 현재 체크되어있는 상태인지 조사 한다.
BM_SETCHECK 체크 박스의 체크상태를 변경
체크박스가가지는 상태는 다음 세가지가 있다.
BST_UNCHECKED
0
노 체크
BST_CHECKED
1
체크
BST_INDETERMINATE
2
체크도 아니고 노 체크도 아닌
접기 역시 꾸역꾸역 넣는건 잘 안되는군요.