๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

WinMain

by eazuooz 2022. 9. 5.

์˜ˆ์ œ ์†Œ์Šค

https://github.com/eazuooz/WindowAPI/tree/b4b7c45e0fd88ddcb056783c49a9640ed6260501

 

GitHub - eazuooz/WindowAPI

Contribute to eazuooz/WindowAPI development by creating an account on GitHub.

github.com

ํ—ค๋” ํŒŒ์ผ

์šฐ์„  ์ œ์ผ ์ฒซํ–‰์„ ๋ณด๋ฉด windows.h ํ•˜๋‚˜๋งŒ ์ธํด๋ฃจ๋“œ ๋˜์–ด์žˆ๋‹ค. 

๋„์Šค์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•˜์ง€๋งŒ ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ—ค๋” ํŒŒ์ผ์— ๋ชจ๋“  API

ํ•จ์ˆ˜๋“ค์˜ ์›ํ˜•๊ณผ ์‚ฌ์šฉํ•˜๋Š” ์ƒ์ˆ˜๋“ค์„ ์ฃ„๋‹ค ์ •์˜ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— windos.h๋งŒ ํฌํ•จํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

windows.h ํ—ค๋”ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ํ•จ์ˆ˜ ์›ํ˜•๋“ฑ์„ ์ •์˜ํ•˜๋ฉฐ ๊ทธ ์™ธ ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์œˆ๋„์šฐ์ฆˆ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฒซ ์ค„์€ ๊ฑฐ์˜ ํ•ญ์ƒ include <windows.h>๋กœ ์‹œ์ž‘๋œ๋‹ค.

 

์‹œ์ž‘์ 

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)

๋‹ค์Œ์œผ๋กœ dos ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ฐจ์ด๋‚˜๋Š” ์ ์€ ์‹œ์ž‘์ ์ธ entry point๊ฐ€ mainํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ WinMain์ด๋ผ๋Š” ์ ์ด๋‹ค.

์œˆ๋„์šฐ์ฆˆ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์€ main์ด ์•„๋‹Œ WinMain์ด๋‹ค.

winMain์€ 4๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š”๋ฐ ๊ฐ ์ธ์ˆ˜์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ธ์ˆ˜ ์˜๋ฏธ
hInstance ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค ํ•ธ๋“ค (ํ”„๋กœ์„ธ์Šค ID)
hPrevInstance ๋ฐ”๋กœ ์•ž์— ์‹คํ–‰๋œ ํ˜„์žฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค ํ•ธ๋“ค. ์—†์„ ๊ฒฝ์šฐ๋Š” NULL์ด ๋˜๋ฉฐ WIN32์—์„œ๋Š” ํ•ญ์ƒ NULL์ด๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๋Š” ์ธ์ˆ˜์ด๋ฏ€๋กœ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
lpCmdLine ๋ช…๋ นํ–‰์œผ๋กœ ์ž…๋ ฅ๋œ ํ”„๋กœ๊ทธ๋žจ ์ธ์ˆ˜์ด๋‹ค. ๋„์Šค์˜ argv์ธ์ˆ˜์— ํ•ด๋‹นํ•œ๋‹ค.
nCmdShow ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ํ˜•ํƒœ์ด๋ฉฐ ์ตœ์†Œํ™”, ๋ณดํ†ต๋ชจ์–‘ ๋“ฑ์ด ์ „๋‹ฌ๋œ๋‹ค.

์ด์ค‘ hInstance ์™ธ์—๋Š” ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ธ์Šคํ„ด์Šค๋ผ๋Š” ๋ง์€ ํด๋ž˜์Šค๊ฐ€ ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ๊ตฌํ˜„๋œ ์‹ค์ฒด๋ฅผ ์˜๋งˆํ•œ๋‹ค.

์œˆ๋„์šฐ์ฆˆ์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์‹œ์Šคํ…œ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋•Œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฐ๊ฐ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ”„๋กœ๊ทธ๋žจ ์ธ์Šคํ„ด์Šค๋ผ๊ณ ํ•˜๋ฉฐ ๊ฐ„๋‹จํžˆ ์ค„์—ฌ์„œ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”๋ชจ์žฅ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘๋ฒˆ ์‹คํ–‰ ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด ๋ณด์ž.

์ด๋•Œ ๋‘ ํ”„๋กœ๊ทธ๋žจ์€ ๋ชจ๋‘ ๋ฉ”๋ชจ์žฅ์ด์ง€๋งŒ ์šด์˜์ฒด์ œ๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.

์ด๋•Œ ๊ฐ ๋ฉ”๋ชจ์žฅ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ํ•ธ๋“ค์„ ๊ฐ€์ง€๋ฉฐ ์šด์˜์ฒด์ œ๋Š” ์ด ์ธ์Šคํ„ด์Šค ํ•ธ๋“ค๊ฐ’์œผ๋กœ ๋‘๊ฐœ์˜ ๋ฉ”๋ชจ์žฅ์„ ์„œ๋กœ ๊ตฌ๋ณ„ํ•œ๋‹ค.

 

hInstance๋ž€ ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋ฅผ ์ผ์ปซ๋Š” ์ •์ˆ˜๊ฐ’์ด๋ฉฐ APIํ•จ์ˆ˜์—์„œ ์ˆ˜์‹œ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

lpszClass๋ผ๋Š” ์ „์—ญ ๋ฌธ์ž์—ด์ด ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ ์ด ๋ฌธ์ž์—ด์€ ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

๋ฉ”์„ธ์ง€ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜

 ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž์„ธํžˆ ๋ณด๋ฉด ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๋งŒ ์žˆ๋‹ค. ํ•˜๋‚˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์ธ winMain์ด๋ฉฐ ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” WndProc์ด๋‹ค. 

๋„์Šค์—์„œ๋Š” main ํ•จ์ˆ˜๋งŒ์œผ๋กœ๋„ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์œˆ๋„์šฐ์ฆˆ์—์„œ๋Š” ์•„์ฃผ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ด ๋‘๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

winMain์—์„œ๋Š” ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ  ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๊ธฐ๋งŒ ํ•  ๋ฟ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์ผ์€ WndProc์—์„œ ์ด๋ฃจ์–ด ์ง„๋‹ค.

winMain์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘์‹œํ‚ค๊ธฐ๋งŒ ํ•˜๋ฉฐ ์‹ค์งˆ์ ์ธ ์ฒ˜๋ฆฌ๋Š” ๋Œ€๋ถ€๋ถ„ WndProc์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. 

winMain ์€ ๋Œ€์ฒด์ ์œผ๋กœ ํ•ญ์ƒ ์ผ์ •ํ•œ ์ฝ”๋“œ๋กœ ๋˜์–ด์žˆ์ง€๋งŒ wndProc์€ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ์„œ ์ฒœ์ฐจ๋งŒ๋ณ„๋กœ ๋‹ฌ๋ผ์ง„๋‹ค.

๊ทธ๋ž˜์„œ ์†Œ์Šค๋ฅผ ๋ถ„์„ ํ• ๋•Œ ์ฃผ์˜๊นŠ๊ฒŒ ๋ด์•ผํ•  ๋ถ€๋ถ„์€ main์ด ์•„๋‹ˆ๋ผ proc์ด๋‹ค. 

 

์œˆ๋„์šฐ ํด๋ž˜์Šค

winMainํ•จ์ˆ˜์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ผ์€ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ผ์ด๋‹ค.

์œˆ๋„์šฐ๊ฐ€ ์žˆ์–ด์•ผ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ  ์ถœ๋ ฅ์„ ๋ณด์—ฌ์ค„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“œ๋ ค๋ฉด ์œˆ๋„์šฐ

ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ๋“ฑ๋กํ•œํ›„ CreateWindowํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ๋ชจ๋“  ์œˆ๋„์šฐ๋Š” ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ

์œˆ๋„์šฐ ํด๋ž˜์Šค๋Š” ๋งŒ๋“ค์–ด์งˆ ์œˆ๋„์šฐ์˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŠน์„ฑ์„ ์ •์˜ํ•œ๋‹ค.

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

style

์œˆ๋„์šฐ์˜ ์Šคํƒ€์ผ์„ ์ •์˜ํ•œ๋‹ค. ์ฆ‰ ์œˆ๋„์šฐ๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉค๋ฒ„์ด๋‹ค. ์ด ๋ฉค๋ฒ„๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋ฌด์ง€ํ•˜๊ฒŒ ๋งŽ์ง€๋งŒ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด CS_HREDRAW์™€ CS_VREDRAW์ด๋‹ค. ์ด ๋‘ ๊ฐ’์„ OR ์—ฐ์‚ฐ์ž(|)๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๊ฐ’๋“ค์˜ ์˜๋ฏธ๋Š” ์œˆ๋„์šฐ์˜ ์ˆ˜์ง(๋˜๋Š” ์ˆ˜ํ‰) ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•  ๊ฒฝ์šฐ ์œˆ๋„์šฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋ฐ–์—๋„ ๋งŽ์€ ๊ฐ’์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

lpfnWndProc

์ด ๋ฉค๋ฒ„๋Š” ์œˆ๋„์šฐ์˜ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์ด ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ฌผ๋ก  ๋งˆ์Œ๋Œ€๋กœ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฑฐ์˜ WndProc์œผ๋กœ ์ •ํ•ด์ ธ ์žˆ๋Š” ํŽธ์ด๋‹ค.

์ฐธ๊ณ  WinMain ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์ด๋ฏ€๋กœ ๋„์Šค์—์„œ ์‹œ์ž‘์ ์ด ๋ฐ˜๋“œ์‹œ main์ด์–ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋ฆ„์ด ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์ธ WndProc๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์ด๋ฆ„์„ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ด€์Šต์— ์˜ํ•ด ์ด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ WndProc์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ด€์Šต์ด๋ž€ ์˜ค๋žœ ์„ธ์›”๋™์•ˆ ๋งŽ์€ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ์— ์˜ํ•ด ๊ฐ€์žฅ ๋ง์ฝ์—†๋Š” ํ˜•ํƒœ๋กœ ๊ตณ์–ด์ง„ ๊ฒƒ์ด๋ฏ€๋กœ ์–ด๊ฒจ๋ด์•ผ ๋“๋ณด๋‹ค ์‹ค์ด ๋” ๋งŽ๋‹ค.

cbClsExtra, cbWndExtra

์ผ์ข…์˜ ์˜ˆ์•ฝ ์˜์—ญ์ด๋‹ค. ์œˆ๋„์šฐ์ฆˆ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ์•„์ฃผ ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์— ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋ถ„์˜ ๊ณต๊ฐ„์ด๋‹ค. ์˜ˆ์•ฝ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋Š” 0์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

þhInstance

์ด ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒˆํ˜ธ์ด๋ฉฐ ์ด ๊ฐ’์€ WinMain์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ hInstance๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋Œ€์ž…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

hIcon, hCursor

์ด ์œˆ๋„์šฐ๊ฐ€ ์‚ฌ์šฉํ•  ๋งˆ์šฐ์Šค ์ปค์„œ์™€ ์ตœ์†Œํ™”๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋  ์•„์ด์ฝ˜์„ ์ง€์ •ํ•œ๋‹ค. LoadCursor ํ•จ์ˆ˜์™€ LoadIcon ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์•„์ด์ฝ˜๊ณผ ์ปค์„œ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์œˆ๋„์šฐ์ฆˆ๊ฐ€ ๋””ํดํŠธ๋กœ ์ œ๊ณตํ•˜๋Š” ์•„์ด์ฝ˜๊ณผ ์ปค์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ปค์„œ๋Š” ์ขŒ์ธก์œผ๋กœ ๊ธฐ์šธ์–ด์ง„ ํ™”์‚ดํ‘œ ๋ชจ์–‘์ด๋ฉฐ ์•„์ด์ฝ˜์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐ€์ง„๋‹ค.

 

hbrBackground

์œˆ๋„์šฐ์˜ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ์ง€์ •ํ•œ๋‹ค. ์ข€ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์œˆ๋„์šฐ์˜ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์„ ์ฑ„์ƒ‰ํ•  ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉค๋ฒ„์ด๋‹ค. GetStockObject๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋Ÿฌ์‹œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ(WHITE_BRUSH)์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

lpszMenuName

์ด ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•  ๋ฉ”๋‰ด๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋ฉ”๋‰ด๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์—์„œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฆฌ์†Œ์Šค ์—๋””ํ„ฐ์— ์˜ํ•ด ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์ง„ ํ›„ ๋งํฌ์‹œ์— ๊ฐ™์ด ํ•ฉ์ณ์ง„๋‹ค. ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ด ๋ฉค๋ฒ„์— NULL์„ ๋Œ€์ž…ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

lpszClassName

์œˆ๋„์šฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ •์˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ ์ด๋ฆ„์€ CreateWindow ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์–ด์ง€๋ฉฐ CreateWindow ํ•จ์ˆ˜๋Š” ์œˆ๋„์šฐ ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•œ ํŠน์„ฑ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ ๋‹ค. ์œˆ๋„์šฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์€ ๋ณดํ†ต ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜์‹œ์ผœ ์ž‘์„ฑํ•˜๋ฉฐ ์ด ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ lpszClass ๋ฌธ์ž์—ด์— "First"๋ฅผ ๋Œ€์ž…ํ•œ ํ›„ ์ด ๋ฌธ์ž์—ด์„ ์œˆ๋„์šฐ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๋ฉค๋ฒ„์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„ ํ•œ๋ฒˆ์— ๋‹ค ์ตํžˆ๊ธฐ ํž˜๋“ค๊ฒ ์ง€๋งŒ ์ด ์ค‘์— ์ œ์ผ ์ค‘์š”ํ•œ ๋ฉค๋ฒ„๋Š” ์œˆ๋„์šฐ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ •์˜ํ•˜๋Š” lpszClassName๊ณผ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” lpfnWndProc์ด๋‹ค. ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ ํ›„ RegisterClass ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

 

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWAPI));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWAPI);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

RegisterClass ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ wndClass ๊ตฌ์กฐ์ฒด์˜ ๋ฒˆ์ง€๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ์„ ๊ฐ€์ง„ ์œˆ๋„์šฐ๋ฅผ ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋“ฑ๋ก ๊ณผ์ •์ด๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  ๋‚œํ›„์— ๋“ฑ๋ก๋œ ์œˆ๋„์šฐ๋กœ ์œˆ๋„์šฐ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // ์ธ์Šคํ„ด์Šค ํ•ธ๋“ค์„ ์ „์—ญ ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

   HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

lpszClassName

์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์œˆ๋„์šฐ์˜ ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ์•ž์—์„œ ์ •์˜ํ•œ WndClass๊ตฌ์กฐ์ฒด์˜ lpszClassName ๋ฉค๋ฒ„์˜ ์ด๋ฆ„์„ ์—ฌ๊ธฐ์— ๊ธฐ์ž…ํ•ด ์ค€๋‹ค. ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ์—์„œ๋Š” lpszClass ๋ฌธ์ž์—ด์— ์œˆ๋„์šฐ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๊ธฐ์–ต์‹œ์ผœ ๋‘์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

 

lpszWindowName

์œˆ๋„์šฐ์˜ ํƒ€์ดํ‹€ ๋ฐ”์— ๋‚˜ํƒ€๋‚  ๋ฌธ์ž์—ด์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์ด ์œˆ๋„์šฐ์˜ ํƒ€์ดํ‹€ ๋ฐ”์— ๋‚˜ํƒ€๋‚œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ์ฑ…์—์„œ๋Š” ์˜ˆ์ œ์˜ ํ”„๋กœ์ ํŠธ๋ช…(lpszClass ์ „์—ญ ๋ฌธ์ž์—ด)์„ ํƒ€์ดํ‹€ ๋ฐ”์— ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค.

 

dwStyle

๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์œˆ๋„์šฐ์˜ ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์ธ์ˆ˜์ด๋‹ค. ์ผ์ข…์˜ ๋น„ํŠธ ํ•„๋“œ๊ฐ’์ด๋ฉฐ ๊ฑฐ์˜ ์ˆ˜์‹ญ๊ฐœ๋ฅผ ํ—ค์•„๋ฆฌ๋Š” ๋งคํฌ๋กœ ์ƒ์ˆ˜๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๊ณ  ์ด ์ƒ์ˆ˜๋“ค์„ OR์—ฐ์‚ฐ์ž๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์œˆ๋„์šฐ์˜ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์œˆ๋„์šฐ๊ฐ€ ๊ฒฝ๊ณ„์„ ์„ ๊ฐ€์งˆ ๊ฒƒ์ธ๊ฐ€, ํƒ€์ดํ‹€ ๋ฐ”๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ธ๊ฐ€ ๋˜๋Š” ์Šคํฌ๋กค ๋ฐ”์˜ ์œ ๋ฌด ๋“ฑ๋“ฑ์„ ์„ธ์„ธํ•˜๊ฒŒ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์Šคํƒ€์ผ๊ฐ’์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋˜ WS_OVERLAPPEDWINDOW๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ๋ฌด๋‚œํ•œ ์œˆ๋„์šฐ ์„ค์ • ์ƒํƒœ๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ์‹œ์Šคํ…œ ๋ฉ”๋‰ด, ์ตœ๋Œ€ ์ตœ์†Œ ๋ฒ„ํŠผ, ํƒ€์ดํ‹€ ๋ฐ”, ๊ฒฝ๊ณ„์„ ์„ ๊ฐ€์ง„ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.

 

X, Y, nWidth, nHeight

์ธ์ˆ˜์˜ ์ด๋ฆ„์ด ์˜๋ฏธํ•˜๋“ฏ์ด ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ํ”ฝ์…€ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. x, y์ขŒํ‘œ๋Š” ๋ฉ”์ธ ์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ๋Š” ์ „์ฒด ํ™”๋ฉด์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉฐ ์ฐจ์ผ๋“œ ์œˆ๋„์šฐ๋Š” ๋ถ€๋ชจ ์œˆ๋„์šฐ์˜ ์ขŒ์ƒ๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค. ์ •์ˆ˜๊ฐ’์„ ๋ฐ”๋กœ ์ง€์ •ํ•ด๋„ ๋˜๋ฉฐ CW_USEDEFAULT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œˆ๋„์šฐ์ฆˆ๊ฐ€ ์•Œ์•„์„œ ์ ๋‹นํ•œ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ด ์ค€๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋ชจ๋‘ CW_USEDEFAULT๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

hWndParent

๋ถ€๋ชจ ์œˆ๋„์šฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์œˆ๋„์šฐ์˜ ํ•ธ๋“ค์„ ์ง€์ •ํ•ด ์ค€๋‹ค. MDI ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํŒ์—… ์œˆ๋„์šฐ๋Š” ์œˆ๋„์šฐ๋ผ๋ฆฌ ์ˆ˜์ง์ ์ธ ์ƒํ•˜๊ด€๊ณ„๋ฅผ ๊ฐ€์ ธ ๋ถ€์ž(parent-child) ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ๋˜๋Š”๋ฐ ์ด ๊ด€๊ณ„๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ์ธ์ˆ˜์ด๋‹ค. ๋ถ€๋ชจ ์œˆ๋„์šฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ๋Š” ์ด ๊ฐ’์„ NULL๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

hmenu

์œˆ๋„์šฐ์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”๋‰ด์˜ ํ•ธ๋“ค์„ ์ง€์ •ํ•œ๋‹ค. WndClass์—๋„ ๋ฉ”๋‰ด๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š”๋ฐ ์œˆ๋„์šฐ ํด๋ž˜์Šค์˜ ๋ฉ”๋‰ด๋Š” ๊ทธ ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ชจ๋“  ์œˆ๋„์šฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ์ด ์ธ์ˆ˜๋กœ ์ง€์ •๋œ ๋ฉ”๋‰ด๋Š” ํ˜„์žฌ CreateWindow ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์œˆ๋„์šฐ์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ WndClass์—์„œ ์ง€์ •ํ•œ ๋ฉ”๋‰ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์ธ์ˆ˜๋ฅผ NULL๋กœ ์ง€์ •ํ•˜๋ฉด ๋˜๋ฉฐ WndClass์—์„œ ์ง€์ •ํ•œ ๋ฉ”๋‰ด ๋Œ€์‹  ๋‹ค๋ฅธ ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์ธ์ˆ˜์— ์›ํ•˜๋Š” ๋ฉ”๋‰ด ํ•ธ๋“ค์„ ์ฃผ๋ฉด ๋œ๋‹ค. First ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ WndClass์—๋„ ๋ฉ”๋‰ด๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  CreateWindow ํ•จ์ˆ˜์—์„œ๋„ ๋ฉ”๋‰ด๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋ฉ”๋‰ด์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

hinst

์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ฃผ์ฒด, ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•ธ๋“ค์„ ์ง€์ •ํ•œ๋‹ค. WinMain์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ hInstance๋ฅผ ๋Œ€์ž…ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

 

lpvParam

CREATESTRUCT๋ผ๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ฒˆ์ง€์ด๋ฉฐ ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์— ์‚ฌ์šฉ๋œ๋‹ค. ๋ณดํ†ต์€ NULL๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ ์—ฌ๊ธฐ์„œ CreateWindow์˜ ๋ชจ๋“  ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋‹ค ์™ธ์šฐ๋ ค๊ณ  ํ•  ํ•„์š”๊นŒ์ง€๋Š” ์—†๊ณ  ์˜ˆ์ œ์—์„œ ์–ด๋–ค ๊ฐ’์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”๊ฐ€์™€ ๊ทธ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€๋งŒ ๋Œ€์ถฉ ๋ณด๊ณ  ๊ฐ€๋„๋ก ํ•˜์ž. ์—ฌ๊ธฐ์„œ ์ž ๊น ํ•„์ž๊ฐ€ ์ž”์†Œ๋ฆฌ๋ฅผ ์ข€ ํ•˜์ž๋ฉด API ๊ณต๋ถ€๋ฅผ ํ•  ๋•Œ๋Š” ๋ฌด์‹œํ•  ๊ฑด ๊ณผ๊ฐํ•˜๊ฒŒ ๋ฌด์‹œํ•˜๊ณ  ์ง€๋‚˜๊ฐ€๋Š” ์š”๋ น์ด ํ•„์š”ํ•˜๋‹ค. CreateWindow ํ•จ์ˆ˜๋Š” API๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋ฌด์ฒ™ ์ค‘์š”ํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ 11๊ฐœ๋‚˜ ๋˜๋Š” ์ธ์ˆ˜๋“ค์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ๊นŒ์ง€ ์†์†๋“ค์ด ์ดํ•ดํ•  ํ•„์š”๊นŒ์ง€๋Š” ์—†๋‹ค. x,y,lpszWindowName ๋“ฑ ์‰ฝ๊ฒŒ ์ดํ•ด๋˜๋Š” ์ธ์ˆ˜๋“ค๋งŒ ๋Œ€์ถฉ ๋ด๋‘๋ฉด ๋˜์ง€ lpvParam๊ฐ™์€ ์ „๋ฌธ์ ์ด๊ณ  ์–ด๋ ค์šด ์ธ์ˆ˜์˜ ์˜๋ฏธ๋‚˜ dwStyle์ธ์ˆ˜์˜ ๋ชจ๋“  ์Šคํƒ€์ผ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•œ๋‹ค๊ณ  ๋‚˜์  ๊ฒƒ์€ ์—†๊ฒ ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‹ค๊ฐ€๋Š” ์ œํ’€์— ์ง€์ณ ๊ธˆ์ƒˆ ํฅ๋ฏธ๋ฅผ ์žƒ๊ณ  ๋งŒ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋ก ์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ํฐ ์ค„๊ธฐ๋ฅผ ๋จผ์ € ํŒŒ์•…ํ•˜๋Š”๋ฐ ์ •์„ฑ์„ ์Ÿ์œผ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

CreateWindow ํ•จ์ˆ˜๋Š” ์œˆ๋„์šฐ์— ๊ด€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋งŒ๋“  ํ›„ ์œˆ๋„์šฐ ํ•ธ๋“ค์„ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค. ๋„˜๊ฒจ์ง€๋Š” ์œˆ๋„์šฐ ํ•ธ๋“ค์€ hWnd๋ผ๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ์œˆ๋„์šฐ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

CreateWindow ํ•จ์ˆ˜๋กœ ๋งŒ๋“  ์œˆ๋„์šฐ๋Š” ์–ด๋””๊นŒ์ง€๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ๋งŒ ์žˆ์„ ๋ฟ์ด๋ฉฐ ์•„์ง๊นŒ์ง€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜์ง€๋Š” ์•Š์•˜๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๋งŒ๋“ค์–ด์ง„ ์œˆ๋„์šฐ๋ฅผ ํ™”๋ฉด์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

BOOL ShowWindow(hWnd, nCmdShow);

hWnd ์ธ์ˆ˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•˜๋Š” ์œˆ๋„์šฐ์˜ ํ•ธ๋“ค์ด๋ฉฐ CreateWindow ํ•จ์ˆ˜๊ฐ€ ๋ฆฌํ„ดํ•œ ํ•ธ๋“ค์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค. nCmdShow๋Š” ์œˆ๋„์šฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งคํฌ๋กœ ์ƒ์ˆ˜๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

๋งคํฌ๋กœ ์ƒ์ˆ˜ ์˜๋ฏธ
SW_HIDE ์œˆ๋„์šฐ๋ฅผ ์ˆจ๊ธด๋‹ค.
SW_MINIMIZE ์œˆ๋„์šฐ๋ฅผ ์ตœ์†Œํ™”์‹œํ‚ค๊ณ  ํ™œ์„ฑํ™”์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
SW_RESTORE ์œˆ๋„์šฐ๋ฅผ ํ™œ์„ฑํ™”์‹œํ‚จ๋‹ค.
SW_SHOW ์œˆ๋„์šฐ๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ๋ณด์—ฌ์ค€๋‹ค.
SW_SHOWNORMAL ์œˆ๋„์šฐ๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ ๋ณด์—ฌ์ค€๋‹ค.

nCmdShow ์ธ์ˆ˜์— ์–ด๋–ค ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ธ๊ฐ€๋Š” ์ „ํ˜€ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ WinMain ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ nCmdShow๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ShowWindow(hWnd,nCmdShow);์™€ ๊ฐ™์ด ๊ฑฐ์˜ ํ˜ธ์ถœ ํ˜•์‹์ด ์ •ํ•ด์ ธ ์žˆ๋Š” ์…ˆ์ด๋‹ค. ์„ค๋ช…์ด ์ข€ ๊ธธ์–ด์ง€๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“ค๊ณ  ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ ๋‘ ์ค„์ด๋‹ค.

	hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
		  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
		  NULL,(HMENU)NULL,hInstance,NULL);
	ShowWindow(hWnd,nCmdShow);

์—ฌ๊ธฐ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋ฉด ํ™”๋ฉด์— ์œˆ๋„์šฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ด ํ›„๋ถ€ํ„ฐ๋Š” ๋ฉ”์‹œ์ง€ ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘๋˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ์ž์™€ ์œˆ๋„์šฐ์ฆˆ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ƒํ˜ธ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋ฉฐ ์‹คํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ์œˆ๋„์šฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ•˜์ž.

์ด ๊ณผ์ •์€ ๊ฑฐ์˜ ์ •ํ˜•ํ™”๋œ ๊ณผ์ •์ด๋ฏ€๋กœ ๊ณ„์† ์œˆ๋„์šฐ์ฆˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณต๋ถ€ํ•  ์ƒ๊ฐ์ด ์žˆ๋‹ค๋ฉด ์•”๊ธฐํ•  ๋งŒ๋„ ํ•˜๋‹ค. ์ด ๊ณผ์ •์ด WinMain์—์„œ ๋ฐ˜๋“œ์‹œ ํ•ด ์ฃผ์–ด์•ผ ํ•  ๊ณผ์ •์ด๋ฉฐ ๊ทธ ์ด์™ธ์˜ ์ฒ˜๋ฆฌ๋Š” ํ•ด ์ฃผ์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค.

 

์œˆ๋„์šฐ์ฆˆ๋Š” ์„ธ๊ฐ€์ง€ ๋™์  ์—ฐ๊ฒฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ค๋Š” KERNEL, ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค์™€ ์œˆ๋„์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” USER ๊ทธ๋ฆฌ๊ณ 

ํ™”๋ฉด ์ฒ˜๋ฆฌ์™€ ๊ทธ๋ž˜ํ”ฝ์„ ๋‹ด๋‹นํ•˜๋Š” GDI์ด๋‹ค. 

์ถœ๋ ฅ์„ ํ•˜๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” GDI(Graphic Device Interface)๋ชจ๋“ˆ์— ํŠน๋ณ„ํžˆ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค. ํ™”๋ฉด์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๋ชจ๋“  ๊ธ€์ž์™€ ๊ทธ๋ฆผ์€ GDI๋ฅผ ํ†ตํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

DC (Device Context)๋ž€ ์ถœ๋ ฅ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด์ด๋ฉฐ GDI๋ชจ๋“ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค. ์–ด๋–ค ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€, ์„ ์˜ ์ƒ‰์ƒ๊ณผ ๊ตต๊ธฐ, ์ฑ„์›€ ๋ฌด๋Šฌ์™€ ์ƒ‰์ƒ, ์ถœ๋ ฅ๋ฐฉ๋ฒ• ๋“ฑ๋“ฑ์ด ๋ชจ๋‘ ์ถœ๋ ฅ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค์ด๋‹ค. ํ™”๋ฉด ์ถœ๋ ฅ์— DC๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ด๊ฐ€ ์œ„ํ•ด์„œ ๋ช‡๊ฐ€์ง€ ์ƒํ™ฉ์„ ๋“ค์–ด๋ณด์ž

 

 

์ƒํ™ฉ1

์šฐ์„  ํ™”๋ฉด์— ์„ ์„ ๊ธ‹๋Š” LineTo๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์„ ์„ ๊ธ‹๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œํ•œ ์‹œ์ž‘์ ๊ณผ ๋์ ์˜ ์ขŒํ‘œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ƒ์‹์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด LineTo(x1, y1, x2, y2)์™€ ๊ฐ™์€ ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„ ์„ ๊ทธ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์กฐ๊ธˆ ๋” ์ƒ๊ฐ ํ•ด๋ณด๋ฉด ๋‘ ์ ์˜ ์ขŒํ‘œ์™ธ์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค. ์„ ์˜ ์ƒ‰์ƒ, ๊ตต๊ธฐ, ๋ชจ์–‘, ์„ ์„ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•, ์ขŒํ‘œ๊ฐ’์„ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์˜ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ๋น„๋กœ์„œ ์™„๋ฒฝํ•œ ์„ ์„ ๊ทธ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์ •๋ณด๋“ค์„ ๋ชจ๋‘ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ค€๋‹ค๋ฉด LineToํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ด ๋ ๊ฒƒ์ด๋‹ค. 

LineTo(StartX, StartY, EndX, EndY, Color, Width, Shape, ROP, mode,......)

 ์ด๋Ÿฐ ์ •๋ณด๋“ค์„ ์ผ์ผ์ด ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘๊ณ  ๊ทธ ๊ฐ’๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•˜๊ณ  ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ •๋ณด๋“ค์„ ๋ชจ๋‘ ๋ชจ์•„ DC๋ผ๋Š” ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜์—์„œ๋Š” DC์˜ ํ•ธ๋“ค์„๋งŒ์„ ๋„˜๊ฒจ๋ฐ›์•„ ๊ทธ๋ฆฌ๊ธฐ์— ํ•„์š”ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” ๋ชจ๋‘ DC์— ์ •์˜ ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค. 

์ด๋Ÿฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด LineTo ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ด์งˆ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

LineTo(hdc, x, y)

 

์ƒํ™ฉ2

DC๊ฐ€ ํ•„์š”ํ•œ ๋˜๋‹ค๋ฅธ ์˜ˆ๋Š” ์œˆ๋„์šฐ์ฆˆ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๊ธฐ ํ•จ์ˆ˜์— ์˜ํ•ด ์‹ค์ œ ์ถœ๋ ฅ๋˜๋Š” ๋ชจ์–‘์€ ์ฃผ๋ณ€ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. LineTo(hdc, 100, 100)์„ ํ˜ธ์ถœ ํ–ˆ์„๋•Œ ํ™”๋ฉด์ƒ์˜ (100, 100)๊นŒ์ง€์˜ ์ ์„ ์ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ๋กœ ์ ์ด ์ฐํ˜€์•ผ ํ•  ๋ถ€๋ถ„์€ ํ˜„์žฌ ์œˆ๋„์šฐ๊ฐ€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ์˜์—ญ์ด ๋˜์–ด์•ผํ•œ๋‹ค. 

๋˜ํ•œ 2๊ฐœ์˜ ์œˆ๋„์šฐ๊ฐ€ ์žˆ์„๋Œ€ ํ™”๋ฉด์— ๊ทธ๋ ค์ ธ์•ผ ํ• ๋ถ€๋ถ„์€ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ์œˆ๋„์šฐ์˜์—ญ์—์„œ๋งŒ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ์•ผ ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ์™ธ์—๋„ DC์˜ ์กด์žฌ ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” DC๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€ ์ •๋„๋งŒ ์ง๊ฐ์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

FrameWork  (1) 2022.09.07
DC์˜ ์ •๋ณด์ˆ˜์ •  (0) 2022.09.06
์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ํ…œํ”Œ๋ฆฟ  (0) 2022.08.18
ํ•จ์ˆ˜  (0) 2022.08.18
๋ช…๋ น๋ฌธ ๋ฐ ํ๋ฆ„ ์ œ์–ด  (0) 2022.08.18

๋Œ“๊ธ€