윈도우 창만들기
WndClass 정의 -> RegisterClass -> CreateWindow -> ShowWindow -> 메시지루프
1. WndClass 정의
윈도우의 기반이 되는 클래스를 정의한다.(만들고자 하는 윈도우의 속성을 정의)
2. RegisterClass
윈도우 클래스를 등록한다.
3. CreateWindow
메모리상에 윈도우를 만든다.
4. ShowWindow
윈도우를 화면에 표시한다.
5. 메시지 루프
사용자로부터의 메시지를 처리한다.
메시지 의미
WM_QUIT : 프로그램을 끝낼 때 발생하는 메시지
WM_LBUTTONDOWN : 마우스의 좌측버튼을 누를 경우 발생
WM_KEYDOWN : 키보드의 키를 눌렀다
WM_CHAR : 키보드로부터 문자가 입력될 때 발생
WM_PAINT : 화면을 다시 그려야 할 필요가 있을 때 발생
WM_CREATE : 윈도우가 처음 만들어질 때 발생
WM_DESTROY : 윈도우가 메모리에서 파괴될 때 발생
#include <windows.h> //윈도우즈 프로그램 헤더파일
/* 고정 형식 */
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지 처리 함수
HINSTANCE g_hlnst; //instance 전역 선언
LPCTSTR lpszClass = TEXT("First"); //윈도클래스 이름 정의
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow) //시작점
{
HWND hWnd;
MSG Message; //MSG 구조체 사용
WNDCLASS WndClass; //WNDCLASS 구조체 사용
g_hlnst=hInstance; //이 윈도클래스를 등록하는 프로그램의 번호
/*WndClass 정의(윈도우의 기반이 되는 클래스를 정의한다. 즉, 만들고자 하는 윈도우의 속성을 정의)*/
WndClass.cbClsExtra = 0; //예약 영역, 사용하지 않을 경우 0으로 지정
WndClass.cbWndExtra = 0; //예약 영역
//WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //윈도우의 배경 색상을 지정
//WndClass.hbrBackground = CreateSolidBrush(RGB(255,40,105)); //유채색
WndClass.hbrBackground = CreateHatchBrush(HS_VERTICAL,RGB(255,40,105)); //핑크색 세로줄
/* 고정 형식 */
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지 처리 함수
HINSTANCE g_hlnst; //instance 전역 선언
LPCTSTR lpszClass = TEXT("First"); //윈도클래스 이름 정의
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow) //시작점
{
HWND hWnd;
MSG Message; //MSG 구조체 사용
WNDCLASS WndClass; //WNDCLASS 구조체 사용
g_hlnst=hInstance; //이 윈도클래스를 등록하는 프로그램의 번호
/*WndClass 정의(윈도우의 기반이 되는 클래스를 정의한다. 즉, 만들고자 하는 윈도우의 속성을 정의)*/
WndClass.cbClsExtra = 0; //예약 영역, 사용하지 않을 경우 0으로 지정
WndClass.cbWndExtra = 0; //예약 영역
//WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //윈도우의 배경 색상을 지정
//WndClass.hbrBackground = CreateSolidBrush(RGB(255,40,105)); //유채색
WndClass.hbrBackground = CreateHatchBrush(HS_VERTICAL,RGB(255,40,105)); //핑크색 세로줄
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //윈도우가 사용할 커서를 지정
//WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//윈도우가 사용할 아이콘을 지정
WndClass.hIcon = LoadIcon(NULL, IDI_QUESTION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc; //윈도우의 메시지 처리함수를 지정
WndClass.lpszClassName = lpszClass; //윈도우 클래스의 이름을 문자열로 정의
WndClass.lpszMenuName = NULL; //프로그램이 사용할 메뉴를 지정(여기선 메뉴 사용 안함)
WndClass.style = CS_HREDRAW | CS_VREDRAW; //윈도우 스타일 정의
/*윈도우 클래스 등록*/
RegisterClass(&WndClass);
/*메모리상에 윈도우 생성*/
hWnd=CreateWindow(lpszClass, /*타이틀바문자열*/TEXT("My First Program"), /*윈도우스타일*/WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
/*윈도창위치*/300, /*윈도창위치*/400, /*폭*/CW_USEDEFAULT, /*높이*/CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance,NULL);
//(윈도클래스이름,타이틀바에나타날문자열,윈도우스타일,CW사용하면 운영체제가 화면크기에 맞게 알아서 조절, ....)
ShowWindow(hWnd, nCmdShow); //CreateWindow함수가 리턴한 핸들을 이용하여 출력(윈도우를 화면에 표시)
/*사용자로부터의 메시지 처리(메시지 루프)*/
while(GetMessage(&Message, NULL, 0, 0)) //메시지 큐에서 읽어옴
{ //GetMessage가 WM_QUIT면 False리턴
TranslateMessage(&Message); //키보드 입력 처리
DispatchMessage(&Message); //큐에서 꺼낸 메시지를 WndProc함수의 iMessage로 전달
}
return(int)Message.wParam; //메시지 루프 종료후 이 프로그램을 실행시킨 OS로 리턴
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM IParam)
{ //운영체제가 호출하는 함수는 CALLBACK 표시, LRESULT = 4바이트 long
/*고정 형식*/
switch(iMessage) //운영체제로부터 들어온 메시지에 대한 처리
{
case WM_DESTROY:
PostQuitMessage(0); //WM_QUIT 메시지를 보냄
return 0;
/*case WM_LBUTTONDOWN: //마우스 왼쪽버튼 누르면 스피커에서 소리남
MessageBeep(0);
return 0;*/
}
//switch문에서 처리하지 않은 메시지를 처리
return(DefWindowProc(hWnd, iMessage, wParam, IParam));
}
//WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//윈도우가 사용할 아이콘을 지정
WndClass.hIcon = LoadIcon(NULL, IDI_QUESTION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc; //윈도우의 메시지 처리함수를 지정
WndClass.lpszClassName = lpszClass; //윈도우 클래스의 이름을 문자열로 정의
WndClass.lpszMenuName = NULL; //프로그램이 사용할 메뉴를 지정(여기선 메뉴 사용 안함)
WndClass.style = CS_HREDRAW | CS_VREDRAW; //윈도우 스타일 정의
/*윈도우 클래스 등록*/
RegisterClass(&WndClass);
/*메모리상에 윈도우 생성*/
hWnd=CreateWindow(lpszClass, /*타이틀바문자열*/TEXT("My First Program"), /*윈도우스타일*/WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,
/*윈도창위치*/300, /*윈도창위치*/400, /*폭*/CW_USEDEFAULT, /*높이*/CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance,NULL);
//(윈도클래스이름,타이틀바에나타날문자열,윈도우스타일,CW사용하면 운영체제가 화면크기에 맞게 알아서 조절, ....)
ShowWindow(hWnd, nCmdShow); //CreateWindow함수가 리턴한 핸들을 이용하여 출력(윈도우를 화면에 표시)
/*사용자로부터의 메시지 처리(메시지 루프)*/
while(GetMessage(&Message, NULL, 0, 0)) //메시지 큐에서 읽어옴
{ //GetMessage가 WM_QUIT면 False리턴
TranslateMessage(&Message); //키보드 입력 처리
DispatchMessage(&Message); //큐에서 꺼낸 메시지를 WndProc함수의 iMessage로 전달
}
return(int)Message.wParam; //메시지 루프 종료후 이 프로그램을 실행시킨 OS로 리턴
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM IParam)
{ //운영체제가 호출하는 함수는 CALLBACK 표시, LRESULT = 4바이트 long
/*고정 형식*/
switch(iMessage) //운영체제로부터 들어온 메시지에 대한 처리
{
case WM_DESTROY:
PostQuitMessage(0); //WM_QUIT 메시지를 보냄
return 0;
/*case WM_LBUTTONDOWN: //마우스 왼쪽버튼 누르면 스피커에서 소리남
MessageBeep(0);
return 0;*/
}
//switch문에서 처리하지 않은 메시지를 처리
return(DefWindowProc(hWnd, iMessage, wParam, IParam));
}
WndClass 정의 -> RegisterClass -> CreateWindow -> ShowWindow -> 메시지루프
1. WndClass 정의
윈도우의 기반이 되는 클래스를 정의한다.(만들고자 하는 윈도우의 속성을 정의)
2. RegisterClass
윈도우 클래스를 등록한다.
3. CreateWindow
메모리상에 윈도우를 만든다.
4. ShowWindow
윈도우를 화면에 표시한다.
5. 메시지 루프
사용자로부터의 메시지를 처리한다.
메시지 의미
WM_QUIT : 프로그램을 끝낼 때 발생하는 메시지
WM_LBUTTONDOWN : 마우스의 좌측버튼을 누를 경우 발생
WM_KEYDOWN : 키보드의 키를 눌렀다
WM_CHAR : 키보드로부터 문자가 입력될 때 발생
WM_PAINT : 화면을 다시 그려야 할 필요가 있을 때 발생
WM_CREATE : 윈도우가 처음 만들어질 때 발생
WM_DESTROY : 윈도우가 메모리에서 파괴될 때 발생
'API' 카테고리의 다른 글
컨트롤(버튼) (0) | 2011.09.19 |
---|---|
폰트 (0) | 2011.09.16 |
비트맵 (0) | 2011.09.15 |
색, 브러시, 투명 오브젝트 (0) | 2011.09.09 |
TextOut 예제 (0) | 2011.08.23 |