프로그래밍 기술/Windows API

1.3 첫 번째 윈도우즈 프로그램 만들기 [Windows API]

언제나휴일 2016. 4. 6. 14:39
반응형

1.3 첫 번째 윈도우즈 프로그램 만들기

이제 첫 번째 윈도우즈 프로그램을 작성해 봅시다.

 

개발 도구에서 [Windows 응용 프로그램]을 선택하시고 마법사의 응용 프로그램 설정에서 빈 프로젝트를 체크하여 프로젝트를 생성하세요.

 

여기에서는 프로그램을 시작하면 메시지 창이 뜨고 확인을 누르면 메시지 창이 닫히면서 응용 프로그램이 끝나는 아주 작은 프로그램입니다. 이 프로그램을 통해 윈도우즈 프로그램의 진입점과 함수 호출 규약 및 포함해야 할 파일 등을 간략하게 살펴볼 거예요.

 

다음처럼 코드를 작성하세요.

//첫 번째 프로그램 - 메시지 창 띄우기

#include <Windows.h>//윈도우즈 API의 제공 형식과 기능을 사용하기 위해 포함

 

INT APIENTRY WinMain(HINSTANCE hIns, HINSTANCE hPrev, LPSTR cmd, INT nShow)

{

    MessageBox(0,TEXT("첫 번재 윈도우즈 프로그램입니다."), TEXT("메시지 창 띄위기"),MB_OK);

    return 0;

}


메시지 창 띄우기 실행화면

[그림 3] 메시지 창 띄우기 실행화면

 

이제 코드를 하나 하나 살펴보기로 하죠.

 

#include <Windows.h>//윈도우즈 API의 제공 형식과 기능을 사용하기 위해 포함

윈도우즈 API를 이용하여 프로그래밍할 때 대부분의 형식이나 기능은 “Windows.h” 파일을 포함하면 사용할 수 있습니다. 특별한 형식이나 기능이 아니라면 다른 헤더 파일을 포함할 필요가 없습니다.

 

INT APIENTRY WinMain(HINSTANCE hIns, HINSTANCE hPrev, LPSTR cmd, INT nShow)

윈도우즈 응용 프로그램의 진입점은 WinMain 입니다. 반환 형식은 INT이며 함수 호출 규약은 APIENTRY를 따릅니다. 함수의 리턴 형식과 함수명 사이에 함수 호출 규약을 표현할 수 있으며 표현하지 않으면 CPP 언어의 디폴트 함수 호출 규약인 __cdecl을 컴파일러가 자동 추가합니다. 윈도우즈 API를 사용하지 않고 특정 프로그래밍 언어로 프로그램을 작성할 때는 언어의 디폴트 호출 규약에 맞게 동작하게 만들기 때문에 개발자는 함수 호출 규약을 표현하지 않아도 컴파일러가 자동으로 작성해 주었습니다.

하지만 윈도우즈 API로 작성할 때 API에서 미리 약속한 형태의 함수를 정의할 때는 약속한 함수 호출 규약에 맞게 작성해야 합니다. APIENTRY__stdcall 함수 호출 규약을 표현한 매크로입니다. 앞으로 함수 호출 규약을 표기할 때 CALLBACK 혹은 WINAPI를 표현할 때가 있는데 이들도 __stdcall 함수 호출 규약을 표현한 매크로이며 똑같은 표현입니다.

 

코드를 분석할 때 가독성있게 작성하기 위해 진입점은 APIENTRY로 표현하고 콜백 프로시저는 CALLBACK, 기타 윈도우즈 API에서 약속한 함수 포인터 형식은 WINAPI로 표현합니다. 참고로 윈도우즈 API에서는 표준 함수 호출 규약으로 PASCAL 방식을 따르고 있습니다.

#define CALLBACK    __stdcall

#define WINAPI      __stdcall

#define WINAPIV     __cdecl

#define APIENTRY    WINAPI

#define APIPRIVATE  __stdcall

#define PASCAL      __stdcall

 

그렇지만 윈도우즈 API에 인자로 전달하는 목적과 진입점이 아닌 개발자가 작성하는 함수의 함수 호출 규약은 언어의 디폴트 규약을 따라도 문제가 없기 때문에 함수 호출 규약을 표시하지 않아도 문제가 없습니다.

 

INT APIENTRY WinMain(HINSTANCE hIns, HINSTANCE hPrev, LPSTR cmd, INT nShow)

이번에는 WinMain의 입력 매개 변수를 살펴봅시다.

 

첫 번째 인자 hIns와 두 번째 인자 hPrev HINSTANCE 형식으로 실행 모듈 자체에 부여한 핸들입니다. 프로세스(실행하는 프로그램)에서는 윈도우 클래스를 등록하거나 윈도우 인스턴스를 생성할 때 자신이 어떠한 모듈인지 운영체제에 알려주어야 하는데 이 때 첫 번째 인자인 hIns를 사용합니다. 두 번째 인자는 이전 16비트 API와 호환을 위해 남겨둔 부분으로 현재 아무런 의미도 없습니다.

 

세 번째 인자는 명령라인에서 전달한 문자열을 받는 부분이며 네 번째 인자는 윈도우 창을 띄울 때 전체 화면으로 띄울 것인지 중간에 띄울 것인지 등에 관해 사용자가 제어판에 설정한 값입니다. 되도록 메인 창을 띄울 때는 WinMain에서 전달받은 값으로 시각화할 것을 권하고 있습니다. 이에 관한 사항은 두 번째 프로그램을 작성하면서 설명하기로 할게요.

 

MessageBox(0,TEXT("첫 번재 윈도우즈 프로그램입니다."), TEXT("메시지 창 띄위기"),MB_OK);

이 부분은 메시지 창을 띄우는 부분입니다.

 

실제 MessageBox는 다음처럼 뒤에 W A가 붙는 두 개의 함수를 제공합니다. 뒤에 W가 붙는 함수는 유니코드 문자 집합을 사용하는 함수이고 A가 붙는 함수는 멀타 바이트 문자 집합을 사용하는 함수입니다. 유니코드 문자 집합은 하나의 문자를 2바이트 형식인 WCHAR를 사용하며 멀티 바이트 문자 집합은 하나의 문자를 1바이트 형식인 CHAR를 사용합니다. MessageBox는 매크로 함수로 프로젝트에 설정한 문자 집합에 맞게 함수로 전개합니다.

int WINAPI MessageBoxW(HWND hWnd, LPCWSTR lpText,LPCWSTR lpCaption, UINT uType);

int WINAPI MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

 

MessageBox 함수의 첫 번째 인자인 hWnd는 윈도우 핸들 형식이며 메시지 창을 띄울 때 기준으로 삼을 창의 핸들입니다. 만약 유효한 핸들을 전달하면 전달한 윈도우의 중앙에 메시지 창을 띄워줍니다. 0을 주면 디폴트 위치에 창을 띄웁니다.

 

두 번째 전달 인자는 메시지 창에 출력할 메시지입니다. 그리고 세 번째 전달 인자는 메시지 창 캡션에 출력할 캡션 명입니다.

 

네 번째 전달 인자는 메시지 창에 자식 버튼을 어떠한 것을 띄울 것인지를 결정하는 매크로 상수입니다. 다음은 MessageBox의 네 번째 인자로 사용할 수 있는 매크로 상수 중 일부입니다.

#define MB_OK                       0x00000000L

#define MB_OKCANCEL                 0x00000001L

#define MB_ABORTRETRYIGNORE         0x00000002L

#define MB_YESNOCANCEL              0x00000003L

#define MB_YESNO                    0x00000004L

#define MB_RETRYCANCEL              0x00000005L

 

다음은 네 번째 인자에 따라 띄워지는 메시지 창의 형태들입니다.


MessageBox의 네 번째 인자에 따라 띄워지는 메시지 창의 형태

[그림 4] MessageBox의 네 번째 인자에 따라 띄워지는 메시지 창의 형태

 

그리고 MessageBox 함수의 반환 값은 어느 버튼을 눌렀는지를 의미합니다. 다음은 메시지 버튼을 눌렀을 때 비교할 때 사용할 매크로 상수입니다.

#define IDOK               1

#define IDCANCEL          2

#define IDABORT           3

#define IDRETRY            4

#define IDIGNORE          5

#define IDYES              6

#define IDNO              7

#define IDCLOSE           8

 

이렇게 첫 번째 윈도우즈 응용 프로그램을 작성해 보았고 코드를 살펴보았습니다.

반응형