2011. 3. 19. 03:04ㆍ카테고리 없음
@ 초기화 부분
int APIENTRY _tWinMain(...)
{
초기화 부분
}
- 메시지 꺼내오는 부분 있다.
1. 윈도우 클래스 생성 (윈도우식의 Class style)
2. 윈도우 클래스 등록
3. 프레임 윈도우 생성
4. 메시지 루프
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
- hInstance : 운영체제의 커널이 응용프로그램에 부여한 id
- hprev.. : 이전 프로그램 id //지금 안씀
- dzCmdLine : 커맨드라인 상에서 프로그램 구동시 전달된 문자열 //지금 안씀
- iCmdShow : 윈도우가 화면에 출력될 형태
- 윈도우 클래스 원형
typedef struct _WNDCLASSEX
{
UINT cbSize; //본구조체의크기
UINT style; //출력스타일
WNDPROC lpfnWndProc; //프로시저함수
intcbClsExtra; //클래스여분메모리
intcbWndExtra; //윈도우여분메모리
HANDLE hInstance; //응용프로그램인스턴스핸들러
HICON hIcon; //아이콘
HCURSOR hCursor; //커서
HBRUSH hbrBackground;//배경색
LPCTSTR lpszMenuName; //메뉴이름
LPCTSTR lpszClassName; //클래스이름
HICON hIconSm; //작은아이콘
} WNDCLASSEX;
- 윈도우 클래스 사용법
WNDCLASSEX wndclass;// 구조체정의
wndclass.cbSize= sizeof(wndclass) ;// 구조체크기
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
// 출력스타일-> 수직/수평의변화시다시그림
wndclass.lpfnWndProc= WndProc;// 프로시저함수명
wndclass.cbClsExtra= 0 ; // 여분메모리(Class)
wndclass.cbWndExtra= 0 ; // 여분메모리(Window)
wndclass.hInstance= hInstance;// 응용프로그램인스턴스핸들러
wndclass.hIcon= LoadIcon(NULL, IDI_APPLICATION); //아이콘
wndclass.hCursor= LoadCursor(NULL, IDC_ARROW); // 커서
wndclass.hbrBackground= (HBRUSH)
GetStockObject(WHITE_BRUSH); // 배경색
wndclass.lpszMenuName= NULL ;// 메뉴이름
wndclass.lpszClassName= “ClassNameEx”; // 클래스이름
wndclass.hIconSm= LoadIcon(NULL,IDI_APPLICATION); // 작은아이콘
- 윈도우 클래스 등록
RegisterClassEx(&wndclass);
- 윈도우 프레임 만들기
hwnd= CreateWindow// 윈도우가생성되면핸들(hwnd)이반환됨
(
szWindowClass, // 윈도우클래스이름
szTitle, // 윈도우타이틀
WS_OVERLAPPEDWINDOW, // 윈도우스타일
CW_USEDEFAULT, // 윈도우위치, x좌표
0, // 윈도우위치, y좌표
CW_USEDEFAULT, // 윈도우폭
0, // 윈도우높이
NULL, // 부모윈도우핸들
NULL, // 메뉴핸들
hInstance, // 응용프로그램인스턴스핸들
NULL) ; // 생성된윈도우정보
ShowWindow(hwnd, iCmdShow);// 윈도우의화면출력
// nCmdShow: SW_HIDE, SW_SHOW, SW_MAXIMIZE, SW_MINIMIZE
UpdateWindow(hwnd); // O/S에WM_PAINT 메시지전송
// 최소화나 닫고난뒤 그 부분에대해서 Redraw 할때 필요( 나중에 )
- 메시지 큐에서 메시지를 꺼내서 처리
while (GetMessage(&msg, NULL, 0, 0))// WM_QUIT인경우 종료
//WinProc()에서PostQuitMessage() (0반환) 호출때까지처리(OS에 WM_QUIT 메시지전송)
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //핫키, WM_COMMAND 발생된 것 처럼 해석
{
TranslateMessage(&msg);// Shift ‘a’ -> 대문자‘A’
DispatchMessage(&msg);// WinMain-> WinProc
}
}
@ 메시지를 처리하는 부분
LRESULT CALLBACK WndProc(...)
{
메시지 처리루틴
}
- 기본적인 메시지처리 소스가 포함되어 있다.
- 윈도우에서 들어온 메시지를 switch문을 이용하여 처리하는 루틴
LRESULT CALLBACK WinProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
해당메시지에대한처리
}
}
1. WinMain()에서 전달된 메시지를 처리 (기본소스)
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) // 메시지번호
{
case WM_COMMAND: // 메시지에따라처리
:
case WM_PAINT: // 화면 그릴 필요가 있을때
hdc= BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0); // OS WM_QUIT 메시지 전송, 이부분을 지우면 메시지 루프가 끝나질 않고
프로세스상에 남아있게 된다, 화면에서만 사라짐
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
// CASE에서 정의되지 않은 메시지는 커널이 처리하도록 메시지전달
}