본문 바로가기
코스웨어/15년 스마트컨트롤러

2015-11-12 Win32 API 개인 업무일지 - 천정호

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형

Win32 API 시작 과정

1. 예제 소스 다운받기(강좌 - Win32 API) - http://www.soen.kr

2. 압축을 풀고 ApiPrj 폴더의 02jang - First - First.cpp 소스 분석

3. 소스분석


#include <Windows.h>


// 함수의 원형

// LRESULT는 반환값을 의미한다. (Long형)

// 함수의 이름은 WndProc

// CALLBACK은 컴파일시에 사라진다. CALLBACK은 운영체제가 이 함수를 호출한다는 뜻

// CALLBACK은 STD Call, CDECL Call 호출 방식을 결정한다.

// 인자 1 : HWND int형의 윈도우 핸들러, 인자2 : unsigned int 인자3 : Word Parameter 인자4 : Long Parameter

// Word Parameter, Long Parameter는 모두  4Byte이다.

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


// 전역변수 선언

HINSTANCE g_hInst;

// Long Pointer String - 문자열 포인터(Charactor Pointer)

LPSTR lpszClass = L"First";


// Entry Point

// APIENTRY -> Entry Point를 의미한다.

// STD Call, CDECL Call 호출 방식을 결정한다.

// HINSTANCE hPrevInstance는 옛날 방식이라 적는것이지 사용하지는 않는다.

// LPSTR lpszCmdParam C에서 Main()의 문자열 인자와 비슷하다.

// int nCmdShow 인자의 값으로 창을 보여줄것인지 말것인지를 결정한다.

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) {

HWND hWnd;

MSG Message;

// WindowClass 구조체

WNDCLASS WndClass;

// HINSTANCE hInstance 인자는 프로그램이 실행될때 운영체제가 어떠한 값을 넣어주는데

// 이 값을 다른 함수에서 사용가능하도록 전역변수에 값을 넣어준다.

g_hInst = hInstance;


// WindowClass 구조체의 멤버를 초기화 시킨다.

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

// Windows 창의 기본 배경색을 결정한다.

WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

// 마우스의 커서모양을 결정하는 멤버

WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

// 실행된 창의 아이콘 모양을 설정해준다.

WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

// 구조체의 hInstance 멤버에 인자의 값을 넣어준다.

WndClass.hInstance = hInstance;

// 함수의 주소를 가지는 멤버

// lpfnWndProc 멤버는 운영체제가 보내는 메세지를 받는 WndProc 함수의 주소를 넣어준다.

// WndProc 함수는 임의로 만들 함수이니 사용자에 따라서 함수이름은 변경될 수 있다.

WndClass.lpfnWndProc = (WNDPROC)WndProc;

// 실행중인 한 덩어리를 클래스라고 부른다.

// 창의 구분을 클래스 이름을 부여하여 구분을 한다.

WndClass.lpszClassName = lpszClass;

// 메뉴의 이름

WndClass.lpszMenuName = NULL;

// 창의 가로와 세로의 값을 재 설정

WndClass.style = CS_HREDRAW | CS_VREDRAW;

// 생성될 창의 정보를 받아서 설정하는 레지스터 함수

// 창의 정보를 등록하고나면 레지스터 함수는 사용하지 않는다.

RegisterClass(&WndClass);


// 인자가 많을때는 쉼표마다 엔터를 쳐서 분리한다.

// 첫번째 인자는 클래스 이름을 설정

// 두번째 인자는 창의 제목을 설정

// 세번째 인자는 창의 모양을 설정

// CW_USEDEFAULT 네개는 가로 시작점 세로 시작점의 설정으로 모두 0을 넣어버리면 윈도우가 알아서 설정한다.

hWnd = CreateWindow(lpszClass,

lpszClass,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

(HMENU)NULL,

hInstance,

NULL);


// 화면에 창을 보이게 할것인지 안보이게 할것인지를 결정해주는 함수

ShowWindow(hWnd, nCmdShow);


// 메세지의 처리 반복

// GetMessage가 윈도우에서 보내는 메세지를 계속 받는다.

// 운영체제가 보낸 메세지가 너무 많아서 창에서 처리를 다 하지 못하면 어플리케이션은

// 가장 이전의 메세지를 받으려고 한다.

// 운영체제의 메세지 전송과정은 원형 큐 원리로 돌아간다.


// RTOS는 운영체제에서 보내는 모든 메세지를 모두 다 처리한다./

// GetMessage에 0이 오면 루프를 탈출하고 종료한다. 그러면서 창이 닫힌다.

// 큐에서 가져온 메세지를 첫 번째 인자에 저장한다.

while (GetMessage(&Message, 0, 0, 0)) {

// 키보드를 감시하는 함수

TranslateMessage(&Message);

// 윈도우가 처리하고 남은 메세지를 DispatchMessage함수에 넘겨서 DispatchMessage함수가 처리한다.

DispatchMessage(&Message);

}

// 정상종료인지 비정상 종료인지를 판별한다.

return Message.wParam;

}

// 실제 어플리케이션내에서 메인과같은 함수이다.

// 위의 엔트리코드에서는 어플리케이션의 설정을 담당하고  WndProc 함수에서는 실질적인 기능이 들어간다.

// 두 번째 인자 iMessage에는 이벤트 메세지가 온다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {

switch (iMessage) {

// 종료에 해당하는 케이스문으로 WM_DESTROY 메세지가 오면 종료한다.

case WM_DESTROY:

// 종료시에 마지막으로 처리되어야될 일이 존재하면 그 일을 마치고나서 PostQuitMessage함수를 통하여 다시 GetMessage에 0을 보내어 종료되게한다.

PostQuitMessage(0);

return 0;

}

// 설정해놓지 않은 이벤트가 오면 다시 윈도우에게 메세지를 전송시켜서 다시 처리되게 한다.

return (DefWindowProc(hWnd, iMessage, wParam, lParam));

}


4. 소스의 테스트를 위해서 프로젝트 생성

Visual Studio - 파일 - 프로젝트  - Visual C++ - Win32 - Win32 프로젝트 생성 - 소스 파일 생성(확장자 .c)


5. 컴파일 후 확인





6. 상단 바에 프로그램 이름이 나오지 안을경우 프로그램 이름을 저장하는 전역변수의 값을 LPSTR lpszClass = "First"; 말고 문자열 앞에 L을 붙여 

LPSTR lpszClass = L"First"; 이렇게 저장을 하면 제대로된 이름이 나오게 된다.


7. Windows 운영체제는 운영체제 위의 좌표에 창이 가상으로 만들어 진것이며 우리가 클릭하고 마우스를 움직이는 것은 운영체제 위의 좌표에서 움직이는 것이다.

창에 해당하는 마우스의 움직임, 클릭 이벤트는 운영체제가 마우스의 좌표를 실행 프로그램에게 메세지를 지속적으로 보내어 해당 창의 좌표위에 마우스가 올라갈때에

그에 해당하는 이벤트가 발생하는 원리이다. 


728x90