포스트

Win32 API - GUI 관련

Win32 API - GUI 관련

함수

wWinMain 함수

1
2
3
4
int APIENTRY wWinMain(_In_     HINSTANCE hInstance,      // 현재 실행 중인 애플리케이션의 인스턴스 핸들
                      _In_opt_ HINSTANCE hPrevInstance,  // 이전 인스턴스 핸들 (현재는 사용되지 않으며 항상 NULL이 전달됨)
                      _In_     LPWSTR    lpCmdLine,      // 애플리케이션을 실행할 때 전달된 명령줄 인수
                      _In_     int       nCmdShow)       // 애플리케이션의 주 창이 처음 표시될 때 어떤 형태로 나타날지 결정하는 플래그

C/C++ 콘솔 애플리케이션의 main 함수와 유사하게 프로그램의 진입점 역할을 한다.

LoadString 함수

1
2
3
4
5
6
int LoadStringW(
  [in, optional] HINSTANCE hInstance,   // 문자열 리소스가 포함된 모듈의 인스턴스 핸들
  [in]           UINT      uID,         // 로드할 문자열 리소스의 정수 식별자
  [out]          LPWSTR    lpBuffer,    // 로드된 문자열을 저장할 버퍼에 대한 포인터
  [in]           int       cchBufferMax // lpBuffer가 가리키는 버퍼의 크기
);

실행 파일 또는 DLL에 포함된 문자열 리소스를 로드하는 함수이다.

  • cchBufferMax가 0이 아닌 경우 버퍼에 복사된 문자 수를 반환한다.
  • cchBufferMax가 0인 경우 lpBuffer가 가리키는 문자열 리소스의 문자 수를 반환한다.
  • 실패 시 0을 반환한다.

RegisterClassEx 함수

1
2
3
ATOM RegisterClassExW(
  [in] const WNDCLASSEXW *lpwcx  // 창 클래스 정보 구조체
)

WNDCLASSEX 구조체로 정의된 창 클래스 정보를 운영체제에 등록한다.

  • 성공 시 등록된 창 클래스를 고유하게 식별하는 아톰(ATOM) 값을 반환한다.
  • 실패 시 0을 반환한다.

CreateWindowW 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
HWND CreateWindowW(
  [in, optional] LPCWSTR   lpClassName,  // 생성할 창의 창 클래스 이름
  [in, optional] LPCWSTR   lpWindowName, // 창의 제목 표시줄에 나타날 텍스트 또는 컨트롤의 텍스트
  [in]           DWORD     dwStyle,      // 생성할 창의 스타일을 지정하는 비트 플래그 조합
  [in]           int       X,            // 창의 초기 좌측 상단 모서리 X,Y 좌표
  [in]           int       Y,
  [in]           int       nWidth,       // 창의 초기 너비와 높이
  [in]           int       nHeight,
  [in, optional] HWND      hWndParent,   // 생성할 창의 부모 창 핸들
  [in, optional] HMENU     hMenu,        // 창에 연결될 메뉴의 핸들
  [in, optional] HINSTANCE hInstance,    // 창을 생성하는 애플리케이션 또는 DLL의 인스턴스 핸들
  [in, optional] LPVOID    lpParam       // 창 생성 메시지의 LPARAM으로 전달될 추가 데이터에 대한 포인터
);

RegisterClassEx 함수로 사전에 등록된 창 클래스를 기반으로 실제 GUI 창을 생성하는 데 사용되는 핵심 함수이다.

  • 성공 시 생성된 창의 창 핸들을 반환한다.
  • 실패 시 NULL을 반환한다.

ShowWindow 함수

1
2
3
4
BOOL ShowWindow(
  [in] HWND hWnd,     // 표시 상태를 변경할 창의 핸들
  [in] int  nCmdShow  // 창을 어떻게 표시할지 지정하는 플래그
);

생성된 창의 초기 표시 상태를 설정하고, 화면에 보이도록 하거나 숨기는 등 창의 가시성을 제어한다.

  • 성공 시, 창이 이전에 보이는 상태였다면 TRUE를 반환하고, 이전에 숨겨진 상태였다면 FALSE를 반환한다.
  • 일반적으로 이 함수는 실패하지 않는다.

UpdateWindow 함수

1
2
3
BOOL UpdateWindow(
  [in] HWND hWnd   // 업데이트할 창의 핸들
);

ShowWindow 함수 호출 후, 또는 창의 내용이 변경되어 다시 그려져야 할 때 창의 클라이언트 영역을 즉시 다시 그리도록 요청한다.

  • 성공 시 TRUE를 반환한다.
  • 실패 시 FALSE를 반환한다.

LoadAccelerators 함수

1
2
3
4
HACCEL LoadAcceleratorsW(
  [in, optional] HINSTANCE hInstance,    // 가속기 테이블 리소스가 포함된 모듈의 인스턴스 핸들
  [in]           LPCWSTR   lpTableName   // 로드할 가속기 테이블 리소스의 이름 또는 정수 식별자 ID
);

가속기 테이블을 로드하는 데 사용되는 함수이다.
가속기 테이블은 사용자가 메뉴 항목이나 특정 항목을 키보드 단축키로 실행할 수 있도록 정의한 목록이다.

  • 성공 시 로드된 가속기 테이블의 핸들(HACCEL)을 반환한다.
  • 실패 시 NULL을 반환한다.

GetMessage 함수

1
2
3
4
5
6
BOOL GetMessage(
  [out] LPMSG lpMsg,          // MSG 구조체에 대한 포인터
  [in]  HWND  hWnd,           // 메시지를 검색할 특정 창의 핸들
  [in]  UINT  wMsgFilterMin,  // 검색할 메시지 범위의 최소/최대 값
  [in]  UINT  wMsgFilterMax   // 0과 0을 지정하면 모든 메시지를 검사
);

애플리케이션의 메시지 큐에서 메시지를 검색하고 가져온다.
처리할 메시지가 없을 경우 새로운 메시지가 도착할 때까지 대기(Block)한다.

  • 성공 시 WM_QUIT 메시지를 제외한 다른 메시지를 가져오면 TRUE를 반환한다.
  • WM_QUIT 메시지를 수신하면 FALSE를 반환한다.
  • 실패 시 -1을 반환한다.

TranslateMessage 함수

1
2
3
BOOL TranslateMessage(
  [in] const MSG *lpMsg  // MSG 구조체 포인터
);

가상 키(Virtual-Key) 메시지를 문자 메시지로 변환하는 역할을 한다.
이 함수 자체는 메시지를 창 프로시저로 보내지 않으며, MSG 구조체의 내용을 기반으로 새로운 메시지를 생성하여 메시지 큐에 추가한다.

  • 성공 시 TRUE를 반환한다.
  • 실패 시 FALSE를 반환한다.

DispatchMessage 함수

1
2
3
LRESULT DispatchMessage(
  [in] const MSG *lpMsg    // MSG 구조체 포인터
);

MSG 구조체에 있는 메시지를 해당 메시지가 속한 창의 창 프로시저로 보내 처리하도록 하는 역할을 한다.
이 함수는 메시지 큐에 있는 메시지를 꺼내서, 운영체제가 해당 메시지를 올바른 창의 WndProc 함수로 분배한다.

  • 성공 시 메시지를 처리한 창 프로시저가 반환한 값을 반환한다.
  • 실패 시 0을 반환한다.

DialogBox 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INT_PTR DialogBoxParamW(
  [in, optional] HINSTANCE hInstance,       // 대화 상자 템플릿 리소스가 포함된 모듈의 인스턴스 핸들
  [in]           LPCWSTR   lpTemplateName,  // 로드할 대화 상자 템플릿 리소스의 이름 또는 정수 식별자
  [in, optional] HWND      hWndParent,      // 생성할 대화 상자의 부모 핸들
  [in, optional] DLGPROC   lpDialogProc,    // 대화 상자가 받는 메시지를 처리할 대화 상자 프로시저
  [in]           LPARAM    dwInitParam      // 대화 상자 프로시저의 WM_INITDIALOG 메시지에서 lParam으로 전달될 사용자 정의 값
);

INT_PTR DialogBoxW(
  [in, optional] HINSTANCE hInstance,
  [in]           LPCWSTR   lpTemplateName,
  [in, optional] HWND      hWndParent,
  [in, optional] DLGPROC   lpDialogProc
);

모달 대화 상자를 생성하고 표시하는 데 사용되는 함수이다.

  • 성공 시 EndDialog 함수를 호출할 때 전달된 nResult 값을 반환한다.
  • 실패 시 -1을 반환한다.

EndDialog 함수

1
2
3
4
BOOL EndDialog(
  [in] HWND    hDlg,    // 닫을 대화 상자의 핸들
  [in] INT_PTR nResult  // 대화 상자가 닫힐 때 함수의 반환 값으로 전달될 값
);

DialogBox 또는 DialogBoxParam 함수로 생성된 모달 대화 상자를 닫는 데 사용된다.

DestroyWindow 함수

1
2
3
BOOL DestroyWindow(
  [in] HWND hWnd     // 파괴할 창의 핸들
);

지정된 창과 그 자식 창들을 파괴하는 데 사용된다.

  • 성공 시 TRUE를 반환한다.
  • 실패 시 FALSE를 반환한다.

DefWindowProc 함수

1
2
3
4
5
6
LRESULT DefWindowProcW(
  [in] HWND   hWnd,
  [in] UINT   Msg,
  [in] WPARAM wParam,
  [in] LPARAM lParam
);

애플리케이션의 창 프로시저가 명시적으로 처리하지 않는 모든 메시지에 대해 Windows가 제공하는 기본 처리를 수행하도록 하는 함수이다.
이 함수는 WndProc 함수의 마지막 default 케이스에서 항상 호출되어야 하며, 인자는 WndProc 함수와 동일하게 전달한다.

  • 성공 시 메시지 처리에 대한 결과 값을 반환한다.
  • 일반적으로 이 함수는 실패하지 않는다.

BeginPaint, EndPaint 함수

1
2
3
4
5
6
7
8
9
HDC BeginPaint(
  [in]  HWND          hWnd,        // 그림을 그릴 창 핸들
  [out] LPPAINTSTRUCT lpPaint      // 그리기 작업에 대한 정보를 받을 PAINTSTRUCT 구조체 주소
);

BOOL EndPaint(
  [in] HWND          hWnd,        // 그림을 그릴 창 핸들
  [in] const PAINTSTRUCT *lpPaint // BeginPaint 함수가 채웠던 PAINTSTRUCT 구조체의 주소
);

창의 클라이언트 영역에 그림을 그릴 때 반드시 함께 사용되는 쌍 함수이다. 이 두 함수는 WM_PAINT 메시지를 처리할 때 핵심 역할을 수행한다.
Windows는 필요하다고 판단될 때(창이 처음 표시될 때, 창의 크기가 변경될 때, 다른 창에 가려졌다가 다시 나타날 때 등) 애플리케이션의 창 프로시저로 WM_PAINT 메시지를 보낸다.
BeginPaint 함수는 그리기 작업을 시작할 때 호출되며, 창의 클라이언트 영역에 그림을 그리는 데 필요한 정보를 제공하는 디바이스 컨텍스트 핸들을 반환한다.
EndPaint 함수는 그리기 작업이 완료되었음을 시스템에 알리는 역할을 한다.

PostQuitMessage 함수

1
2
3
void PostQuitMessage(
  [in] int nExitCode   // 애플리케이션 종료 코드
);

애플리케이션의 메시지 큐에 WM_QUIT 메시지를 게시하는 역할을 한다.

구조체

WNDCLASSEX 구조체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct tagWNDCLASSEXW {
  UINT        cbSize;         // 이 구조체의 크기
  UINT        style;          // 창 클래스의 스타일을 정의하는 비트 플래그 조합
  WNDPROC     lpfnWndProc;    // 메시지를 처리할 창 프로시저 함수 포인터
  int         cbClsExtra;     // 클래스 인스턴스마다 추가로 할당할 여분의 바이트 수
  int         cbWndExtra;     // 이 클래스에 속하는 각 창 인스턴스마다 추가로 할당할 여분의 바이트 수
  HINSTANCE   hInstance;      // 이 창 클래스를 등록하는 애플리케이션 또는 DLL의 인스턴스 핸들
  HICON       hIcon;          // 이 클래스에 속하는 모든 창에 사용될 큰 아이콘 핸들
  HCURSOR     hCursor;        // 이 클래스에 속하는 창 위에서 마우스 커서가 움직일 때 표시될 커서 핸들
  HBRUSH      hbrBackground;  // 창의 클라이언트 영역을 그리는 데 사용될 배경 브러시 핸들
  LPCWSTR     lpszMenuName;   // 이 클래스에 속하는 창에 대한 메뉴 리소스의 이름 또는 ID를 지정하는 문자열 포인터
  LPCWSTR     lpszClassName;  // 이 창 클래스의 이름을 지정하는 유니코드 문자열 포인터
  HICON       hIconSm;        // 이 클래스에 속하는 모든 창에 사용될 작은 아이콘 핸들
} WNDCLASSEXW, *PWNDCLASSEXW;

창 클래스를 정의하는 핵심 구조체. 하나 이상의 창들이 공유할 수 있는 속성을 템플릿처럼 정의하는 역할을 한다.

MSG 구조체

1
2
3
4
5
6
7
8
9
typedef struct tagMSG {
  HWND   hwnd;     // 메시지를 수신하거나 메시지가 대상으로 하는 창의 핸들
  UINT   message;  // 메시지의 식별자
  WPARAM wParam;   // 메시지와 관련된 추가 정보를 담는 첫 번째 32비트 혹은 64비트 값
  LPARAM lParam;   // 메시지와 관련된 추가 정보를 담는 두 번째 32비트 혹은 64비트 값
  DWORD  time;     // 메시지가 게시된 시간
  POINT  pt;       // 메시지가 발생했을 때 당시의 마우스 커서의 화면 좌표
  DWORD  lPrivate; // (Windows 7 이상에서 추가, 거의 사용되지 않음)
} MSG, *PMSG, *LPMSG;

Windows 애플리케이션으로 전달되는 모든 메시지에 대한 정보를 담고 있는 핵심 데이터 구조이다.
운영체제는 사용자 입력, 시스템 이벤트, 애플리케이션 자체 이벤트 등 다양한 종류의 상호작용과 변화를 메시지 형태로 애플리케이션에 전달한다.

PAINTSTRUCT 구조체

1
2
3
4
5
6
7
8
typedef struct tagPAINTSTRUCT {
  HDC  hdc;             // 그림을 그리는 데 사용할 디바이스 컨텍스트 핸들
  BOOL fErase;          // 그림을 그리기 전 배경을 지워야 하는지 여부
  RECT rcPaint;         // 갱신이 필요한 영역의 클라이언트 좌표
  BOOL fRestore;        // 예약 멤버
  BOOL fIncUpdate;      // 예약 멤버
  BYTE rgbReserved[32]; // 예약 멤버
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

WM_PAINT 메시지 처리를 위하 BeginPaint 함숭 의해 채워지는 중요한 정보 묶음이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

"Win32 API" 카테고리의 게시물