4-3.À©µµ¿ì ºÐÇÒ

¼Ò¸®±îÁö ³ª±â ½ÃÀÛÇßÀ¸´Ï ÀÌÁ¦ ±âº» ¿¹Á¦ Á¤µµ´Â µÈ´Ù. ±×·¯³ª 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);

}

 

À̹ÌÁö°¡ ½ºÅ×ÀÌÁö·Î Ãâ·ÂµÈ´Ù. ½ÇÇàÇØ º¸ÀÚ.

¿ÞÂÊ°ú ¾Æ·¡ÂÊ¿¡ ÀÛÀº À©µµ¿ì°¡ »ý±â¸ç ¸ÞÀÎ À©µµ¿ìÀÇ Å©±â¸¦ ¹Ù²Ù¸é µû¶ó ¿òÁ÷ÀδÙ. ¾ÆÁ÷ Äڵ尡 ¾ø¾î µ¿ÀÛÀº ÇÏÁö ¾Ê´Âµ¥ ¿©±â¿¡µµ Äڵ带 Á¡Á¡ ä¿ö ³ª°¥ °ÍÀÌ´Ù.