728x90
반응형
체크박스
생성방법은 이전의 푸쉬버튼과 동일하다.
CreateWindow(TEXT( "button"),TEXT("Draw Ellipse?" ),WS_CHILD | WS_VISIBLE | BS_CHECKBOX,20,20,160,25,hWnd,(HMENU)0,g_hInst,NULL);
체크박스는 주로 참과 거짓을 선택할때 사용한다.
우선 기본적인 체크박스는 선택/비선택의 상태를 가지고 3가지 상태를 가지는 체크박스는 두경우를 제외하고도 Grayed라는 제3의 상태를 가진다.
또한 수동과 자동(윈도우즈가 자동 설정)으로 선택하는 체크박스로 나뉘어 총 4가지의 종류가 이루어져있다.
<소스코드 예제 : Check>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "Check");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
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 Ellipse?" ),WS_CHILD | WS_VISIBLE |
BS_CHECKBOX,20,20,160,25,hWnd,(HMENU)0,g_hInst,NULL);
c2=CreateWindow(TEXT( "button"),TEXT("Good bye 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("Auto 3State" ),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:
//bEllipse=(BOOL)(SendMessage(c1,BM_GETCHECK,0,0)==BST_CHECKED);
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 bye"),TEXT("Check" ),MB_OK);
}
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
라디오 버튼
라디오 버튼은 버튼의 한 종류로 여러개의 선택 사항중에서 한개의 선택사항을 고를 때 사용한다.
<소스코드 예제 : Radio>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "Radio");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
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 | WS_GROUP,
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));
}
/*
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
InvalidateRect(hWnd, NULL, TRUE);
}
return 0;
case WM_PAINT:
if (SendMessage(r1,BM_GETCHECK,0,0)==BST_CHECKED) Graph=0;
if (SendMessage(r2,BM_GETCHECK,0,0)==BST_CHECKED) Graph=1;
if (SendMessage(r3,BM_GETCHECK,0,0)==BST_CHECKED) Graph=2;
if (SendMessage(r4,BM_GETCHECK,0,0)==BST_CHECKED) Color=RGB(0,0,0);
if (SendMessage(r5,BM_GETCHECK,0,0)==BST_CHECKED) Color=RGB(255,0,0);
if (SendMessage(r6,BM_GETCHECK,0,0)==BST_CHECKED) Color=RGB(0,0,255);
hdc=BeginPaint(hWnd,&ps);
....
//*/
<결과>
에디트
에디트는 문자열을 직접 입력받고자할때 사용하는 컨트롤이다.
CreateWindow(TEXT( "edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
CreateWindow함수의 3번째 인수를 이용해서 스타일을 변경할수가있다.
상태 변화에 따라 부모 윈도우에게 메시지를 전달한다.
<소스코드 예제 : Edit>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "MyEdit");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
#define ID_EDIT 100
HWND hEdit;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
TCHAR str[128];
switch (iMessage) {
case WM_CREATE:
hEdit=CreateWindow(TEXT( "edit"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
ES_AUTOHSCROLL,10,10,200,25,hWnd,(HMENU)ID_EDIT,g_hInst,NULL);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_EDIT:
switch (HIWORD(wParam)) {
case EN_CHANGE:
GetWindowText(hEdit,str,128);
SetWindowText(hWnd,str);
}
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
리스트 박스
리스트 박스는 선택가능한 여러개의 항목(문자열)들을 나열해 놓고 그중 하나(또는 여러개)를 선택하는 컨트롤이다.
다음은 부모윈도우가 리스트 박스르 조작하고자할 때 사용하는 메시지이다.
리스트 박스의 상태가 변할 경우 부모윈도우로 다음의 메시지가 반환된다.
<소스코드 예제 : ListBox>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "MyListBox");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
#define ID_LISTBOX 100
TCHAR *Items[]={TEXT( "Apple"),TEXT("Orange" ),TEXT("Melon"),TEXT( "Grape"),
TEXT( "Strawberry")};
HWND hList;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
int i;
TCHAR str[128];
switch (iMessage) {
case WM_CREATE:
hList=CreateWindow(TEXT( "listbox"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER |
LBS_NOTIFY,10,10,100,200,hWnd,(HMENU)ID_LISTBOX,g_hInst,NULL);
for (i=0;i<5;i++) {
SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_LISTBOX:
switch (HIWORD(wParam)) {
case LBN_SELCHANGE:
i=SendMessage(hList, LB_GETCURSEL,0,0);
SendMessage(hList, LB_GETTEXT, i, (LPARAM)str);
SetWindowText(hWnd, str);
break;
}
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
콤보 박스
콤보 박스는 에디트와 리스트 박스를 결합한 컨트롤이다. 그래서 항목(문자열)을 선택할수도 또는 직접 입력할수도 있다.
<소스코드 예제 : ComboBox>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "MyComboBox");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
#define ID_COMBOBOX 100
TCHAR *Items[]={TEXT( "Apple"),TEXT("Orange" ),TEXT("Melon"),TEXT( "Grape"),
TEXT( "Strawberry")};
HWND hCombo;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
int i;
TCHAR str[128];
switch (iMessage) {
case WM_CREATE:
hCombo=CreateWindow(TEXT( "combobox"),NULL,WS_CHILD | WS_VISIBLE |
CBS_DROPDOWN,10,10,100,200,hWnd,(HMENU)ID_COMBOBOX,g_hInst,NULL);
for (i=0;i<5;i++) {
SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)Items[i]);
}
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_COMBOBOX:
switch (HIWORD(wParam)) {
case CBN_SELCHANGE:
i=SendMessage(hCombo, CB_GETCURSEL,0,0);
SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)str);
SetWindowText(hWnd, str);
break;
case CBN_EDITCHANGE:
GetWindowText(hCombo, str, 128);
SetWindowText(hWnd,str);
break;
}
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
스크롤 바
스크롤 바는 지금까지의 컨트롤에 비해서는 비교적 복잡한 컨트롤이다.
수치로 된 정확한 값보다는 정확하지 않은 값을 신속하게 요구할 경우 사용한다.
BOOL SetScrollRange( HWND hWnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw );
SetScrollRange 함수로 최대값(nMaxPos), 최소값(nMinPos)을 지정하되 첫번째 인수가 스크롤 바의 윈도우 핸들이다. 두번째 인수 nBar는 메인 윈도우에 부착된 스크롤 바 또는 별도의 스크롤 바 컨트롤을 지정하는데 이 값이 SBS_CTL이면 별도의 컨트롤을 지정한다.
SetScrollPos는 스크롤 바의 현재 위치를 세번째 인수 nPos로 지정한다.
또한 다른 컨트롤과는 달리 스크롤 바는 WM_HSCROLL(수평일 경우), WM_VSCROLL(수직일 경우)이라는 별도의 메시지를 부모 윈도우로 보낸 후 상태 변화 메시지를 보낸다.
LOWORD(wParam)으로 전달되는 값은 사용자의 스크롤 요구사항을 나타내며 가능한 값의 종류는 다음과 같다.
ex)
<소스코드 예제 : ScrollBar>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "MyScrollBar");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
#define ID_SCRRED 100
#define ID_SCRGREEN 101
#define ID_SCRBLUE 102
HWND hRed,hGreen,hBlue;
int Red,Green,Blue;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush, OldBrush;
int TempPos;
switch (iMessage) {
case WM_CREATE:
hRed=CreateWindow(TEXT( "scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,10,400,20,hWnd,(HMENU)ID_SCRRED,g_hInst,NULL);
hGreen=CreateWindow(TEXT( "scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,40,400,20,hWnd,(HMENU)ID_SCRGREEN,g_hInst,NULL);
hBlue=CreateWindow(TEXT( "scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,70,400,20,hWnd,(HMENU)ID_SCRBLUE,g_hInst,NULL);
SetScrollRange(hRed,SB_CTL,0,255,TRUE);
SetScrollPos(hRed,SB_CTL,0,TRUE);
SetScrollRange(hGreen,SB_CTL,0,255,TRUE);
SetScrollPos(hGreen,SB_CTL,0,TRUE);
SetScrollRange(hBlue,SB_CTL,0,255,TRUE);
SetScrollPos(hBlue,SB_CTL,0,TRUE);
return 0;
case WM_HSCROLL:
if ((HWND)lParam == hRed) TempPos = Red;
if ((HWND)lParam == hGreen) TempPos = Green;
if ((HWND)lParam == hBlue) TempPos = Blue;
switch (LOWORD(wParam)) {
case SB_LINELEFT:
TempPos=max(0,TempPos-1);
break;
case SB_LINERIGHT:
TempPos=min(255,TempPos+1);
break;
case SB_PAGELEFT:
TempPos=max(0,TempPos-10);
break;
case SB_PAGERIGHT:
TempPos=min(255,TempPos+10);
break;
case SB_THUMBTRACK:
TempPos=HIWORD(wParam);
break;
}
if ((HWND)lParam == hRed) Red=TempPos;
if ((HWND)lParam == hGreen) Green=TempPos;
if ((HWND)lParam == hBlue) Blue=TempPos;
SetScrollPos((HWND)lParam,SB_CTL,TempPos,TRUE);
InvalidateRect(hWnd,NULL,FALSE);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
MyBrush=CreateSolidBrush(RGB(Red,Green,Blue));
OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
Rectangle(hdc,10,100,410,300);
SelectObject(hdc,OldBrush);
DeleteObject(MyBrush);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
스태틱
스태틱은 모든 컨트롤을 통틀어 제일 간단한 컨트롤이다. 이유는 문자열을 출력하기만하는 것이 기능의 전부이기 때문이다.
주로 다른 컨트롤을 설명하는 역할을 한다.
스태틱을 사용하는 주된 이유는 TEXTOUT와는 다르게 스스로 메시지를 처리 할 수있으므로 지워질 염려가 없다.
다음은 스태틱의 스타일이다.
<소스코드 예제 : Static>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT( "MyStatic");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_CREATE:
CreateWindow(TEXT( "static"),TEXT("Only Text" ),WS_CHILD | WS_VISIBLE,20,20,100,25,hWnd,(HMENU)-1,g_hInst,NULL);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
대화 상자
대화상자는 크게 모달형과 모델리스형으로 나뉘어진다. 모달(Modal)형은 대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 OK버튼이나 Cancel 버튼을 눌러 대화상자를 닫아야 다른 윈도우로 전환할 수 있다.
모달형 대화상자
모델리스형 대화상자
대화상자 생성방법
1. Dialog 리소스를 추가한후 편집한다.
2. 대화상자 프로시저를 작성(단 함수원형을 선언하지 않은경우 WinMain과 WndProc 사이에 선언)
BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
EndDialog(hDlg,IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
3. 마지막으로 WndProc에서 필요할 때에 대화상자를 호출
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_LBUTTONDOWN:
DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,AboutDlgProc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<소스코드 예제 : About>
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT( "First");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
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;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int )Message.wParam;
}
#include "resource.h"
BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
EndDialog(hDlg,IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg,IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch (iMessage) {
case WM_LBUTTONDOWN:
DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,AboutDlgProc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
<결과>
대화상자를 이용하여 계산기를 구현해 보도록 한다.
728x90
'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글
20140925서상우수업보고서 (7) | 2014.09.25 |
---|---|
20140924 업무일지 박영주 (7) | 2014.09.24 |
20140923 일일업무보고서 11번 문대영 (4) | 2014.09.23 |
20140919_일일업무보고_9번 김해성 (6) | 2014.09.20 |
20140917 일일보고 7번 김재성 (9) | 2014.09.17 |
2014년 9월 16일 출석번호 6번 김용우 (8) | 2014.09.16 |
2014.09.15 출석번호 5번 김상엽 -업무일지 수정 (8) | 2014.09.15 |
2014.09.12 업무일지] 김대희 (10) | 2014.09.12 |