프로그래밍 기술/Windows API

1.2 자료 형식 [Windows API]

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

1.2 자료 형식

Win32 API에서는 다양한 시스템 형식을 제공하고 있습니다. 여러분이 C언어나 C++언어와 Win32 API를 이용한다면 프로그래밍 언어에서 제공하는 형식과 Win32 API에서 제공하는 형식을 모두 사용할 수 있습니다. 그리고 이들 형식 사이에는 공통적인 부분이 있어 상호 호환성을 제공하는 형식들이 있습니다.

 

C언어나 C++언어로 Win32 API를 사용할 때 포함해야 할 여러가지 헤더파일이 있는데 개발 편의를 위해 기본적인 Win32 API를 이용할 때 windows.h 파일만 포함해서 사용할 수 있게 여러 헤더 파일을 windows.h 파일에 포함하고 있습니다. 그리고 windows.h 파일에 포함하는 헤더 파일 중에 대부분의 형식은 windef.h 파일에 정의하고 있습니다.

 

다음은 windef.h 파일에서 일부 형식을 정의하고 있는 구문을 발췌(일부 수정)한 것입니다.

#define CONST               const

typedef unsigned char     BYTE;

typedef BYTE *               LPBYTE;

typedef unsigned short    WORD;

typedef unsigned short    USHORT;

typedef WORD *             LPWORD;

typedef int                    INT;

typedef int *                  LPINT;

typedef unsigned int        UINT;

typedef unsigned long     ULONG;

typedef long *               LPLONG;

typedef unsigned long     DWORD;

typedef DWORD *           LPDWORD;

typedef void *                LPVOID;

typedef CONST void *      LPCVOID;

typedef int                     BOOL;

typedef BOOL  *              LPBOOL;

typedef float                   FLOAT;

typedef UINT_PTR            WPARAM;

typedef LONG_PTR           LPARAM;

typedef LONG_PTR           LRESULT;

 

#define FALSE                 0

#define TRUE                  1

 

대부분의 형식은 C언어의 형식 이름을 대문자로 표기한 것과 같습니다. 그리고 포인터 형식은 LP가 붙고 상수형에는 C가 붙는 규칙성을 확인할 수 있습니다. BOOL 형식은 C++언어의 bool 형식이 아닌 int 형식이므로 주의하시기 바랍니다.

 

이 외에도 간단한 여러가지 자료형을 제공하고 있습니다. 이들 중 자주 사용하는 형식은 다음과 같아요.

typedef struct tagRECT

{

    LONG    left;

    LONG    top;

    LONG    right;

    LONG    bottom;

} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

 

typedef struct tagPOINT

{

    LONG  x;

    LONG  y;

} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

 

typedef struct tagSIZE

{

    LONG        cx;

    LONG        cy;

} SIZE, *PSIZE, *LPSIZE;

 

그리고 색상을 표현하는 COLORREF 형식을 제공하고 있으며 값을 설정할 때 RGB 매크로를 이용합니다.

typedef DWORD   COLORREF;

#define RGB(r,g,b)          ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

 

특히 Win32 API에서는 응용 프로그램에서 Win32 API 개체를 사용하길 원할 때 실제 개체를 반환하지 않고 해당 개체를 제어하여 사용할 수 있는 핸들을 사용할 수 있게 하고 있습니다. Win32 API에서 제공하는 개체를 사용하는 핸들 형식은 H로 시작하며 종류에 따라 핸들 형식명이 다릅니다.

typedef void *                 HANDLE; (winnt.h 파일에 정의)

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

DECLARE_HANDLE            (HWND);

DECLARE_HANDLE            (HDC);

 

HANDLE은 파일 개체, 프로세스 개체 등 많은 Win32 API 개체를 제어할 때 사용하는 형식이며 HWND는 윈도우 개체를 제어할 때 HDC는 그리기 작업에 필요한 정보 개체인 DC(Device Context)를 설정하고 그리기 작업을 할 때 사용합니다. 이 외에도 제어할 개체의 종류에 따라 다양한 핸들 형식을 정의하고 있는데 보시는 것처럼 실제 개체 형식이 무엇인지는 알 수 없게 정의하였습니다. 윈도우즈 응용 프로그래밍에서 개발자는 이러한 핸들을 어떻게 사용하는지만 신경쓰지 실제 개체를 위해 어떠한 내부 자료를 사용하는지 알 필요는 없습니다.

반응형