¼Ò¸®±îÁö ³ª±â ½ÃÀÛÇßÀ¸´Ï ÀÌÁ¦ ±âº» ¿¹Á¦ Á¤µµ´Â µÈ´Ù. ±×·¯³ª UI°¡ ³Ê¹« ¾ø¾î Å×½ºÆ®Çϱ⠺ÒÆíÇÏ´Ù. â Å©±âµµ ÀÏÁ¤ÇÏÁö ¾Ê°í ÆÄÀÏÀÌ
Çϵå ÄÚµùµÇ¾î ÀÖ¾î µ¿¿µ»óÀ» ¹Ù²ã °¡¸ç Å×½ºÆ®Çϱ⠾î·Æ´Ù. ¸Ç³¯ ºÒ²É ³îÀ̸¸ º¸´Â °Íµµ Áö°ã°í ´õ °íÈÁú
¿µ»óÀÌ ÀÖ¾î¾ß Å×½ºÆ® °¡´ÉÇÏ´Ù. WM_CREATEÀÇ ÆÄÀÏ °æ·Î¸¦ ¼öÁ¤ÇÏ´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù.
OpenMovie(TEXT("c:\\mpstudy\\sexygirl.avi"));
ÄÚµ¦ »ó°ü¾øÀÌ Á¦¹ý Àß ¿¬´Ù. ±×·¯³ª ¸Å¹ø ÀÌ·¸°Ô Å×½ºÆ®ÇÒ ¼ö´Â ¾ø´Ù. ½ÇÇàÁß¿¡ ÆÄÀÏÀ» ¹Ù²ã¼ ¿¾î º¸ÀÚ. »ç¿îµå°¡ µé¾î °¬À¸´Ï º¼·ý Á¶Àýµµ
ÇÒ ¼ö ÀÖ¾î¾ß Çϴµ¥ UI°¡ ¾ø´Ù. ÆíÀÇ ±â´ÉÀ» ÀÛ¼ºÇÏ·Á¸é
»ç¿ëÀÚ¿Í »óÈ£ ÀÛ¿ëÇÒ ¼ö ÀÖ´Â UI°¡ ²À ÇÊ¿äÇÏ´Ù.
¸ÞÀÎ À©µµ¿ì¿¡¼ ¸ðµç°É ´Ù ÇÒ ¼ö ¾ø´Ù. Â÷Àϵ带 ¹èÄ¡ÇÏ¿© ¸ñÀû¿¡ ¸Â°Ô ȸéÀ» ºÐÇÒÇØ¾ß ÇÑ´Ù. ¼¼ °³ÀÇ Â÷Àϵå·Î
ºÐÇÒÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ÇÔ¼ö ¿øÇüÀ» ¼±¾ðÇÏ°í À©µµ¿ì ÇÚµéÀ» ¼±¾ðÇÑ´Ù.
LRESULT CALLBACK StageWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK PanelWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ListWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam);
HWND hPanel;
HWND hBtnOpen, hBtnPause, hStTime, hVolume;
HWND hBtnExit, hBtnFull, hBtnMax, hBtnMin;
HWND hStage;
HWND hListWnd;
À©µµ¿ìÀÇ ¹èÄ¡ »óŸ¦ Á¶Á¤ÇÒ »ó¼ö¿Í ¿É¼Ç º¯¼ö°¡ ¸¹ÀÌ ÇÊ¿äÇÏ´Ù. »ó¼ö´Â
¿©·¯ ±ºµ¥¼ ÂüÁ¶ÇϹǷΠº¯¼öº¸´Ù ´õ ¾ÕÂÊ¿¡ ¼±¾ðÇÑ´Ù.
// »ó¼ö Á¤ÀÇ
enum {
ID_BTNOPEN
= 1, ID_BTNPAUSE, ID_STTIME, ID_SLVOLUME,
ID_BTNEXIT,
ID_BTNFULL, ID_BTNMAX, ID_BTNMIN
};
const int PanelHeight = 60;
Æгγ»ÀÇ ÄÁÆ®·Ñ IDÀÌ´Ù.
#defineÀ¸·Î Á¤ÀÇÇÏ´Â °ÍÀÌ º¸ÅëÀÌÁö¸¸ °£´ÜÇÏ°Ô ¿°Å »ó¼ö·Î Á¤ÀÇÇß´Ù. ¾îÂ÷ÇÇ °ãÄ¡Áö¸¸
¾ÊÀ¸¸é µÈ´Ù. ÆгÎÀÇ ³ôÀÌ´Â 60À¸·Î °íÁ¤µÇ¾î ÀÖ´Ù. º¯°æ °¡´ÉÇÑ °ªÀº sOption ±¸Á¶Ã¼¿¡ ¼±¾ðÇÑ´Ù.
struct sOption {
bool
listShow = true;
bool
listRight = false;
int
listWidth = 300;
int
gap = 4;
};
sOption op;
¸ñ·Ï º¸À̱⠿©ºÎ, ¿À¸¥ÂÊ ¹èÄ¡ ¿©ºÎ, ¸®½ºÆ®ÀÇ Æø, ¸®½ºÆ®¿Í ½ºÅ×ÀÌÁö¿ÍÀÇ °£°Ý µîÀÌ´Ù. ÀÌ °ª¿¡ µû¶ó À©µµ¿ì¸¦ ¹è¿ÇÑ´Ù.
void Relayout(int width, int height) {
int
lwidth, lgap;
if
(op.listShow) {
lwidth
= op.listWidth;
lgap
= op.gap;
ShowWindow(hListWnd,
SW_SHOW);
}
else {
lwidth
= 0;
lgap
= 0;
ShowWindow(hListWnd,
SW_HIDE);
}
if
(op.listRight) {
MoveWindow(hListWnd,
width - lwidth, 0, lwidth, height, TRUE);
MoveWindow(hStage,
0, 0, width - lwidth - lgap, height - PanelHeight, TRUE);
MoveWindow(hPanel,
0, height - PanelHeight, width - lwidth, PanelHeight, TRUE);
}
else {
MoveWindow(hListWnd,
0, 0, lwidth, height, TRUE);
MoveWindow(hStage,
lwidth + lgap, 0, width - lwidth - lgap, height - PanelHeight, TRUE);
MoveWindow(hPanel,
lwidth, height - PanelHeight, width - lwidth, PanelHeight, TRUE);
}
}
WinMain¿¡¼ À©µµ¿ì Ŭ·¡½º¸¦ Á¤ÀÇÇÑ´Ù.
WndClass.hbrBackground
= (HBRUSH)(COLOR_BTNFACE + 1);
....
WndClass.hCursor
= LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground
= (HBRUSH)(COLOR_WINDOW + 1);
WndClass.lpfnWndProc
= (WNDPROC)StageWndProc;
WndClass.lpszClassName
= TEXT("Stage");
WndClass.style
= CS_DBLCLKS;
RegisterClass(&WndClass);
WndClass.hCursor
= LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground
= (HBRUSH)(COLOR_BTNFACE + 1);
WndClass.lpfnWndProc
= (WNDPROC)PanelWndProc;
WndClass.lpszClassName
= TEXT("Panel");
WndClass.style
= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
RegisterClass(&WndClass);
WndClass.hCursor
= LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground
= (HBRUSH)(COLOR_BTNFACE + 1);
WndClass.lpfnWndProc
= (WNDPROC)ListWndProc;
WndClass.lpszClassName
= TEXT("MediaList");
WndClass.style
= CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
Â÷Àϵ尡 µé¾î°¨À¸·Î½á ¸ÞÀÎ À©µµ¿ìÀÇ ¹è°æ »ö»óµµ Èò»öº¸´Ù ÄÁÆ®·Ñ »ö»óÀ¸·Î º¯°æÇÏ´Â °ÍÀÌ Àß ¾î¿ï¸°´Ù. COLOR_BTNFACE »ö»óÀ¸·Î º¯°æÇÏ°í 3°³ÀÇ À©µµ¿ì Ŭ·¡½º¸¦
Á¤ÀÇÇß´Ù. WM_CREATE¿¡¼ Â÷Àϵå À©µµ¿ì¸¦ »ý¼ºÇÏ°í
WM_SIZE¿¡¼ ¹èÄ¡ÇÑ´Ù.
case
WM_CREATE:
hWndMain
= hWnd;
InitCommonControls();
QueryPerformanceFrequency(&frequency);
CloseHandle(CreateThread(NULL,
0, CallbackThread, NULL, 0, &CallbackThreadID));
hStage
= CreateWindow(TEXT("Stage"), NULL, WS_CHILD | WS_VISIBLE |
WS_CLIPCHILDREN,
0,
0, 0, 0, hWnd, (HMENU)NULL, g_hInst, NULL);
hPanel
= CreateWindow(TEXT("Panel"), NULL, WS_CHILD | WS_VISIBLE |
WS_CLIPCHILDREN,
0,
0, 0, 0, hWnd, (HMENU)NULL, g_hInst, NULL);
hListWnd
= CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("MediaList"), NULL,
WS_CHILD
| WS_VISIBLE | WS_CLIPCHILDREN,
0,
0, 0, 0, hWnd, (HMENU)NULL, g_hInst, NULL);
OpenMovie(TEXT("c:\\mpstudy\\fire.avi"));
return
0;
case
WM_SIZE:
Relayout(LOWORD(lParam),
HIWORD(lParam));
return
0;
´Ù½Ã ±×¸®´õ¶óµµ Â÷ÀÏµå ¿µ¿ªÀº Á¦¿ÜÇϵµ·Ï WS_CLIPCHILDREN ½ºÅ¸ÀÏÀ»
ÁÖ¾ú´Ù. °¢ Â÷ÀϵåÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù.
LRESULT CALLBACK StageWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam) {
switch
(iMessage) {
case
WM_CREATE:
return
0;
}
return(DefWindowProc(hWnd,
iMessage, wParam, lParam));
}
LRESULT CALLBACK PanelWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam) {
HDC
hdc;
PAINTSTRUCT
ps;
switch
(iMessage) {
case
WM_CREATE:
hBtnExit
= CreateWindow(TEXT("button"), TEXT("X"), WS_CHILD |
WS_VISIBLE,
0,
0, 0, 0, hWnd, (HMENU)ID_BTNEXIT, g_hInst, NULL);
hBtnFull
= CreateWindow(TEXT("button"), TEXT("F"), WS_CHILD |
WS_VISIBLE,
0,
0, 0, 0, hWnd, (HMENU)ID_BTNFULL, g_hInst, NULL);
hBtnMax
= CreateWindow(TEXT("button"), TEXT("M"), WS_CHILD |
WS_VISIBLE,
0,
0, 0, 0, hWnd, (HMENU)ID_BTNMAX, g_hInst, NULL);
hBtnMin
= CreateWindow(TEXT("button"), TEXT("_"), WS_CHILD |
WS_VISIBLE,
0,
0, 0, 0, hWnd, (HMENU)ID_BTNMIN, g_hInst, NULL);
hBtnOpen
= CreateWindow(TEXT("button"), TEXT("Open"), WS_CHILD |
WS_VISIBLE,
10,
5, 80, 25, hWnd, (HMENU)ID_BTNOPEN, g_hInst, NULL);
hBtnPause
= CreateWindow(TEXT("button"), TEXT("Pause"), WS_CHILD |
WS_VISIBLE,
100,
5, 80, 25, hWnd, (HMENU)ID_BTNPAUSE, g_hInst, NULL);
hStTime
= CreateWindow(TEXT("static"), TEXT(""), WS_CHILD |
WS_VISIBLE,
200,
10, 120, 25, hWnd, (HMENU)ID_STTIME, g_hInst, NULL);
CreateWindow(TEXT("static"),
TEXT("Volume"), WS_CHILD | WS_VISIBLE,
330,
10, 60, 25, hWnd, (HMENU)-1, g_hInst, NULL);
hVolume
= CreateWindow(TRACKBAR_CLASS, NULL, WS_CHILD | WS_VISIBLE,
390,
5, 100, 25, hWnd, (HMENU)ID_SLVOLUME, g_hInst, NULL);
return
0;
case
WM_PAINT:
hdc
= BeginPaint(hWnd, &ps);
EndPaint(hWnd,
&ps);
return
0;
case
WM_SIZE:
MoveWindow(hBtnExit,
LOWORD(lParam) - 35, 5, 25, 25, TRUE);
MoveWindow(hBtnFull,
LOWORD(lParam) - 65, 5, 25, 25, TRUE);
MoveWindow(hBtnMax,
LOWORD(lParam) - 95, 5, 25, 25, TRUE);
MoveWindow(hBtnMin,
LOWORD(lParam) - 125, 5, 25, 25, TRUE);
return
0;
}
return(DefWindowProc(hWnd,
iMessage, wParam, lParam));
}
LRESULT CALLBACK ListWndProc(HWND hWnd, UINT
iMessage, WPARAM wParam, LPARAM lParam) {
switch
(iMessage) {
case
WM_CREATE:
return
0;
}
return(DefWindowProc(hWnd,
iMessage, wParam, lParam));
}
½ºÅ×ÀÌÁö¿Í ¸ñ·ÏÀº ºñ¾î ÀÖ°í Æгθ¸ Â÷Àϵå ÄÁÆ®·ÑÀ» »ý¼ºÇÏ°í WM_SIZE¿¡¼
¹èÄ¡ÇÑ´Ù. ÀÌÁ¦ À̹ÌÁö´Â ½ºÅ×ÀÌÁö¿¡ Ãâ·ÂÇÑ´Ù. ½º·¹µå¿¡¼ DC¸¦ ¾ò´Â ´ë»ó¸¸ ¹Ù²Ù¸é µÈ´Ù.
DWORD WINAPI PlayThread(LPVOID para) {
hdc
= GetDC(hStage);
....
ReleaseDC(hStage,
hdc);
}
À̹ÌÁö°¡ ½ºÅ×ÀÌÁö·Î Ãâ·ÂµÈ´Ù. ½ÇÇàÇØ º¸ÀÚ.
¿ÞÂÊ°ú ¾Æ·¡ÂÊ¿¡ ÀÛÀº À©µµ¿ì°¡ »ý±â¸ç ¸ÞÀÎ À©µµ¿ìÀÇ Å©±â¸¦ ¹Ù²Ù¸é µû¶ó ¿òÁ÷ÀδÙ. ¾ÆÁ÷ Äڵ尡 ¾ø¾î µ¿ÀÛÀº ÇÏÁö ¾Ê´Âµ¥ ¿©±â¿¡µµ Äڵ带 Á¡Á¡ ä¿ö ³ª°¥ °ÍÀÌ´Ù.