WinAPI 기본형 코드
WinAPI기본형을 작성하고 분석해 보자.
#include <windows.h> //헤더 파일은 이것 하나면 된다.
LRESULT CALLBACK /* 인트형 반환값이다.*/ WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
HINSTANCE g_hInst; LPSTR lpszClass = "First";
/// 윈도우 창을 설정하는 함수 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { HWND hWnd; MSG Message; WNDCLASS WndClass; g_hInst = hInstance; /// class 구조체 초기화 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; // 해당 구조체에 main의 초기값을 넣어준다.(must) WndClass.lpfnWndProc=(WNDPROC)WndProc; // 함수의 주소를 넣는 자리, 응용 프로그램 관련 이벤트 메세지를 받을 함수의 주소, 함수 이름을 바꿔도 무관하다. WndClass.lpszClassName=lpszClass; // 실행 단위를 class라 부른다. 프로그램 단위로 실행되는 명령어가 한정된다. WndClass.lpszMenuName=NULL; // 메뉴 WndClass.style=CS_HREDRAW | CS_VREDRAW; // 윈도우 창 크기 조절 RegisterClass(&WndClass); // 설정된 내용을 등록
hWnd=CreateWindow( lpszClass, lpszClass, //창의 제목 WS_OVERLAPPEDWINDOW, //창의 속성값 지정 CW_USEDEFAULT, //가로, 세로 시작점(X, Y좌표) CW_USEDEFAULT, CW_USEDEFAULT, //가로, 세로 크기(X, Y좌표) CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); // 화면의 출력 여부를 선택, 윈도우가 결정한다.
while(GetMessage(&Message, 0, 0, 0)) //윈도우가 보내는 메세지를 받는 함수, 가장 오래된 메세지를 가지고 온다. //// 창을 닫는 메세지는 '0'이다. { TranslateMessage(&Message); //메세지를 해석 DispatchMessage(&Message); //윈도우가 처리하고 남은 값을 처리한다. } return Message.wParam; //리턴 값은 int, 윈도우 로그에 남는다. } //// 실제 프로그램을 실행시키는 함수 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,/*이벤트 번호가 온다*/ WPARAM wParam, LPARAM lParam) { switch(iMessage) { case WM_DESTROY: //Window Message Destroy 윈도우 종료 //프로그램 종료시 정리해야 할 것들을 수행한다. PostQuitMessage(0); //종료 return 0; }
return(DefWindowProc(hWnd, iMessage, wParam, lParam)); //프로그램이 인식하지 못하는 메세지는 윈도오로 다시 보낸다. } |
#include <windows.h> //헤더 파일은 이것 하나면 된다.
LRESULT CALLBACK /* 인트형 반환값이다.*/ WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK: long result 내부 프로그램에서는 호출할 수 없다. 호출 방식이 STD call 혹인 CDECL인지...
HWND: Window Handler, 인트형이다.
WPARAM: Word(4byte) 인자, type define이 되어 있다.
LPRAM과 WPRAM의 용량의 크기는 없다. 과거 메모리 용량이 작을 때 구분하여 사용하던 것이다.
HINSTANCE g_hInst; g for global, h for handler
LPSTR lpszClass = "First"; //long pointer string: 캐릭터 포인터
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
APIENTRY : API entry, 컴파일러에게 call 방식이 무엇인지 알려준다.
두 번째 인자는 예전에 사용하던 것이여서 그대로 인자로 적어놓고 있지만 사용하지 않는다.
LPSTR lpszCmdParam: 명령어 입력
int nCmdShow: 명령어 표시 여부를 선택하는 인자
WNDCLASS WndClass; 구조체이다. struct
g_hInst = hInstance; //사용한 인자를 전역변수에 복사함으로써 데이터 공유
응용프로그램 창에 커서를 올리면 운영체제에서 이벤트를 발생하여 응용프로그램에게 전달한다.
![](https://t1.daumcdn.net/cfile/tistory/21175636564450C906)
사용자가 운영체제에서 명령하는 메시지의 수가 CPU의 능력을 초과할 경우 메시지는 지속적으로 쌓이지 않고 기존 메시지에 덮어쓰게 된다.
FIFO(First In First Out): Queue 구조
FILA(First In Last Out): Stack 구조
실시간 처리 시스템은 1개 이상의 프로그램을 실행하지 못한다.
작성한 소스코드를 그대로 복사하여 Visual Studio에 붙힌다.
새로운 프로젝트를 생성하고 Visual C++에서 console이 아닌 project를 선택한다. 소스파일을 ‘main.c'이름으로 추가한다.
F5를 눌러 실행한다. 새로운 창이 뜨면 제대로 컴파일이 된 것이다. 새로운 창의 이름이 한자로 뜬다. 이것을 해결하기 위해 전역 변수 LPSTR lpszClass에 L을 추가해준다.
LPSTR lpszClass = L"First"
![](https://t1.daumcdn.net/cfile/tistory/25782D335644512D0E)
나머지 설명은 내일...