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
함숭 의해 채워지는 중요한 정보 묶음이다.