★ Check
Ex) Check |
WndClass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); |
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static HWND c1, c2, c3,c4; static BOOL bEllipse = FALSE; switch(iMessage) { case WM_CREATE : c1 = CreateWindow(TEXT("button"),TEXT("Draw Ellipes?"), WS_CHILD|WS_VISIBLE|BS_CHECKBOX,20,20,160,25,hWnd, (HMENU)0,g_hInst,NULL);
c2 = CreateWindow(TEXT("button"),TEXT("Good bey 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("Draw Ellipes?"), WS_CHILD|WS_VISIBLE|BS_AUTO3STATE,20,110,160,25,hWnd, (HMENU)3,g_hInst,NULL); return 0; case WM_COMMAND : 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); } 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 bey"),TEXT("Check"),MB_OK); } PostQuitMessage(0); return 0; } return (DefWindowProc(hWnd,iMessage,wParam,lParam)); } |
[ 위 예제에 사용된 Check Box ]
Check Box | 컨트롤 ID | 윈도우 핸들 |
수동 Check Box | 0 | c1 |
자동 Check Box | 1 | c2 |
3상태수동 | 2 | c3 |
3상태자동 | 3 | c4 |
< 실행 결과 >
ㆍ체크 박스가 눌러지는 즉시 이 체크 박스는 부모 윈도우로
BN_CLICKED 통지 메시지를 보낸다.
[ Good bey Message? 에 체크후 종료하였을 때 ]
★ 컨트롤의 메시지
ㆍ컨트롤은 자신에게 어떤 변화가 있을 때마다 부모 윈도우로 메시지를
보내며 이 메시지를 통지 메시지라고 부른다.
ㆍ부모 윈도우가 체크 박스의 현재 상태를 알아보거나 상태를 바꾸고자
할 때도 차일드 윈도우로 메시지를 보낸다.
ㆍ통지 메시지는 차일드가 부모로 보내는 보고 메시지이고 그냥 메시지는
부모가 차일드에게 어떤 지시를 내리기 위해 보내는 명령이다.
[ 부모 윈도우가 체크 박스로 보낼 수 있는 메시지 ]
메시지 | 설명 |
BM_GETCHECK | 체크 박스가 현재 체크되어 있는 상태인지를 조사하며 wParam, lParam은 사용하지 않는다. 체크 상태는 리턴값으로 돌려진다. |
BM_SETCHECK | 체크 박스의 체크 상태를 변경하며 wParam에 변경할 체크 상태를 지정한다. |
[ BM_SETCHECK 에 의해 설정되는 체크 박스의 상태 ]
상수 | 값 | 의미 |
BST_UNCHECKED | 0 | 현재 체크되어 있지 않다. |
BST_CHECKED | 1 | 현재 체크되어 있다. |
BST_INDETERMINATE | 2 | 체크도 아니고 안 체크도 아닌 상태 |
★ 라디오 버튼
ㆍ라디오 번튼도 일종의 버튼이다. "button"클래스에
BS_RADIOBUTTON, BS_AUTORADIOBUTTON 중 하나의
스타일을 지정하면 라디오 버튼이 된다.
ㆍ체크 버튼은 진위적인 옵션을 개별적으로 입력받는데 비해
라디오 버튼은 여러가지 선택 사항 중 한 가지만 선택할
필요가 있을 때 사용한다.
ㆍ그룹을 이루는 첫 번째 라디오 버튼에만 WS_GROUP스타일을 주고
나머지 라디오 버튼은 WS_GROUP스타일을 주지 않으면 된다.
Ex) Radio |
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(0,0,0);
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HBRUSH MyBrush, OldBrush;
switch(iMessage) { case WM_CREATE : CreateWindow(TEXT("button"),TEXT("Graph"),WS_CHILD| WS_VISIBLE|BS_GROUPBOX,5,5,120,110,hWnd, (HMENU)0,g_hInst,NULL); CreateWindow(TEXT("button"),TEXT("Color"),WS_CHILD| WS_VISIBLE|BS_GROUPBOX,145,5,120,110,hWnd, (HMENU)1,g_hInst,NULL); r1=CreateWindow(TEXT("button"),TEXT("Rectangle"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON,10,20,100,30,hWnd, (HMENU)ID_R1,g_hInst,NULL); r2=CreateWindow(TEXT("button"),TEXT("Ellipse"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON,10,50,100,30,hWnd, (HMENU)ID_R2,g_hInst,NULL); r3=CreateWindow(TEXT("button"),TEXT("Line"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON,10,80,100,30,hWnd, (HMENU)ID_R3,g_hInst,NULL); r4=CreateWindow(TEXT("button"),TEXT("Black"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,150,20,100,30, hWnd,(HMENU)ID_R4,g_hInst,NULL); r5=CreateWindow(TEXT("button"),TEXT("Red"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON,150,50,100,30,hWnd, (HMENU)ID_R5,g_hInst,NULL); r6=CreateWindow(TEXT("button"),TEXT("Blue"),WS_CHILD| WS_VISIBLE|BS_AUTORADIOBUTTON,150,80,100,30,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); OldBrush = (HBRUSH)SelectObject(hdc, MyBrush); switch(Graph) { case 0 : Rectangle(hdc,10,200,200,300); break; case 1 : Ellipse(hdc,10,200,200,300); break; case 2 : MoveToEx(hdc,10,200,NULL); LineTo(hdc,200,300); break; } SelectObject(hdc,OldBrush); DeleteObject(MyBrush); EndPaint(hWnd, &ps); return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return (DefWindowProc(hWnd,iMessage,wParam,lParam)); } |
< 실행 결과 >
BOOL CheckRadioButton(HWND hDlg, int nlDFirst, int nlDLast, int nlDCheck);
ㆍ첫 번째 인수는 라디오 버튼을 가지는 부모 윈도우 의 핸들이다.
ㆍ두 번째와 세 번째인수는 각각 그룹의 시작 버튼과 끝 버튼이다.
ㆍ네 번째 인수로 선택될 버튼의 ID를 준다.
과제) SimplePaint
마우스로 자유 곡선을 그리되 선의 색상은 라디오 버튼으로 선택하고,
굵기는 체크 박스로 선택하도록 하라.
다시 스리기 버튼을 제공하고 이 버튼을 누르면 화면을 모두 지우도록 한다.
아직 화면 복구는 하지 않아도 된다.
색상이 너무 많아 실습하기 번거롭다면 빨간색, 파란색, 노란색
정도의 색상만 사용해도 상관없다.
Ex) SimplePaint |
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam, LPARAM lParam) { HDC hdc; static enum {ID_R1 =101,ID_R2,ID_R3,ID_R4,ID_R5,ID_R6,ID_R7,ID_R8}; static HWND c1, c2, c3, c4, r1, r2, r3; static COLORREF Color = RGB(0,0,0); static int x; static int y; static BOOL bNowDraw = FALSE; static int Pen_r=1; PAINTSTRUCT ps; HPEN MyPen, OldPen;
switch(iMessage) { case WM_CREATE : CreateWindow(TEXT("button"), TEXT("Pen Color"),WS_CHILD|WS_VISIBLE| BS_GROUPBOX,5,5,120,150,hWnd,(HMENU)0,g_hInst,NULL); /* 선색상라디오버튼 */ c1 = CreateWindow(TEXT("button"), TEXT("Balck"),WS_CHILD|WS_VISIBLE| BS_AUTORADIOBUTTON|WS_GROUP,10,20,100,30, hWnd,(HMENU)ID_R1,g_hInst,NULL); c2 = CreateWindow(TEXT("button"),TEXT("Red"), WS_CHILD|WS_VISIBLE| BS_AUTORADIOBUTTON,10,50,100,30, hWnd,(HMENU)ID_R2,g_hInst,NULL); c3 =CreateWindow(TEXT("button"), TEXT("Blue"),WS_CHILD|WS_VISIBLE| BS_AUTORADIOBUTTON,10,80,100,30, hWnd,(HMENU)ID_R3,g_hInst,NULL); c4 =CreateWindow(TEXT("button"), TEXT("Yellow"),WS_CHILD|WS_VISIBLE| BS_AUTORADIOBUTTON,10,110,100,30, hWnd,(HMENU)ID_R4,g_hInst,NULL); /* 선굵기체크버튼 */ r1 = CreateWindow(TEXT("button"), TEXT("글자굵기1"),WS_CHILD|WS_VISIBLE| BS_AUTOCHECKBOX,150,20,100,30, hWnd,(HMENU)ID_R5,g_hInst,NULL); r2 = CreateWindow(TEXT("button"), TEXT("글자굵기5"),WS_CHILD|WS_VISIBLE| BS_AUTOCHECKBOX,150,50,100,30, hWnd,(HMENU)ID_R6,g_hInst,NULL); r3 = CreateWindow(TEXT("button"), TEXT("글자굵기10"),WS_CHILD|WS_VISIBLE| BS_AUTOCHECKBOX,150,80,110,30, hWnd,(HMENU)ID_R7,g_hInst,NULL); CreateWindow(TEXT("button"), TEXT("지우기"),WS_CHILD|WS_VISIBLE| BS_PUSHBUTTON,300,29,100,30, hWnd,(HMENU)ID_R8,g_hInst,NULL); CheckRadioButton(hWnd,ID_R1,ID_R4,ID_R1); break;
case WM_COMMAND : switch(LOWORD(wParam)) { case ID_R1 : Color = RGB(0,0,0); break; case ID_R2 : Color = RGB(255,0,0); break; case ID_R3 : Color = RGB(0,0,255); break; case ID_R4 : Color = RGB(255,255,0); break;
case ID_R5 : if(SendMessage(r1, BM_GETCHECK,0,0)==BST_UNCHECKED) { Pen_r = 1; } else { SendMessage(r2,BM_SETCHECK, BST_UNCHECKED,0); SendMessage(r3,BM_SETCHECK, BST_UNCHECKED,0); Pen_r = 1; } break;
case ID_R6 : if(SendMessage(r2, BM_GETCHECK,0,0)==BST_UNCHECKED) { Pen_r = 1; } else { SendMessage(r1,BM_SETCHECK,BST_UNCHECKED,0); SendMessage(r3,BM_SETCHECK,BST_UNCHECKED,0); Pen_r = 5; } break;
case ID_R7 : if(SendMessage(r3, BM_GETCHECK,0,0)==BST_UNCHECKED) { Pen_r = 1; } else { SendMessage(r1,BM_SETCHECK,BST_UNCHECKED,0); SendMessage(r2,BM_SETCHECK,BST_UNCHECKED,0); Pen_r = 10; } break; case ID_R8 : InvalidateRect(hWnd,NULL,TRUE); } return 0;
case WM_PAINT : hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return 0;
case WM_LBUTTONDOWN : x = LOWORD(lParam); y = HIWORD(lParam); bNowDraw = TRUE; return 0;
case WM_MOUSEMOVE : if(bNowDraw == TRUE) { hdc = GetDC(hWnd); MyPen = CreatePen(PS_SOLID, Pen_r, Color); OldPen = (HPEN)SelectObject(hdc, MyPen); MoveToEx(hdc,x,y,NULL); x = LOWORD(lParam); y = HIWORD(lParam); LineTo(hdc,x,y); ReleaseDC(hWnd,hdc); SelectObject(hdc,OldPen); DeleteObject(MyPen); } return 0; case WM_LBUTTONUP : bNowDraw = FALSE; return 0;
case WM_DESTROY : PostQuitMessage(0); return 0; } return (DefWindowProc(hWnd,iMessage,wParam,lParam)); } |
< 실행 결과 >
그림 실력이 개판이라 죄송합니다. ( ' ' )( . . ).. 꾸벅
질문은 댓글로 남기는걸로 ..
오늘도 좋은 하루 되세요
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
보수 (0) | 2012.07.18 |
---|---|
ARM보드 프로그램 설치/파일넣기 (0) | 2012.07.18 |
포인터의 개념 (0) | 2012.07.18 |
ARM (0) | 2012.07.18 |
문자열 함수 정리 (0) | 2012.07.18 |
소스 인사이트 단축키 및 한글입력팁 (1) | 2012.07.18 |
LCD와 타이밍도 (0) | 2012.07.18 |
프로그램의 실행과 오류 정리 (0) | 2012.07.18 |