윈도우 창을 띄우기에 앞서, 우선 윈도우창을 띄우려면 무엇이 필요할지 잠시 생각해보겠습니다.
일단 우리의 직감에 의해 (나만 그런가요) 창을 띄우려면 몆가지 수치들을 우리가 설정해줘야 한다는 것을 느끼실겁니다
예를 들면 띄울 창의 크기, 창의 제목 등등 부터 시작해서 종료버튼, 확대버튼, 최소화버튼, 스크롤 가능 여부 등등
여러가지를 설정해줘야 그에 맞는 창이 뜬다고 볼 수 있겠죠
다짜고짜 컴퓨터에게 창 띄워! 라고 하면 뭔지 모를테니까요
그렇다면 API는 어떤 프로젝트를 만들어야 할까요? C에서는 단순히 콘솔에서 놀 것이기 때문에 Win32 콘솔 어플리케이션으로 했는데
우리가 생각하고 있는건 윈도우 창이라는거죠. 그렇다면 어떤 프로젝트를 만드느냐.... 하면
새 프로젝트를 누르시고 Win32 프로젝트 를 선택해 주세요. 그리고 소스 파일에 .cpp 파일을 하나 추가해주시고
헤더파일은 <Windows.h> 파일을 인클루드 해주세요. 그럼 이제 준비는 끝납니다.
그럼 이제 직접 윈도우 창을 띄워보도록 하겠습니다.
일단 소스을보세요 어차피 우리가 다룰 부분은 아주 약간이니까요
#include <Windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE g_hInst; LPTSTR 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)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,0,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); } return Message.wParam; } LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam) { switch(iMessage) { case WM_DESTROY: PostQuitMessage(0); return 0; } return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } |
이대로 입력해주시면 아마 정상적으로 잘 돌아갈겁니다.
실행, 즉 F5 버튼을 눌러주시면 갑자기 창 하나가 뙇! 하고 뜰텐데요 그렇다면 성공!!
그럼 이제 소스를 하나씩 분석해 보겠습니다.
일단 호출 규약은 간단하니 그냥 보여드리겠습니다
#define CALLBACK __stdcall #define WINAPI __stdcall#define WINAPIV __cdecl #define APIENTRY WINAPI #define APIPRIVATE __stdcall #define PASCAL __stdcall |
이렇게 정의되어 있으니 그렇게 알고 시작해 보겠습니다.
그럼 이제 소스를 분석해 볼까요?
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
우리의 코드는 크게 2개의 함수로 나뉘어져 있는데요 이것은 아래에 있는 WndProc 함수를 미리 선언해준겁니다
그리고 HWND, UINT (UNIT 아닙니다), WPARAM, LPARAM이 인수로 들어간다는 것 정도네요
참고로 API에서는 main이 아니라 WinMain에서 프로그램이 시작하니 이점 참고하세요
HINSTANCE g_hInst;
LPTSTR lpszClass=TEXT("First");
전역 변수를 섢언한겁니다. 특이 두번째 변수는 창의 이름이라는 것을 바로 눈치 챌 수 있죠
저 First라는 문구를 다른걸로 바꾸면 창의 제목이 바뀌게 된답니다.
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
이것이 바로 C에서의 main 함수 역할을 하는 녀석입니다.
인수들을 하나하나 파헤쳐 보겠습니다
HINSTANCE hInstance
프로그램의 인스턴트 핸들을 받아오는 녀석입니다.
HINSTANCE hPrevInstance
바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 없을 경우는 NULL이 됩니다. 참고로 WIN32에서는 항상 NULL이라네요
호환성을 위해 존재하는 녀석이라니까 크게 신경쓰지 않겠습니다
LPSTR lpszCmdParam
명령행으로 입력된 프로그램 인수 즉, 도스의 argv인수에 해당합니다.
"아! main 함수의 인수이던 argv가 WinMain에선 저렇게 되는구나!" 라고 알면 되겠습니다
int nCmdShow
마지막으로 반가운 int형을 하고 있는 이녀석은 바로 프로그램이 실행될 형태입니다.
최소화나 보통모양 등이 전달됩니다.
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
메세지 처리나 윈도우 클래스 등등은 나중에 설명할 것이고
4번째를 보시면 아까 받은 핸들 값을 전역 변수로 선언했던 g_hInst 에 대입해주고 있네요
'프로그램 > api&mfc' 카테고리의 다른 글
[MFC] 트레이 아이콘(Tray Icon)의 생성 및 사용 & 사용자 정의 메시지 (0) | 2012.10.14 |
---|---|
MFC 트레이 아이콘(TrayIcon) 등록 및 윈도우 감추기 (0) | 2012.05.19 |
[WinAPI] 윈도우 프로그래밍 (0) | 2012.03.02 |
델파이 Win 32 API 의 기본 틀에 대해 알아보자 ! (0) | 2012.02.26 |
API란 (0) | 2012.01.16 |
WINAPI 그림판 소스입니다. (1) | 2011.09.20 |
winapi 소스 (0) | 2011.09.19 |
PHP-XMLRPC기반 metaWebblog API 정리 (0) | 2011.08.24 |