https://docs.microsoft.com/en-us/windows/win32/learnwin32/learn-to-program-for-windows
์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๋ฐ์ดํฐ ํ์ | ํฌ๊ธฐ |
---|---|
BYTE | 8๋นํธ |
DWORD | 32๋นํธ |
INT32 | 32๋นํธ |
INT64 | 64๋นํธ |
LONG | 32๋นํธ |
LONGLONG | 64๋นํธ |
UINT32 | 32๋นํธ |
UINT64 | 64๋นํธ |
ULONG | 32๋นํธ |
ULONGLONG | 64๋นํธ |
WORD | 16๋นํธ |
WinDef.h์๋ BOOL๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๋๊ฐ์ง ๊ฐ์ด ์ ์๋์ด ์๋ค.
#define FALSE 0
#define TRUE 1
๊ทธ๋ฌ๋ BOOL ํ์์ ๋ฐํํ๋ ๋๋ถ๋ถ์ ํจ์๋ ์ฐธ์ผ ๊ฒฝ์ฐ 0์ ์๋์ง๋ง 1๋ ์๋ ๊ฐ์ด ๋ฐํ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์๋์ฒ๋ผ ์์ฑํ๋ฉด ์๋๋ค.
if (result == TRUE) // wrong !!
{
...
}
์๋๋ ๋ง๋ ํํ๋ค์ด๋ค.
if (SomeFunctionThatReturnsBoolean())
{
...
}
// or
if (SomeFunctionThatReturnsBoolean() != FALSE)
{
...
}
Windows์์ ํฌ์ธํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฆ ์์ P๋ LP๋ฅผ ๋ถ์ฌ์ ํํํ๋ค. ์๋ฅผ ๋ค์ด LPRECT๋ RECT์ ๋ํ ํฌ์ธํฐ์ด๋ค.
RECT๊ฐ ์ฌ๊ฐํ์ ์ค๋ช ํ๋ ๊ตฌ์กฐ์ฒด๋ผ๊ณ ํ ๋ RECT์ ํฌ์ธํฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
RECT* rect; // Pointer to a RECT structure
LPRECT rect; // The same
PRECT rect; // Also the same
P๋ ํฌ์ธํฐ์ด๊ณ , LP๋ long ํฌ์ธํฐ๋ฅผ ์๋ฏธํ๋ค. LP๋ 16๋นํธ ์ฝ๋๋ฅผ 32๋นํธ Windows์ ์ธ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋์์ผ๋ ํ์ฌ๋ P์ LP๋ ๊ตฌ๋ถ๋์ง ์์ผ๋ฉฐ ๋์ผํ๊ฒ ์ฐ์ธ๋ค. ํฌ์ธํฐ๋ฅผ ๋ํ๋ผ ๋ ๋ณดํต์ P๋ฅผ ์ด๋ค.
์ ํฌ์ธํฐ ์ ๋ฐ๋ ํ์ ๋ค์ 32๋นํธ, 64๋นํธ ๋ฑ์ ํ๊ฒฝ์ ๋ง๊ฒ ์ ์๋์ด ์๋ค. ์ฆ 32๋นํธ์์๋ 32๋นํธ ํฌ์ธํฐ, 64๋นํธ์์๋ 64๋นํธ ํฌ์ธํฐ๊ฐ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ํ์์ ์ ์๋ฅผ ํฌ์ธํฐ๋ก ์บ์คํ ํ๋ ์ํฉ์์ ์ฌ์ฉ๋๋ค. ํฌ์ธํฐ ์ฐ์ ์ด๋, ๋ฃจํ๋ก ์ ์ฒด ๋ฐ์ดํธ ๋ฒ์๋ฅผ ๋ฐ๋ณตํ ๋ ๋ฑ์์๋ ์ฌ์ฉ๋๋ค. ๋ 32๋นํธ์์ 64๋นํธ๋ก ํ์ฅํ๋ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ์๋ ํฌ์ธํฐ์ ํฌ๊ธฐ๋ ์ฌ์ ํ 4byte์ด๋ค.
Windows๋ ๊ธฐ๋ณธ์ ์ผ๋ก UTF-16 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ฌ ์ ๋์ฝ๋ ๋ฌธ์๋ฅผ ๋ํ๋ด์ด ๊ฐ ๋ฌธ์๋ 16๋นํธ๋ก ์ธ์ฝ๋ฉ๋๋ค.
UTF-8 ๋ฌธ์๋ฅผ 8๋นํธ ANSI ๋ฌธ์์ ๊ตฌ๋ณํ๊ธฐ ์ํด wide ๋ฌธ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Visual C++ ์ปดํ์ผ๋ฌ๋ wide ๋ฌธ์์ ๋ํด wchar_t๋ฅผ ์ง์ํ๋ฉฐ WinNT(ํค๋ํ์ผ)์๋ ์๋ typedef๊ฐ ์ ์๋์ด ์๋ค.
typedef wchar_t WCHAR;
wide ๋ฌธ์, ๋ฌธ์์ด์ ์์ฑํ๋ ค๋ฉด ์์ L์ ๋ถ์ด๋ฉด ๋๋ค.
wchar_t a = L'a';
wchar_t *str = L"hello";
๋ฌธ์์ด ๊ด๋ จ typedef๋ ๋ค์๊ณผ ๊ฐ๋ค
Typedef | Definition |
---|---|
CHAR | char |
PSTR or LPSTR | char* |
PCSTR or LPCSTR | const char* |
PWSTR or LPWSTR | wchar_t* |
PCWSTR or LPCWSTR | const wchar_t* |
Windows์ ๋ํ ์ ๋์ฝ๋ ์ง์์ ๋์ ํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ ๋ณ๋ ฌ API๋ฅผ ์ด์ฉํ๋ค. (ANSI ๋ฌธ์์ด๊ณผ ์ ๋์ฝ๋ ๋ฌธ์์ด ์ฉ)
๐ ์ฐฝ ์ ๋ชฉ ํ์์ค์ ํ ์คํธ๋ฅผ ์ค์ ํ๋ ๋ ๊ฐ์ง ํจ์
๋ด๋ถ์ ์ผ๋ก ANSI ๋ฒ์ ์ ๋ฌธ์์ด์ ์ ๋์ฝ๋๋ก ์ ํํ๋ค.
๋ํ Windows ํค๋๋ ์๋์ ๊ฐ์ ๋งคํฌ๋ก๋ฅผ ์ง์ํ๋ค.
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
ANSI ๋ฌธ์์ด์ ํธํ๋์ง ์๋ ์ธ์ด๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ ๋์ฝ๋ ๋ฒ์ ์ ์ฐ๋ ๊ฒ์ด ์ข๋ค. Windows์ ์ต์ API์๋ ANSI ๋ฒ์ ์ด ์๊ณ ์ ๋์ฝ๋ ๋ฒ์ ๋ง ์๋ค.
์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฌ ์๋์ฐ ๋ฒ์ ์ ๋ชจ๋ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋์ ํ๋ซํผ์ ๋ฐ๋ผ ANSI ๋๋ ์ ๋์ฝ๋ ๋ฌธ์์ด์ ๋ํด ๋์ผํ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ๋ ๊ฒ์ด ์ ์ฉํ๋ค. ๋ฐ๋ผ์ Windows SDK๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ฌธ์์ด์ ์ ๋์ฝ๋๋ ANSI๋ก ๋งคํํ๋ ๋งคํฌ๋ก๋ฅผ ์ฌ๊ณตํ๋ค.
Macro | ์ ๋์ฝ๋(Unicode) | ANSI |
---|---|---|
TCHAR | wchar_t | char |
TEXT("x") | L"x" | "x" |
์๋ฅผ ๋ค์ด ์๋ ์ฝ๋๋
SetWindowText(TEXT("My Application"));
๋ ์ค ํ๋๊ฐ ๋๋ค.
SetWindowTextW(L"My Application"); // ์ ๋์ฝ๋
SetWindowTextA("My Application"); // ANSI
๋ช๋ช ํค๋๋ ์ ์ฒ๋ฆฌ๊ธฐ ๊ธฐํธ UNICODE๋ฅผ ์ด์ฉํ๊ณ ๋ค๋ฅธ ๊ฒ๋ค์ _UNICODE ๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค define ํด์ฃผ์ด์ผ ํ๋ค.
Visual C++ ์์๋ default๋ก ์ค์ ๋๋ค.
์ฐฝ์ ์๊ฐํ๋ฉด ๋ณดํต ์์ ๊ฐ์ ์ฐฝ์ ๋ ์ฌ๋ฆฐ๋ค. ์ด๋ฌํ ์ฐฝ์ application window ๋๋ main window ๋ผ๊ณ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ๋ชฉ ํ์์ค, ์ต์ํ, ์ต๋ํ ๋ฒํผ ๋ฐ ๊ธฐํ ํ์ค UI ์์๊ฐ ์๋ ํ๋ ์์ด ์๋ค.
ํ๋ ์์ ์ด์ ์ฒด์ ๊ฐ ์ฐฝ์ ํด๋น ์์ญ ๋ถ๋ถ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋น ํด๋ผ์ด์ธํธ ์์ญ (non-client area)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ๋ ์ ๋ด์ ์์ญ์ ํด๋ผ์ด์ธํธ ์์ญ(client area)์ด๋ค.
๋ค๋ฅธ ์ ํ์ ์ฐฝ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ฌํ ๋ฒํผ๊ณผ ๊ฐ์ UI control๋ ์ฐฝ์ด๋ค. control๊ณผ ์ดํ๋ฆฌ์ผ์ด์ ์ฐฝ์ ์๋ก ํต์ ํ ์ ์๋ค.
์ฐฝ์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๋ ๊ฒ์ด ์ข๋ค
control ์ฐฝ์ ์ดํ๋ฆฌ์ผ์ด์
์ฐฝ์ ์์์ด๋ค.
๋ modal ๋ํ ์์๊ฐ ํ์๋ ๋, ์ดํ๋ฆฌ์ผ์ด์
์ฐฝ์ ์์ ์(owner)์ฐฝ์ด๊ณ ๋ํ ์์๋ ์์ ๋(owned)์ฐฝ์ด๋ค.
window๋ ๊ฐ์ฒด์ด๋ฉฐ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์์ง๋ง C++ ํด๋์ค๋ ์๋๋ค. ๋์ ํ๋ก๊ทธ๋จ์ ํธ๋ค(handle) ์ด๋ผ๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ฐฝ์ ์ฐธ์กฐํ๋ค. ํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋๋ ์ซ์์ผ ๋ฟ์ด๋ค.
Windows๊ฐ ๋ง๋ ๋ชจ๋ ์ฐฝ์ด ๋ด๊ธด ํฐ ํ
์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ฃผํ๊ณ , ์ด ํ
์ด๋ธ์ ์ฌ์ฉํ์ฌ ํธ๋ค๋ก ์ฐฝ์ ์กฐํํ๋ค. ์ฐฝ ํธ๋ค์ ๋ฐ์ดํฐ ํ์์ ์ผ๋ฐ์ ์ผ๋ก HWND์ด๋ค. (aitch-wind๋ก ๋ฐ์) ์ฐฝ ํธ๋ค์ ์ฐฝ์ ๋ง๋๋ ํจ์ CreateWindow ๋ฐ CreateWindowEx์์ ๋ฐํ๋๋ค.
์ฐฝ์์ ์์ ์ ์ํํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก HWND ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ก ๋ฐ๋ ์ผ๋ถ ํจ์๋ฅผ ํธ์ถํ๋ค. ์๋ฅผ ๋ค์ด ํ๋ฉด์ ์ฐฝ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด MoveWindow ํจ์๋ฅผ ํธ์ถํ๋ค.
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
์ฌ๊ธฐ์ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์ HWND hWnd๊ฐ ์ด๋ํ๋ ค๋ ์ฐฝ์ ๋ํ ํธ๋ค์ด๋ค.
ํธ๋ค์ ํฌ์ธํฐ๊ฐ ์๋๋ค.
์ขํ๋ ๋๋ฐ์ด์ค์ ๋ ๋ฆฝ์ ์ธ ํฝ์ (device-independent pixels)๋ก ์ธก์ ๋๋ค.
์์ ์ ๋ฐ๋ผ ํ๋ฉด์ ๊ธฐ์ค์ผ๋ก, ์ฐฝ(ํ๋ ์ ํฌํจ)์ ๊ธฐ์ค์ผ๋ก ๋๋ ์ฐฝ์ ํด๋ผ์ด์ธํธ ์์ญ์ ๊ธฐ์ค์ผ๋ก ์ขํ๋ฅผ ์ธก์ ํ ์ ์๋ค.
๊ฐ ๊ฒฝ์ฐ์ ์์ (0,0)์ ํญ์ ์์ญ์ ์ผ์ชฝ ์ ๋ชจํ์ด์ด๋ค.
๋ชจ๋ Windows ํ๋ก๊ทธ๋จ์๋ WinMain ๋๋ wWinMain ์ด๋ผ๋ ์ง์ ์ ํจ์๊ฐ ํฌํจ๋์ด ์๋ค.
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
ํจ์๋ int ๊ฐ์ ๋ฐํํ๋ฉฐ ์ด ๋ฐํ ๊ฐ์ด ์ด์์ฒด์ ์์ ์ฌ์ฉ๋์ง๋ ์์ง๋ง ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ฌ ์์ฑํ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ ์ ์๋ค.
WinMain ํจ์๋ ๋ช ๋ น์ค ์ธ์๊ฐ ANSI ๋ฌธ์์ด๋ก ์ ๋ฌ๋๋ค๋ ์ ์ ์ ์ธํ๊ณ wWinMain๊ณผ ๋์ผํ๋ค.
๐ ๋น WinMain ํจ์
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow)
{
return 0;
}