API 헤더 파일

-> 윈도우즈에서는 하나의 헤더 파일에 모든 API 함수들의 원형과 사용하는 상수들이 죄다 정의되어 있기 때문에 windows.h만 포함하면 된다.

-> windows.h를 포함하고 난 후에 함수 원형과 전역변수를 선언한다.

 

시작점

-> 윈도우즈는 여러 개의 프로그램이 동시에 실행되는 멀티 테스킹 시스템일 뿐만 아니라

하나의 프로그램이 여러 번 실행될 수도 있다.

-> 이때 실행되고 있는 각각의 프로그램을 프로그램 인스턴스라고 하며 간단히 줄여서 인스턴스라고 한다.

 

hInstance

->프로그램 자체를 일컫는 정수값이며 프로그램 내부에서 자기 자신을 가리키는 1인칭 대명사이다.

 

메시지 처리 함수(WndProc)

-> WndProc은 사용자와 시스템이 보내오는 메시지를 처리하는 함수이다.

-> 소스를 분석할 때 주의깊게 봐야 할 부분은 WinMain이 아니라 WndProc이다.

 

윈도우 클래스

-> 윈도우 클래스는 windows.h에 다음과 같이 정의되어 있는 구조체이다.

 

typedef struct tagWNDCLASS
{
  UINT style;
  WNDPROC lpfnWndProc;
  int cbClsExtra;
  int cbWndExtra;
  HINSTANCE hInstance;
  HICON hicon;
  HCURSOR hCursor;
  HBRUSH hbrBackground;
  LPCSTR lpszMenuName;
  LPCSTR lpszClassName;  
} WNDCLASS;

WNDCLASS 구조체의 각 멤버 의미는 다음과 같다.

 

style

-> 윈도우가 어떤 형태를 가질 것인가를 지정하는 멤버

-> CS_HREDRAW와 CS_VREDRAW 값을 OR 연산자( | )로 연결하여 사용한다.

-> 이 스타일은 윈도우의 수직(또는 수평) 크기가 변할 경우 윈도우를 다시 그린다는 뜻이다.

 

lpfnWndProc

-> 윈도우의 메시지 처리 함수를 지정한다.

-> 메시지 처리 함수의 이름은 보통 WndProc로 정해져 있는 편이다.

 

hInstance

-> 윈도우 클래스를 등록하는 프로그램의 번호

 

hIcon, hCursor

-> 윈도우가 사용할 마우스 커서와 아이콘

 

hbrBackground

-> 윈도우의 배경 색상을 지정

 

lpszMenuName

-> 이 프로그램이 사용할 메뉴를 지정

 

lpszClassName

-> 윈도우 클래스의 이름을 문자열로 정의

-> 변수명이나 함수명을 만들듯이 마음대로 작성할 수 있다.

 

이 중에 제일 중요한 멤버는 윈도우 클래스의 이름을 정의하는 lpszClassName과

메시지 처리 함수를 지정하는 lpfnWndProc이다.

 

나머지는 대부분 디폴트나 0, NULL 같은 값들을 주면 무난하다.

 

유니코드는 16비트의 단일한 값으로 모든 문자를 표현할 수 있는 문자 코드 체계이다.

 

유니코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 바로 쓰지 말고.

유니코드 설정에 따라 변경되는 중간 타입을 사용해야 한다.

 

C언어에 익숙한 사람들은 앞으로 문자나 문자열을 표현할 때 다음 타입들을 사용하도록 해야한다.

C 타입 유니코드 타입
char TCHAR
char* LPSTR
const char* LPCTSTR

char를 바로 쓴 소스는 유니코드로 바꿀 때 일일이 소스를 뜯어 고친 후 다시 컴파일해야 하지만

TCHAR라는 중간 타입을 사용한 소스는 프로젝트 설정에 따라 소스도 같이 바뀌는 효과가 있으므로

소스는 그대로 두고 컴파일만 다시 하면 된다. 문자열이 필요할 때도 char*를 쓰지 말고

가급적이면 LPSTR 또는 TCHAR*를 쓰는 것이 좋다.

 

문자열을 다루는 함수들도 C의 표준 함수를 쓰지 말고 가급적이면 다음과 같이 유니코드를 인식하는 함수를 사용한다.

C 표준 함수 유니코드 지원 함수
strlen lstrlen
strcpy lstrcpy
strcat lstrcat
strcmp lstrcmp
sprintf wsprintf

strlen은 char 타입의 문자열 길이만 조사하지만

lstrlen은 TCHAR 타입의 문자열에 대해서도 동작하므로 이식에 훨씬 더 유리하다.

문자열 상수도 타입이 있으므로 겹 따옴표안에 바로 문자열 상수를 쓰지 말고 TEXT 매크로를 둘러싸는 것이 좋다.

TCHAR* str = "szbuff";       // 일반 형식
TCHAR* str = TEXT("szbuff"); // TEXT 매크로

TEXT 매크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경한다.

유니코드로 컴파일할 때는 각 문자가 16비트의 유니코드 문자가 되며,

그렇지 않을 때는 8비트의 안시(ANSI) 문자가 된다.

 

원칙적으로으로 문자열 상수에 이 매크로를 쓰는 것이 좋다.

#1. 핸들(handle)이란 구체적인 어떤 대상에 붙여진 번호이다.

 

#2. 핸들은 정수값이며 대부분의 경우 32비트값이다.

 

#3. 운영체제가 발급하며 사용자는 쓰기만 한다.

 

#4. 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.

 

#5. 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다.

-> 크고 작은 성질을 가지는 숫자가아니라 단순한 표식이다.

-> 핸들형 변수를 만들고 핸들을 대입받아 쓰고 난 후에는 그냥 버리면 된다.

-> 동적할당한 포인터의 실제 위치가 어디인가 신경쓸 필요없이 사용하다가 헤제하면 그만이다.

 

윈도우즈에서 핸들은 예외없이 접두어 H로 시작되며 핸들값을 저장하기 위해 별도의 데이터형까지 정의해 두고 있다.

HWND, HPEN, HBRUSH, HDC 등이 핸들을 담기 위한 데이터형들이며 모두 부호없는 정수형이다.

접두어 원래말 의미
cb Count of Bytes 바이트 수
dw double word 부호없는 long형 정수
h handle 윈도우, 비트맵, 파일 등의 핸들
sz Null Terminated NULL 종료 문자열
ch Character 문자형
a Array 배열
w Word 부호없는 정수형
I Integer 정수형
p, lp long pointer 포인터형
b bool 논리형

변수명을 나타내는 이런 관습 외에도 윈도우즈에서는 사용자정의 데이터형들이 많이 있다.

이 데이터형은 windows.h라는 헤더 파일에 typedef로 선언되어 있으며 마치 표준 데이터형처럼 사용하므로

알아두면 유용하다.

데이터형 의미
BYTE unsigned char형
CHAR char형
WORD unsigned short형
DWORD unsigned long형
LONG long과 동일
BOOL 정수형이며, TRUE, FALSE 중 한 값을 가짐

 

'Programming > Windows APi' 카테고리의 다른 글

Windows API_WinMain  (0) 2020.10.25
Windows API_유니코드  (0) 2020.10.25
Windows API_핸들(handle)에 대한 이해  (0) 2020.10.25
Windows API_화면에 선 그리기  (0) 2020.10.09
Windows API_개론  (0) 2020.10.09

+ Recent posts