- Window Creation Fundamentals
- °³¿ä
- À©µµ¿ì »ý¼º
- CreateWindow ÇÔ¼ö
- ÄÁÆ®·Ñ Ŭ·¡½ºÀÇ µî·Ï
- ½´ÆÛŬ·¡½Ì
- TWinControl Ŭ·¡½º¸¦ »ç¿ëÇØ¼ À©µµ¿ì ¸¸µé±â
- The CreateParams Function CreateParams ÇÔ¼ö
- CreateWnd ÇÔ¼ö
- CreateWindowHandle ÇÔ¼ö
- TWinControl Ŭ·¡½º·Î ½´ÆÛŬ·¡½ÌÇϱâ
- À©µµ¿ì »ý¼ºÀÇ Ä¿½ºÅ͸¶ÀÌÁî
- Style °ú ExStyle ´Ù·ç±â
- WindowClass ¸â¹ö ´Ù·ç±â
- WndParent ¸â¹ö ´Ù·ç±â
1 Window Creation Fundamentals
2 °³¿ä
À©µµ¿ìÁî API ·¹ÆÛ·±½º¿¡¼ "À©µµ¿ì(window)" ¶õ ´Ü¾î¸¦ ºÃÀ» ¶§, VCL ÀÇ ÆûÀÌ »ý°¢³¯ °ÍÀÌ´Ù. ½ÇÁ¦·Î ÆûÀº ¾îÇø®ÄÉÀ̼ǿ¡¼ »ç¿ëµÇ´Â À©µµ¿ìÀÇ ÇÑ Á¾·ùÀÌ´Ù. °ð ¾Ë°Ô µÇ°ÚÁö¸¸, TWinControl ¿¡¼ ÆÄ»ýµÈ ÄÁÆ®·ÑµéÀº À©µµ¿ì Çü½ÄÀÇ ÄÁÆ®·ÑÀÌ´Ù. ¿¹¸¦ µé¾î¼, Handle ¼Ó¼ºÀº TWinControl Ŭ·¡½º¿¡¼ °¡Àå Áß¿äÇÑ ¼Ó¼ºÀε¥ ÀÌ °ÍÀº ¾Æ¹«·¸°Ô ¼³°èÇØ¼ ±×·± °ÍÀÌ ¾Æ´Ï¶ó ¿ÀÈ÷·Á À©µµ¿ì Çü½ÄÀÇ ÄÁÆ®·ÑÀÓÀ» È®½ÇÇÏ°Ô ³ªÅ¸³»´Â °ÍÀÌ´Ù. ÀÌ ÇÚµé ¼Ó¼ºÀº À©µµ¿ìÀÇ ½ÇÁ¦ ¸Þ¸ð¸® ºí·°À» ³ªÅ¸³»´Â Ãß»óÈ ·¹À̾î·Î »ç¿ëµÇ°í API ÇÔ¼öµéÀº ÀÌ ÇÚµéÀ» ÀÌ¿ëÇØ¼ À©µµ¿ìÀÇ ½ÇÁ¦ ¸Þ¸ð¸® ºí·°À» ´Ù·ê ¼ö ÀÖ´Â °ÍÀÌ´Ù. "From Message to Events" ÀÇ ¹®¼¿¡¼ SendMessage API ÇÔ¼ö¸¦ »ç¿ëÇßµé ¶§µµ, ÀÌ ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ¿¡ ¸Þ¼¼Áö¸¦ ¹ÞÀ» À©µµ¿ìÀÇ ÇÚµéÀ» Àü´ÞÇß¾ú´Ù. »ç½Ç, À©µµ¿ì Çü½ÄÀÇ ÄÁÆ®·ÑÀ» ´Ù·ç´Â °ÅÀÇ ¸ðµç API ÇÔ¼öµéÀº À©µµ¿ì ÇÚµéÀ» ÇÊ¿ä·ÎÇÑ´Ù. ÇÏÁö¸¸ VCL À» »ç¿ëÇÏ¸é °ÅÀÇ ´ëºÎºÐ ÀÌ À©µµ¿ì ÇÚµé(Handle) ¼Ó¼ºÀ» »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù. ±×·¯³ª VCL ÀÌ ¸ðµç À©µµ¿ì Á¶ÀÛ API ÇÔ¼ö¸¦ Áö¿øÇÏ´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ °¡²û ¾µÀϵµ ÀÖ´Ù.
TWinControl Ŭ·¡½º´Â À©µµ¿ìÁî API ¿Í À©µµ¿ì Çü½ÄÀÇ ¸ðµç VCL ÄÁÆ®·ÑÀ» ¿¬°á½ÃÄÑ ÁÖ´Â Á¢ÂøÁ¦°¡ µÈ´Ù. ±×·¸±â ¶§¹®¿¡, TWinControl À» ÀÌÇØÇϱâ À§Çؼ´Â, ¸ÕÀú API °üÁ¡¿¡¼ À©µµ¿ì »ý¼º °úÁ¤À» ÀÌÇØÇØ¾ßÇÑ´Ù. "From Message to Event" ½Ã¸®ÁîÀÇ ¹®¼¿¡¼ ¸Þ¼¼Áö¿Í À̺¥Æ®¿¡ ´ëÇØ¼ ¸î¸î À©µµ¿ìÁî API ¿Í VCL À» ¿¬°áÇØ º¸¾ÒÁö¸¸ ÀÌ ¹®¼¿¡¼´Â TWinControl Ŭ·¡½º¿Í À©µµ¿ì »ý¼º °úÁ¤ÀÇ API µéÀ» ¿¬°á½ÃÄÑ º¼ °ÍÀÌ´Ù.
3 À©µµ¿ì »ý¼º
´ëºÎºÐÀÇ ¾îÇø®ÄÉÀ̼ǵéÀº »ç¿ëÀÚ¿Í Á¤º¸¸¦ ¼·Î ÁÖ°í¹Þ±â À§Çؼ À©µµ¿ìÁî Çü½ÄÀ¸·Î ¸¸µé¾îÁø´Ù. È®½ÇÈ÷, À©µµ¿ì¶ó´Â ºñÁÖ¾ó ¿ÀºêÁ§Æ®¸¦ ÀÌ¿ëÇØ¼ »ç¿ëÀÚ¿Í ¾îÇø®ÄÉÀÌ¼Ç °£¿¡ Á¤º¸¸¦ ÁÖ°í ¹ÞÀ¸¸é Á¤¸» Æí¸®ÇÏ´Ù. ¾î¶² °æ¿ì¿¡´Â, À©µµ¿ì°¡ »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ µéÀ̰í, ¾î¶² ¶§¿¡´Â Á¤º¸¸¦ ¾Ë·ÁÁִµ¥ »ç¿ëµÈ´Ù. ÀÌ·± ¾ê±â´Â ±×·¡ÇÈÄà À¯Àú ÀÎÅÍÆäÀ̽º(GUI) °³ÀßÀڵ鿡°Ô´Â ¸ðµÎ´Ù ¾Ë°í ÀÖ´Â µûºÐÇÑ ¿¾ À̾߱âÀÏ »ÓÀÌÁö¸¸ ÄÜ¼Ö ¶Ç´Â ÅØ½ºÆ® ±â¹ÝÀÇ ¾îÇø®ÄÉÀ̼Ǹ¸À» ÁÖ·Î ¸¸µå´Â °³¹ßÀڵ鿡°Ô´Â °¨Ä¥ ¸À ³ª´Â ¾ê±â°Å¸®°¡ µÈ´Ù. ¶ÇÇÑ, VCL Àº À©µµ¿ì »ý¼º °úÁ¤ÀÇ ´ëºÎºÐÀ» ¼Ó¿¡ °¨Ãß°í Àֱ⠶§¹®¿¡, ¼÷·ÃµÈ C++ ºô´õ °³¹ßÀڵ鵵 À©µµ¿ì¸¦ Ä¿½ºÅ͸¶ÀÌÁî ÇÒ ¶§ ¶Ç´Â ¹®Á¦¸¦ ÇØ°á ÇÒ ¶§ ¸¹Àº ¾î·Á¿òÀ» °Þ´Â´Ù. ÀÌ·± ÀÌÀ¯·Î, ÀÌ ¹®¼¿¡¼´Â À©µµ¿ìÁî API ·Î À©µµ¿ì¸¦ »ý¼ºÇÏ´Â °úÁ¤À» ¼³¸íÇÏ°í ³ª¼, VCL ÀÌ ¾î¶»°Ô À©µµ¿ì »ý¼º °úÁ¤À» Æ÷ÀåÇØ ³õ¾Ò´ÂÁö ÇϳªÇϳª¾¿ ¹þ°Üº¼ °ÍÀÌ´Ù.
3.1 CreateWindow ÇÔ¼ö
¸ðµç À©µµ¿ì Çü½ÄÀÇ ÄÁÆ®·ÑµéÀº CreateWindow API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¸¸µé ¼ö ÀÖ´Ù. API ÀÇ ±¸ÇöÀº ¸ðµç ÄÁÆ®·ÑµéÀÌ À©µµ¿ì Çü½ÄÀÇ ÄÁÆ®·ÑÀε¥ ºñÁê¾óÇÑ°Ô Çϳªµµ ¾ø´Ù. ±×·¡¼ ¸ðµç ÄÁÆ®·ÑµéÀ» Äڵ带 ÀÛ¼ºÇؼ ¸¸µé¾î¾ß ÇÑ´Ù. ¹öư, ¿¡µðÆ® ÄÁÆ®·Ñ °°Àº °£´ÜÇÑ ÄÁÆ®·ÑµéÀ» ¸¸µé±â À§Çؼ´Â CreateWindow() ÇÔ¼ö¸¦ Çѹø¸¸ È£ÃâÇØ ÁÖ¸é µÇ´Âµ¥ ÀÌ ÄÁÆ®·ÑµéÀº À©µµ¿ìÁî¿¡ ¹Ì¸® µî·ÏµÇ¾î ÀÖ´Â ÄÁÆ®·ÑÀ̱⠶§¹®ÀÌ´Ù. ¿ì¼±, CreateWindow ÇÔ¼ö¸¦ »ìÆìº¸ÀÚ.:
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
LPVOID lpParam
);
ÀÌ ÇÔ¼ö´Â 7°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·ÎÇϰí, »õ·Ó°Ô »ý¼ºµÈ À©µµ¿ìÀÇ ÇÚµéÀ» ¹ÝȯÇÑ´Ù. ù ÀÎÀÚÀÎ lpClassName Àº ¸¸µé¾îÁú À©µµ¿ì Ŭ·¡½ºÀÇ À̸§(¹®ÀÚ¿)À» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ¿©±â¼ ÀÌ À©µµ¿ì Ŭ·¡½ºÀÇ À̸§Àº CreateWindow ÇÔ¼ö°¡ È£ÃâµÇ±â Àü¿¡ À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡ µî·ÏµÇ¾î ÀÖ¾î¾ßÇÑ´Ù. À©µµ¿ìÁî ¿î¿µÃ¼Á¦´Â CreateWindow() ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ¸ðµç À©µµ¿ì Ŭ·¡½ºÀÇ À̸§À» ¾ËÁö ¸øÇϸç ÇØ´ç Ŭ·¡½ºÀÇ À©µµ¿ì¸¦ ¾î¶»°Ô ¸¸µé¾î¾ßÇÏ´ÂÁöµµ ¸ð¸¥´Ù. »ç½Ç, À©µµ¿ìÁî API ´Â ƯÁ¤ Á¾·ùÀÇ ÄÁÆ®·ÑµéÀ» ¿î¿µÃ¼Á¦¿¡ ¹Ì¸® µî·ÏÇØ ³õ¾Ò±â ¶§¹®¿¡ CreateWindow() ÇÔ¼ö¸¸ È£ÃâÇØ¼ À©µµ¿ì ÄÁÆ®·ÑÀ» ¸¸µé ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÀÌ Æ¯Á¤ À©µµ¿ì ÄÁÆ®·ÑµéÀ» Ç¥ÁØÄÁÆ®·Ñ, °øÅëÄÁÆ®·ÑÀ̶ó°í ÇÑ´Ù.
3.2 ÄÁÆ®·Ñ Ŭ·¡½ºÀÇ µî·Ï
À©µµ¿ìÁî API ´Â ¿î¿µÃ¼Á¦¿¡ ¹Ì¸® µî·ÏµÈ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ Á¦°øÇϱ⠶§¹®¿¡ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ ´Ù½Ã µî·ÏÇÏÁö ¾Ê°í ƯÁ¤ ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÄÁÆ®·ÑµéÀº API ÀÇ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ¼ºñ½ºÀÇ ÀϺκÐÀ¸·Î À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡ Æ÷ÇԵǾî ÀÖ´Ù. ¹öư, ¿¡µðÆ® ÄÁÆ®·Ñ(edit control), ½ºÅÂÆ½ ÄÁÆ®·Ñ(static control), ÄÞº¸¹Ú½º(combo box), ¸ñ·Ï ¹Ú½º(list box) ¿Í °°Àº Ç¥ÁØ ÄÁÆ®·ÑÀº ¿î¿µÃ¼Á¦°¡ ½ÃÀÛµÉ ¶§ ¹Ì¸® µî·ÏµÈ´Ù. ¿¹¸¦ µé¾î¼, ¹öưÀ» »ý¼ºÇÏ·Á¸é CreateWindow() ÇÔ¼öÀÇ lpClassName ÀÎÀÚ¿¡ "BUTTON" °ªÀ» ³Ñ°ÜÁֱ⸸ÇÏ¸é µÈ´Ù. Ç¥ÁØÄÁÆ®·Ñ°ú ºñ½ÁÇÑ °øÅëÄÁÆ®·ÑÀÌ Àִµ¥ ¸ñ·Ïºä(list view), Æ®¸®ºä(tree view), Çì´õ ÄÁÆ®·Ñ(header control), ÅÇ ÄÁÆ®·Ñ(tab control), Åø¹Ù(toolbar) ÄÁÆ®·ÑÀ» °¡Áö°í ÀÖ´Ù. ÀÌ °øÅë ÄÁÆ®·ÑÀº InitCommonControlEx() API ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ¿î¿µÃ¼Á¦¿¡ µî·ÏµÈ´Ù. ±×·¸´Ù¸é »ç¿ëÀÚ ÄÁÆ®·ÑÀ» ¸¸µé°í ½ÍÀ» ¶§´Â ¾î¶»°Ô ÇØ¾ßÇÒ±î? ¿ì¼±, »ç¿ëÀÚ ÄÁÆ®·ÑÀÇ Å¬·¡½º¸¦ RegisterClass() API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¿î¿µÃ¼Á¦¿¡ µî·ÏÇØ¾ßÇÑ´Ù.
ATOM RegisterClass(const WNDCLASS *lpWndClass);
RegisterClass() ÇÔ¼ö´Â ÇѰ³ÀÇ ÀÎÀÚ¸¸ ¹Þ´Âµ¥, À©µµ¿ì Ŭ·¡½ºÀÇ ¼Ó¼ºÀ» Á¤ÀÇÇÏ´Â WNDCLASS ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍÀÌ´Ù. WNDCLASS ±¸Á¶Ã¼´Â ¾Æ·¡Ã³·³ Á¤ÀǵǾî ÀÖ´Ù.
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;
WNDCLASS ±¸Á¶Ã¼ÀÇ ¸â¹ö µ¥ÀÌŸ Áß ¸î°³´Â Àͼ÷ÇÒÅÙµ¥, ¿¹¸¦ µé¾î lpfnWndProc Àº À©µµ¿ì ÇÁ·Î½ÃÁ®ÀÇ Æ÷ÀÎÅÍÀ̰í, hIcon°ú hCursor Àº À©µµ¿ì°¡ »ç¿ëÇÒ ±âº» ¾ÆÀÌÄܰú ¸¶¿ì½º Ä¿¼ÀÇ ÇÚµéÀÌ´Ù. hbrBackground ´Â À©µµ¿ìÀÇ ¹è°æÀ» Ä¥ÇÒ¶§ »ç¿ëÇÏ´Â ºê·¯½¬ÀÇ ÇÚµéÀ̰í, °¡Àå Áß¿äÇÑ ¸¶Áö¸· µ¥ÀÌŸ ¸â¹öÀÎ lpszClassName Àº À©µµ¿ìÀÇ Å¬·¡½º À̸§À» Á¤ÀÇÇÑ´Ù.( ¿¹: "TForm1" )
WNDCLASS ±¸Á¶Ã¼°¡ ¾Ë¸Â°Ô ÃʱâÈ µÇ¸é, ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¸¦ RegisterClass() ÇÔ¼öÀÇ ÀÎÀÚ·Î Àü´ÞÇÑ´Ù. ÀÌÁ¦, "TMyForm" ÀÎ »õ·Î¿î À©µµ¿ì¸¦ »ý¼ºÇÏ´Â ¿¹Á¦¸¦ »ìÆìº¸ÀÚ. ¸ñ·Ï 2.0Àº ÀÌ ¿¹Á¦ÀÇ ÄÚµå´Ù.
¸ñ·Ï 2.0
//----------------------------------------------------------------------
#include <windows.h>
//----------------------------------------------------------------------
// our new window class name
const char NewClassName[] = "TMyForm";
//----------------------------------------------------------------------
// main window procedure
LRESULT CALLBACK WndProc(HWND HWnd, unsigned int Msg, WPARAM WParam, LPARAM LParam)
{
// this window will actually do no special processing
// except terminate the application when destroyed
switch (Msg)
{
case WM_DESTROY:
{
// will place WM_QUIT in our message queue
// (strictly speaking, the QS_QUIT flag)
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(HWnd, Msg, WParam, LParam);
}
//----------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(WNDCLASS));
// initialize the WNDCLASS structure
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = WndProc;
wc.hInstance = HInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
wc.lpszClassName = NewClassName;
// register our new class of window
if (RegisterClass(&wc))
{
// once registered, we are free to create the window
HWND HWnd = CreateWindow(NewClassName, "MyForm1",
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, HInstance, NULL);
if (HWnd)
{
// show the new window
ShowWindow(HWnd, nCmdShow);
UpdateWindow(HWnd);
// main message pump
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
//----------------------------------------------------------------------
¸ñ·Ï 2.0 ¿¡ ÀÖ´Â WinMain ÇÔ¼ö´Â VCL ÀÌ ¸¸µé¾î ÁØ WinMain ÇÔ¼ö( "From Message to Events" ¹®¼¿¡¼ ¸ñ·Ï 1.4 ÀÇ ¼Ò½ºÄÚµå )¿Í ¾ÆÁÖ ¶È°°Áö¸¸ TMyForm Àº »õ·Î¿î À©µµ¿ì Ŭ·¡½ºÀÌ°í ¹Ì¸® µî·ÏµÈ Ŭ·¡½º°¡ ¾Æ´Ï±â ¶§¹®¿¡ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ ¸¸µé¾îÁà¾ß ÇÑ´Ù. ÀÌ À©µµ¿ì ÇÁ·Î½ÃÁ®¿¡ TMyForm À©µµ¿ìÀÇ Çൿ°ú ¼Ó¼ºÀ» Á¤ÀÇÇϴµ¥, ¸ñ·Ï 2.0 ¿¡ Á¤ÀÇµÈ À©µµ¿ì ÇÁ·Î½ÃÁ®(WndProc) ´Â DefWindowProc() API ÇÔ¼ö¸¸ È£ÃâÇÑ´Ù. ÀÌ ¸»Àº »õ·Î¿î Á¾·ùÀÎ TMyFrom À©µµ¿ì°¡ Ç¥ÁØ À©µµ¿ì¿Í ¶È°°ÀÌ ÇൿÇÑ´Ù´Â °ÍÀÌ´Ù.
¸ñ·Ï 2.0 ¿¡ Á¤ÀÇµÈ WinMain ÇÔ¼ö¸¦ º¸¸é, ±¸ÇöÀÌ ¼¼´Ü°è·Î µÇ¾î ÀÖ´Ù. ù ´Ü°è´Â, WNDCLASS ±¸Á¶Ã¼¸¦ ¼±¾ðÇϰí ÃʱâÈÇÑ´Ù. µÎ¹øÂ° ´Ü°è´Â, RegisterWindow() API ÇÔ¼ö¿¡ ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¸¦ Àü´ÞÇØ È£ÃâÇÑ´Ù. ¸¶Áö¸· ¼¼¹øÂ° ´Ü°è´Â Ŭ·¡½ºÀÇ µî·ÏÀÌ ¼º°øÇÑ ÈÄ¿¡, CreateWindow() ÇÔ¼ö¿¡ »õ·Ó°Ô µî·ÏµÈ Ŭ·¡½ºÀÇ À̸§À» lpClassName ÀÎÀÚ¿¡ Àü´ÞÇØ¼ È£ÃâÇÑ´Ù. ¸ðµç À©µµ¿ì ÄÁÆ®·ÑÀ» ¸¸µé±â À§Çؼ ÀÌ ¼¼´Ü°è¸¦ ¹Ýµå½Ã °ÅÃľßÇÑ´Ù.
È®½ÇÇϰÔ, ĸ½¶È µÈ °ÍÀÌ Çϳª ¾ø´Â ÀÌ °úÁ¤Àº ¾ÆÁÖ ±ÍÂú°í ¹ö±×°¡ ¹ß»ýÇÏ¸é ¹ß°ßÇϱ⵵ ¾î·Æ´Ù. ±×·¯³ª ÇູÇϰԵµ, TWinControl Ŭ·¡½º°¡ ÀÌ °úÁ¤ÀÇ ÀüºÎ¸¦ ĸ½¶È Çß°í ÀÌ¿¡ ´ëÇØ¼´Â ´ÙÀ½ ¼½¼Ç¿¡¼ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ¿ì¼±Àº CreateWindow() ÇÔ¼ö¿¡ ´ëÇØ¼ ´õ ¾Ë¾Æº¸ÀÚ.
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
LPVOID lpParam
);
µÎ¹øÂ° ÀÎÀÚÀÎ, lpWindowName Àº À©µµ¿ìÀÇ Ä¸¼ÇÀ» ³ª³ªÅ´ ¹®ÀÚ¿°ªÀÌ´Ù. C++ ºô´õ¿¡¼, ¾îÇø®ÄÉÀ̼ÇÀÇ Ã¹¹øÀç ÆûÀº lpWindowName ¿¡ "Form1" À̶õ ¹®ÀÚ¿ÀÌ ¼³Á¤µÈ´Ù. dwStyle ÀÎÀÚ´Â ¿©·¯°¡Áö À©µµ¿ìÀÇ ¼Ó¼ºÀ» ¼³Á¤Çϱâ À§Çؼ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î¼, WS_OVERLAPPED ½ºÅ¸ÀÏÀº Ç¥ÁØ Å¾·¹º§(top-level) À©µµ¿ì¸¦ ¸¸µé ¶§ »ç¿ëÇÏ´Àµ¥ TForm Ŭ·¡½º°¡ ±âº» ½ºÅ¸ÀÏ·Î »ç¿ëµÈ´Ù. WS_POPUP ½ºÅ¸ÀÏÀº ĸ¼Ç°ú °æ°è(border) °¡ ¾ø´Â À©µµ¿ì¸¦ ¸¸µé¾î ÁØ´Ù. ÀÌ¹Ì ¾Ë°í ÀÖÀ»Áö ¸ð¸£Áö¸¸, TForm::BorderStyle ¼Ó¼ºÀº À©µµ¿ìÀÇ ¿©·¯°¡Áö °æ°è(border) ½ºÅ¸ÀÏÀ» ¸¸µé ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ¶§ ÀÌ ¼Ó¼º¿¡ ¼³Á¤µÇ´Â °ªÀÌ dwStyle ÀÎÀÚ¿¡ Àü´ÞµÇ´Â °ÍÀÌ´Ù. ºñ½ÁÇϰÔ, x, y, nWidth, nHeight ÀÎÀÚ´Â ÆûÀÇ Top, Left, Width, Height ¼Ó¼ºÀÌ ¼³Á¤µÉ ¶§ ¼Ó¼º °ªÀÌ Àü´ÞµÇ´Â °ÍÀÌ´Ù. À©µµ¿ì°¡ ÀÚ½ÄÀ©µµ¿ì·Î ¸¸µé¾î Áø´Ù¸é, hWndParent ÀÎÀÚ°¡ À©µµ¿ìÀÇ ºÎ¸ð¸¦ °¡¸®Å°±â À§ÇØ »ç¿ëµÈ´Ù. ž·¹º§(top-level) À©µµ¿ì¿¡¼ ÀÌ °ªÀº µ¥½ºÅ©Å¾(¹ÙÅÁȸé)ÀÇ ÇÚµé·Î ¼³Á¤µÈ´Ù. ÀÌ ¶§, µ¥½ºÅ©Å¾(¹ÙÅÁȸé) À©µµ¿ìÀÇ ÇÚµéÀº hWndParent ¿¡ NULL °ªÀ» ¼³Á¤Çϰųª GetDesktopWindow() API ÇÔ¼ö¸¦ È£ÃâÇØ¼ ¾òÀ» ¼ö ÀÖ´Ù. TFrom Ŭ·¡½º´Â ÀÌ hWndParent ÀÇ °ªÀ¸·Î TApplication À©µµ¿ìÀÇ ÇÚµéÀ» ¼³Á¤ÇÑ´Ù. hMenu ÀÎÀÚ´Â À©µµ¿ìÀÇ ¸ÞÀÎ ¸Þ´ºÀÇ ÇÚµé·Î »ç¿ëµÈ´Ù. hInstance ÀÎÀÚ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ ÀνºÅϽº ÇÚµé·Î Àü¿ª º¯¼öÀÎ HInstance ¸¦ ÅëÇØ¼ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¸¶Áö¸· ÀÎÀÚÀÎ lpParam Àº "»ç¿ëÀÚ Á¤ÀÇ"ÀÇ Ãß°¡ Á¤º¸¸¦ ÀúÀåÇÒ ¶§ »ç¿ëÇÑ´Ù.
Áö±Ý±îÁö ¹Ì¸® µî·ÏµÈ Ŭ·¡½º°¡ ¹ÙÅÁÀÌ ¾Æ´Ñ »õ·Î¿î À©µµ¿ì Ŭ·¡¸¦ ¸¸µé¾î º¸¾Ò´Ù. Áö±ÝºÎÅÍ´Â ¿î¿µÃ¼Á¦¿¡ ¹Ì¸® µî·ÏµÈ Ŭ·¡½º¸¦ ¹ÙÅÁÀ¸·Î »õ·Î¿î À©µµ¿ì Ŭ·¡½º¸¦ ¸¸µé¾î ÁÖ´Â ½´ÆÛŬ·¡½Ì¿¡ ´ëÇØ¼ ¾Ë¾Æº¸ÀÚ. VCL ÀÇ TButton Ŭ·¡½º´Â »ç½Ç Ç¥ÁØ ÄÁÆ®·ÑÀÎ BUTTON À» ¹ÙÅÁÀ¸·Î »õ·Î¿î Ŭ·¡½º·Î ¸¸µé¾îÁø °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡, TButton °ú TWinControl Ŭ·¡½º´Â ½´ÆÛŬ·¡½ÌÀ» ¼öÇàÇÑ´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®ÀÇ Spy++ ÅøÀ» »ç¿ëÇØ¼, TButton ÀÇ ÀνºÅϽº¸¦ Á¶»çÇØ º¸¸é Ŭ·¡½º À̸§ÀÌ "BUTTON" ÀÌ ¾Æ´Ï¶ó "TButton" À¸·Î µÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
3.3 ½´ÆÛŬ·¡½Ì
À§¿¡¼ ¸»ÇßµíÀÌ, ½´ÆÛŬ·¡½Ì ±â¼úÀº ¹Ì¸® µî·ÏµÈ Ŭ·¡½º¸¦ ¹ÙÅÁÀ¸·Î »õ·Î¿î À©µµ¿ì Ŭ·¡½º¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ±×³É »õ·Ó°Ô À©µµ¿ì Ŭ·¡½º¸¦ ¸¸µé ¶§¿Í ºñ½ÁÇÏ°Ô ½´ÆÛŬ·¡½ÌÀ» Çϱâ À§Çؼµµ WNDCLASS ±¸Á¶Ã¼¸¦ ¼±¾ðÇÏ°í »õ·Î ¸¸µé Ŭ·¡½ºÀÇ Æ¯Â¡À¸·Î WNDCLASS ¸¦ ÃʱâÈÇØ¾ßÇÑ´Ù. Â÷ÀÌÁ¡Àº ºÎ¸ðŬ·¡½º·ÎºÎÅÍ WNDCLASS ÀÇ Á¤º¸¸¦ ¾ò±â À§Çؼ GetClassInfo() API ÇÔ¼ö¸¦ ¸ÕÀú È£ÃâÇÑ´Ù´Â °ÍÀÌ´Ù.
bool GetClassInfo(
HINSTANCE hInstance,
LPCTSTR lpClassName,
LPWNDCLASS lpWndClass
);
GetClassInfo() ÇÔ¼ö¿¡ WNDCLASS º¯¼ö¸¦ Àü´ÞÇØ È£ÃâÇϸé, ºÎ¸ðŬ·¡½ºÀÇ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®ÀÇ ÁÖ¼Ò°¡ lpfnWndProc µ¥ÀÌŸ ¸â¹ö¿¡ ÀúÀåµÈ´Ù. ÀÌ °ªÀº ½´ÆÛŬ·¡½º(»õ·Ó°Ô ¸¸µé¾îÁö´Â)ÀÇ À©µµ¿ì ÇÁ·Î½ÃÁ®·Î »ç¿ëµÈ´Ù. ÀÌ ´Ü°è´Â "From Messages to Events" ¿¡¼ ¿ø·¡ÀÇ À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ ´Ù¸¥ À©µµ¿ì ÇÁ·Î½ÃÁ®¿Í ¹Ù²å´ø ÀνºÅϽº ¼ºêŬ·¡½ÌÀÇ ¿¹Á¦(¸ñ·Ï 1.18)¿Í ºñ½ÁÇÏ´Ù. ¼ºêŬ·¡½Ì¿¡¼´Â ±³Ã¼µÈ À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ "¼ºêŬ·¡½º ÇÁ·Î½ÃÁ®"¶ó°í Çߴµ¥, ½´ÆÛŬ·¡½Ì¿¡¼´Â »õ·Î¿î À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ "½´ÆÛŬ·¡½º ÇÁ·Î½ÃÁ®" ¶ó°í ÇÑ´Ù. ±â¹Ý Ŭ·¡½ºÀÇ À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ ÀúÀåÇÏ°í ³ª¼, ½´ÆÛŬ·¡½º ÇÁ·Î½ÃÁ®°¡ WNDCLASS ÀÇ lpfnWndProc ¸â¹ö¿¡ ¼³Á¤µÈ´Ù. ¸¶Áö¸·À¸·Î ¾îÇø®ÄÉÀ̼ÇÀÇ ÀνºÅϽº ÇÚµé(hInstance)À» hInstance ÀÎÀÚ¿¡ ¼³Á¤Çϰí lpClassName ÀÎÀÚ¿¡ »õ·Î¿î Ŭ·¡½ºÀÇ À̸§À» ¼³Á¤ÇÑ´Ù.
Ç¥ÁØÄÁÆ®·ÑÀÎ BUTTON À» ½´ÆÛŬ·¡½ÌÇÏ´Â ¿¹Á¦¸¦ »ìÆìº¸¸ç ¾Ë¾Æº¸ÀÚ. Àü°úÁ¤ÀÌ ¸ñ·Ï 2.1 ¿¡ ÀÖ°í, À̶§ ½´ÆÛŬ·¡½ºÀÇ À̸§À» "TMyButton" À¸·Î Çß´Ù.
¸ñ·Ï 2.1
//-----------------------------------------------------------------------
#include <windows.h>
//-----------------------------------------------------------------------
// our new window class name
const char NewFormClassName[] = "TMyForm";
// our new button class name
const char NewButtonClassName[] = "TMyButton";
// will hold the address of the base (BUTTON)
// class's default window procedure
FARPROC ButtonDefWndProc = NULL;
//----------------------------------------------------------------------
// main window procedure
LRESULT CALLBACK FormWndProc(HWND HWnd, unsigned int Msg, WPARAM WParam, LPARAM LParam)
{
// this window will actually do no special processing
// except terminate the application when destroyed
switch (Msg)
{
case WM_DESTROY:
{
// will place WM_QUIT in our message queue
// (strictly speaking, the QS_QUIT flag)
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(HWnd, Msg, WParam, LParam);
}
//----------------------------------------------------------------------
// button window procedure
LRESULT CALLBACK ButtonWndProc(HWND HWnd, unsigned int Msg, WPARAM WParam, LPARAM LParam)
{
//
// this window will actually do no special processing
//
// call the original BUTTON window procedure
return CallWindowProc(ButtonDefWndProc, HWnd, Msg, WParam, LParam);
}
//----------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE HInstance, HINSTANCE HPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
WNDCLASS form_wc, button_wc;
memset(&form_wc, 0, sizeof(WNDCLASS));
memset(&button_wc, 0, sizeof(WNDCLASS));
// initialize the Form's WNDCLASS structure
form_wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
form_wc.lpfnWndProc = FormWndProc;
form_wc.hInstance = HInstance;
form_wc.hCursor = LoadCursor(NULL, IDC_ARROW);
form_wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
form_wc.lpszClassName = NewFormClassName;
// initialize a WNDCLASS structure for the "BUTTON"
// base class via the GetClassInfo API function
if (!GetClassInfo(NULL, "BUTTON", &button_wc)) return false;
// store the address of the original window procedure
ButtonDefWndProc = reinterpret_cast<FARPROC>(button_wc.lpfnWndProc);
// specify the address of the subclass procedure
button_wc.lpfnWndProc = ButtonWndProc;
// initialize the rest of our button's WNDCLASS
// structure for superclassing
button_wc.hInstance = HInstance;
button_wc.lpszClassName = NewButtonClassName;
// register our new class of window and button
if (RegisterClass(&form_wc) && RegisterClass(&button_wc))
{
// once registered, we are free to create the window
HWND HWnd = CreateWindow(NewFormClassName, "MyForm1",
WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, HInstance, NULL);
if (HWnd)
{
// create the new button
CreateWindow(NewButtonClassName, "MyButton1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10, 200, 75,
HWnd, NULL, HInstance, NULL);
// show the new window
ShowWindow(HWnd, nCmdShow);
UpdateWindow(HWnd);
// main message pump
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
//----------------------------------------------------------------------
¸ñ·Ï 2.0 ¿¡¼ º» ±¸Çö°ú ºñ½ÁÇϰÔ, ¸ñ·Ï 2.1 ¿¡ ÀÖ´Â WinMain ÇÔ¼öÀÇ ±¸ÇöÀº ¿ì¼± TMyForm Ŭ·¡½º¸¦ À§ÇÑ WNDCLASS º¯¼ö¸¦ ¼±¾ðÇϰí ÃʱâÈÇß´Ù. ±×·¯³ª ¸ñ·Ï 2.1 ¿¡¼´Â »õ·Î¿î ¹öư Ŭ·¡½º¸¦ ¸¸µé±â À§Çؼ button_wc ¶õ WNDCLASS º¯¼ö¸¦ Çϳª´õ ¼±¾ðÇß´Ù. button_wc ÀÇ µ¥ÀÌŸ ¸â¹ö¸¦ ÀÏÀÏÀÌ ¼³Á¤ÇÏ´Â ´ë½Å¿¡, GetClassInfo() API ÇÔ¼ö¸¦ È£ÃâÇß´Ù. À̶§, hInstance ÀÎÀÚ¿¡´Â NULL À» Àü´ÞÇϰí, ºÎ¸ðŬ·¡½ºÀÇ Å¬·¡½º À̸§À» ³ªÅ¸³»´Â lpClassName ÀÎÀÚ¿¡´Â "BUTTON" À» Àü´ÞÇß´Ù. ¸¶Áö¸·ÀÇ lpWndClass ÀÎÀÚ¿¡´Â button_wc ÀÇ ÁÖ¼Ò°ªÀ» Àü´ÞÇß´Ù. hInstance ÀÎÀÚ¿¡ NULL À» Àü´ÞÇÑ °ÍÀº BUTTON Ŭ·¡½º°¡ À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡ ÀÌ¹Ì µî·ÏµÇ¾î Àֱ⠶§¹®ÀÌ´Ù. GetClassInfo() ÇÔ¼ö°¡ ¼öÇàµÇ°í ³ª¸é, button_wc ´Â BUTTON Ŭ·¡½º¸¦ µî·ÏÇÒ ¶§ »ç¿ëÇÑ Á¤º¸·Î ÃʱâȵȴÙ. À§ÀÇ Äڵ忡¼´Â ºÎ¸ð Ŭ·¡½ºÀÇ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ ButtonDefWndProc º¯¼ö¿¡ ÀúÀåÇß´Ù. ±× ´ÙÀ½ button_wc ÀÇ hInstance µ¥ÀÌŸ ¸â¹ö¸¦ ¿ì¸®°¡ ¸¸µé°í ÀÖ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ ÀνºÅϽº ÇÚµé·Î ¹Ù²å´Ù. ±×¸®°í lpfnWndProc °ªÀº ½´ÆÛŬ·¡½º ÇÁ·Î½ÃÁ® ÁÖ¼Ò°ªÀ¸·Î ¼³Á¤µÇ¾ú°í lpClassName µ¥ÀÌŸ ¸â¹ö´Â »õ·Î¿î Ŭ·¡½º À̸§ÀÎ "TMyButton" À¸·Î ¼³Á¤µÇ¾ú´Ù. µÎ°³ÀÇ »õ·Î¿î Ŭ·¡½º¸¦ µî·ÏÇÑ ´ÙÀ½¿¡, »õ·Î¿î TMyForm À©µµ¿ì¸¦ ¸¸µé°í CreateWindow() ÇÔ¼ö¸¦ »ç¿ëÇØ¼ »õ·Î¿î TMyButton À©µµ¿ì ÄÁÆ®·ÑÀ» ¸¸µé¾ú´Ù. TMyButton ÄÁÆ®·ÑÀ» ¸¸µé ¶§ CreateWindow() ÇÔ¼ö¿¡ WS_CHILD ¿Í BS_PUSHDOWN ½ºÅ¸ÀÏÀ» ¼³Á¤Çß´Ù. ÀÌ °ÍÀº BUTTON Ŭ·¡½ºÀÇ ½ºÅ¸ÀÏÀε¥, TMyButton Ŭ·¡½ºÀÇ ºÎ¸ð Ŭ·¡½º°¡ BUTTON Ŭ·¡½ºÀ̱⠶§¹®¿¡ BUTTON Ŭ·¡½ºÀÇ ½ºÅ¸ÀÏÀ» ±×´ë·Î ¾µ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ¼³Á¤ÇÑ ½ºÅ¸ÀÏÀÇ ¶æÀº TMyButton ÄÁÆ®·ÑÀÌ ´Ù¸¥ À©µµ¿ì(ÀÌ ¿¹Á¦¿¡¼´Â TMyForm)ÀÇ ÀÚ½ÄÀ̶ó´Â °ÍÀÌ´Ù. ÀÚ½Ä À©µµ¿ì¸¦ ´ë°³ "À©µµ¿ì ÄÁÆ®·Ñ" ¶Ç´Â °£´ÜÇÏ°Ô "ÄÁÆ®·Ñ" À̶ó°í ÇÑ´Ù. ÀÌ ¿¹Á¦¿¡¼ TMyForm ÀÌ TMyButton Ŭ·¡싕 ºÎ¸ðÀ̱⠶§¹®¿¡, TMyButton ¸¦ ¸¸µé ¶§ CreateWindow() API ÇÔ¼öÀÇ hWndParent ÀÇ ÀÎÀÚ¿¡ TMyForm À©µµ¿ìÀÇ ÇÚµéÀÎ HWnd °ªÀ» ¼³Á¤Çß´Ù.
VCL Àº ½´ÆÛŬ·¡½ÌÀ» ¿Ïº®ÇÏ°Ô Áö¿øÇÑ´Ù. Áï, TWinControl ¿¡¼ ÆÄ»ýµÈ ÄÁÆ®·Ñ Áß Á¸ÀçÇÏ´Â ÄÁÆ®·Ñ Ŭ·¡½º¸¦ È®ÀåÇÑ ÄÁÆ®·ÑµéÀº ¸ðµÎ ½´ÆÛŬ·¡½ÌÀ» »ç¿ëÇϰí ÀÖ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼, TListBox Ŭ·¡½º´Â Ç¥ÁØ ÄÁÆ®·Ñ Ŭ·¡½ºÀÎ LISTBOX ¸¦ ½´ÆÛŬ·¡½Ì Çϰí ÀÖ´Â °ÍÀ̰í TListView Ŭ·¡½º´Â °øÅë ÄÁÆ®·ÑÀÎ WC_LISTVIEW ¸¦ ½´ÆÛŬ·¡½Ì ÇÏ´Â °ÍÀÌ´Ù.
Áö±ÝÂë CreateWindow() API ÇÔ¼ö¿¡ ¸Å¿ì Àͼ÷ÇØÁ® ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ ÇÔ¼ö¸¦ ÀØ°í »ì¾Æµµ µÈ´Ù. ¸¶Âù°¡¸®·Î RegisterWindow() ÇÔ¼ö¸¦ WNDCLASS ±¸Á¶Ã¼¸¦ ÃʱâÈÇϴµ¥ È£ÃâÇÒ °æ¿ì°¡ °ÅÀÇ ¾ø´Ù. ÀÌ ÇÔ¼öµé ¾øÀ̵µ ½´ÆÛŬ·¡½ÌÀ» ¸ÚÁö°Ô ÇÒ ¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé, TWinControl Ŭ·¡½º°¡ ÀÌ·¯ÇÑ ÀÛ¾÷(À©µµ¿ì »ý¼º, ½´ÆÛŬ·¡½Ì)ÀÇ ¸ðµç °úÁ¤À» Æ÷ÇÔÇϰí Àֱ⠶§¹®ÀÌ´Ù. TWinControl Ŭ·¡½º°¡ ¹Ù·Î VCL ÇÁ·¹ÀÓ웤ÀÌ Á¦°øÇÏ´Â Ãß»óÈÀÇ ¼öÁØÀÌ´Ù. ÀÌ·¯ÇÑ RAD(Rapid Application Development) ¸¦ ¸¸µé±â À§ÇÑ Ä¸½¶È ¶§¹®¿¡ C++ ºô´õ°¡ °è¼ÓÇØ¼ °¼¼¸¦ º¸À̰í ÀÖ´Â °ÍÀÌ´Ù. VCL Àº °·ÂÇÑ ÇÁ·¹ÀÓ웤°ú »ç¿ëÇϱ⠽¬¿î Á¡ ¿Ü¿¡µµ, ¾ÆÁÖ ¶Ù¾î³ ¼³°è, À©µµ¿ìÁî API ¿ÍÀÇ À¯¿¬¼º µîÀ» °ñ°í·ç °®Ãß°í ÀÖ´Ù. °Ô´Ù°¡ °ð ¾Ë°Ô µÇ°ÚÁö¸¸, VCL Àº Àý´ë·Î ·Î¿ì·¹º§ÀÇ API ¸¦ ´Ù·ç´Â °ÍÀ» Á¦ÇÑÇÏÁö ¾Ê´Â´Ù.
4 TWinControl Ŭ·¡½º¸¦ »ç¿ëÇØ¼ À©µµ¿ì ¸¸µé±â
Áö±Ý±îÁö, CreateWindow() ¿Í RegisterClass() API ÇÔ¼ö¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù. ¾Ë¾Æº» °Í Áß¿¡ °¡Àå Áß¿äÇÑ °ÍÀº, À©µµ¿ì ÄÁÆ®·ÑÀ» ¸¸µé±â À§Çؼ´Â WNDCLASS ±¸Á¶Ã¼¸¦ ¸¸µé°í ÃʱâÈÇÑ ´ÙÀ½¿¡ À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡ µî·ÏÇØ¾ß ÇÑ´Ù´Â Á¡À̾ú´Ù. ¶ÇÇÑ, ±âÁ¸ÀÇ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ ½´ÆÛŬ·¡½ÌÇÏ´Â ´Ü°è¸¦ »ìÆìº¸¾Ò´Ù. ±×·³ ÀÌÁ¦ TWinControl Ŭ·¡½º°¡ ÀÌ·¯ÇÑ ÀÛ¾÷À» °¡»ó ¸â¹ö ÇÔ¼ö¿¡ ½É¾î ³ù´ÂÁö »ìÆìº¸ÀÚ. ÀÌ ¹ø ´Ü¿ø¿¡¼´Â TWinControl Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö Áß¿¡¼ À©µµ¿ì »ý¼º°ú ½´ÆÛŬ·¡½Ì¿¡ ÇÊ¿äÇÑ ¸â¹ö ÇÔ¼öµé¿¡ ´ëÇØ¼ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ¾Õ¿¡¼ API ¸¦ ÀÌ¿ëÇØ ±¸ÇöÇØ ºÃ±â ¶§¹®¿¡, TWinControl ·Î ÀÌ·ïÁö´Â ±¸ÇöÀº º°·Î ¾î·ÆÁö ¾Ê´Ù.
5 The CreateParams Function CreateParams ÇÔ¼ö
ÀÚ²Ù ¸»Çؼ ¹Ì¾ÈÇÏÁö¸¸, »ç¿ëÀÚ Á¤ÀÇÀÇ À©µµ¿ì ÄÁÆ®·ÑÀ» ¸¸µé±â À§Çؼ ù¹øÂ°·Î ÇØ¾ßÇÒ °ÍÀº À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÏ´Â °ÍÀ̾ú´Ù. ƯÈ÷, WNDCLASS ±¸Á¶Ã¼¸¦ ¾Ë¸Â°Ô ¼³Á¤ÇØ¾ß Çϴµ¥ ÀÌ ÀÏÀ» TWinControl::CreateParams() ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â 1 °³ÀÇ ÀÎÀÚ¸¸ ¹Þ´Âµ¥ TCreateParams ±¸Á¶Ã¼ °ªÀÌ´Ù.
struct TCreateParams
{
char *Caption;
long Style;
long ExStyle;
int X;
int Y;
int Width;
int Height;
HWND WndParent;
void *Param;
WNDCLASSA WindowClass;
char WinClassName[64];
};
ÀÌ ±¸Á¶Ã¼¸¦ »ìÆìº¸¸é, À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ÇÊ¿äÇÑ ¸ðµç Á¤º¸°¡ ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö°¡ ÀÖ´Ù. Áï, TCreateParams ±¸Á¶Ã¼´Â À̸§´ë·Î À©µµ¿ì "»ý¼º ÀÎÀÚ(Creation Parameters)" ¸ðµÎ¸¦ °¡Áö°í ÀÖ´Â °ÍÀÌ´Ù. ƯÈ÷, ÀÌ ±¸Á¶Ã¼´Â ´ÙÀ½ ¼¼´Ü°è¿¡¼ ÇÊ¿äÇÑ ¸ðµç Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. (1) WNDCLASS ¼³Á¤ (2) RegisterWnd() (3) CreateWindow. ¶ÇÇÑ TCreatePArams ±¸Á¶Ã¼ÀÇ ¸â¹öµéÀº CreateWindow API ÇÔ¼öÀÇ ÀÎÀÚµé°ú ¼·Î ´ëÀÀÇÑ´Ù. TWinControl::CreateParams() ¸â¹ö ÇÔ¼ö´Â ÀÌ TCreateParams ±¸ÃÊü¸¦ ¾Ë¸Â°Ô ¼³Á¤ÇÑ´Ù. ¸ñ·Ï 2.2 ¸¦ º¸¸é C++ ·Î Ç¥ÇöµÈ TWinControl::CreateParams() ¸â¹ö ÇÔ¼ö°¡ ÀÖ´Ù.
¸ñ·Ï 2.2
void __fastcall TWinControl::CreateParams(TCreateParams &Params)
{
memset(&Params, 0, sizeof(TCreateParams));
//
// <snip> initialize:
// Params.Caption (with FText);
// Params.Style with WS_* flags (e.g., WS_CHILD)
// Params.X with FLeft;
// Params.Y with FTop;
// Params.Width with FWidth;
// Params.Height with FHeight;
// Params.WndParent = Parent->Handle;
//
Params.WindowClass.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
Params.WindowClass.lpfnWndProc = DefWindowProc;
Params.WindowClass.hInstance = HInstance;
Params.WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
Params.WindowClass.hbrBackground = NULL;
strcpy(Params.WinClassName, AnsiString(ClassName()).c_str());
}
¸ñ·Ï 2.2 ¿¡ Á¤ÀÇµÈ TWinControl::CreateParams() ÇÔ¼ö¸¦ º¸¸é TCreateParms ±¸Á¶Ã¼ÀÇ ´ëºÎºÐÀÇ ¸â¹ö¸¦ ÃʱâÈÇÑ´Ù. ÀÚ¼¼ÇÑ ±¸Çö »çÇ×Àº TWinControl ¿¡¼ ÆÄ»ýµÈ Ŭ·¡½ºµéÀ» º¼ ¶§ »ìÆìº¸±â·Î Çϰí, ¿ì¼± µÎ°¡Áö Áß¿äÇÑ Á¡À» ¾Ë¾Æº¸ÀÚ. ù°, TCreateParams::WindowClass(WNDCLASS Çü)±¸Á¶Ã¼ÀÇ ¸â¹öÀÎ lpfnWndProc ÀÇ °ªÀÌ DefWindowProc() API ÇÔ¼öÀÇ ÁÖ¼Ò·Î ¼³Á¤µÇ¾ú´Âµ¥ ÀÌ ±¸ÇöÀº ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù. ¿Ö³ÄÇϸé DefWindowProc() ÇÔ¼ö´Â ¸ðµç À©µµ¿ìÀÇ À©µµ¿ì ÇÁ·Î½ÃÁ®·Î »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. TWinControl Ŭ·¡½º´Â ÀÌ ÁÖ¼Ò°ªÀ» Àӽà °ªÀ¸·Î »ç¿ëÇϸç, ÇöÀç À©µµ¿ì Ŭ·¡½º°¡ ÀÌ¹Ì µî·ÏµÇ¾î ÀÖ´ÂÁö ¾Æ´ÑÁö¸¦ ±¸ºÐÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. µÑ°, WindowClass ÀÇ lpszClassName ¸â¹ö°¡ ÀüÇô ÃʱâȵÇÁö ¾Ê¾Ò´Ù. ¿ÀÈ÷·Á Ŭ·¡½ºÀÇ À̸§ÀÌ TCreateParams::WinClassName ¸â¹ö¿¡ ÀúÀåµÇ¾ú´Ù. ÀÌ ÀÌÀ¯´Â ´ÙÀ½¿¡ ¼³¸íÇÏ°í ¿ì¼±, ÀÌ·¸°Ô ÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÌ´Ù¶ó°í ¾Ë¾ÆµÎÀÚ.
5.1 CreateWnd ÇÔ¼ö
TCreateParams ±¸Á¶Ã¼ÀÇ WindowClass ¸â¹ö¸¦ ¼³Á¤ÇÑ ÈÄ¿¡ RegisterClass() API ÇÔ¼ö·Î µî·ÏÇØ¾ß ÇÑ´Ù. ÀÌ ÀÏÀ» CreateWnd() ¸â¹ö ÇÔ¼ö°¡ ¼öÇàÇÑ´Ù. ÀÌ ÇÔ¼ö³»¿¡¼ À©µµ¿ì »ý¼º ¸ÞÄ«´ÏÁòÀÌ ¸ðµÎ ¼öÇàµÈ´Ù. Áï. À©µµ¿ì »ý¼º¿¡ ÇÊ¿äÇÑ ¸ðµç TWinControl Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö°¡ CreateWnd() ÇÔ¼ö ³»¿¡¼ È£ÃâµÈ´Ù. ¸ñ·Ï 2.3 ¿¡ C++ ·Î ³ªÅ¸³½ TWinControl::CreateWnd() ¸â¹ö ÇÔ¼ö°¡ ÀÖ´Ù.
¸ñ·Ï 2.3
void __fastcall TWinControl::CreateWnd()
{
TCreateParams Params;
CreateParams(Params);
if (Params.WndParent == NULL && (Params.Style & WS_CHILD))
{
throw EInvalidOperation(SParentRequired, ARRAYOFCONST((Name)));
}
FDefWndProc = Params.WindowClass.lpfnWndProc;
WNDCLASS dummyClass;
bool IsClassRegistered = GetClassInfo(
Params.WindowClass.hInstance,
Params.WinClassName,
&dummyClass
);
if (!IsClassRegistered || TempClass.lpfnWndProc != reinterpret_cast<WNDPROC>(InitWndProc))
{
if (IsClassRegistered)
{
UnregisterClass(Params.WinClassName, Params.WindowClass.hInstance);
}
Params.WindowClass.lpfnWndProc = reinterpret_cast<WNDPROC>(InitWndProc);
Params.WindowClass.lpszClassName = Params.WinClassName;
}
CreateWindowHandle(Params);
// <snip> font and bounds stuff...
}
CreateWnd() ¸â¹ö ÇÔ¼ö´Â ¾Ë¸Â°Ô ¼³Á¤µÈ TCreateParmas ±¸Á¶Ã¼ °ªÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡, Á¦ÀÏ ¸ÕÀú TWinControl::CreateParams() ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. ±× ´ÙÀ½¿¡ ÄÁÆ®·ÑÀÌ ´Ù¸¥ À©µµ¿ìÀÇ ÀÚ½ÄÀÏ ¶§ WndParent ¸â¹öÀÇ À¯È¿¼ºÀ» »ìÆì¼ ¹®Á¦°¡ ÀÖ´Ù¸é "Control <ControlName> has no Parent" ¶ó´Â ¿¹¿Ü¸¦ ÀÏÀ¸Å²´Ù. ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®ÀÇ ÁÖ¼Ò°¡ FDefWndProc ¸â¹ö( TWinControl ÀÇ DefWndProc ¼Ó¼ºÀ» ÅëÇØ¼ Á¢±Ù °¡´ÉÇÏ´Ù)¿¡ ÀúÀåµÇ°í GetClassInfo() API ÇÔ¼ö°¡ È£ÃâµÈ´Ù. ÀÌ ¶§ Àӽà WNDCLASS º¯¼ö¸¦ »ç¿ëÇϴµ¥ ÀÌ´Â ÇöÀç Ŭ·¡½º°¡ ÀÌ¹Ì µî·ÏµÈ Ŭ·¡½ºÀÎÁö¸¦ ±¸ºÐÇϱâ À§Çؼ´Ù. ¸¸¾à¿¡ Ŭ·¡½º°¡ ÀÌ¹Ì µî·ÏµÈ °ÍÀÌ ¾Æ´Ï°Å³ª µî·ÏµÈ Ŭ·¡½ºÀÇ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®ÀÇ ÁÖ¼Ò°ªÀÌ InitWndProc() ÇÔ¼öÀÇ ¹Ýȯ°ª°ú Ʋ¸®¸é, »õ·Î¿î Ŭ·¡½º°¡ µî·ÏµÈ´Ù. if ÀÇ Á¶°Ç¹®ÀÌ ÂüÀÌ µÇ¸é, ¸ÕÀú µî·ÏµÈ Ŭ·¡½º¸¦ ¸ÕÀú UnregsterClass() API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ µî·Ï ÇØÁ¦ÇÑ´Ù. ±× ´ÙÀ½, TWinControl::CreateWindowHandle() ¸â¹ö ÇÔ¼ö¿¡ Params °ªÀ» Àü´ÞÇØ¼ È£ÃâÇÑ´Ù.
°¢°¢ÀÇ ±¸Çö¿¡ ´ëÇØ¼ ±í°Ô ¾Ë·Á°í ÇÏÁö ¸»°í ´ëÃæ ¹«½¼ ÀÏÀÌ ÀϾÁö¸¸ ¾Ë¾ÆµÎ±æ ¹Ù¶õ´Ù. Áï, CreateWnd() ¸â¹ö ÇÔ¼öÀÇ ÁÖµÈ ±âÁõÀº »õ·Î¿î À©µµ¿ì Ŭ·¡½º¸¦ RegisterClass() API ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ µî·ÏÇÏ´Â °ÍÀÌ´Ù. Params º¯¼öÀÇ ÃʱâÈ´Â CreateParams() ÇÔ¼ö°¡ ¼öÇàÇÏ°í ½ÇÁ¦ À©µµ¿ì »ý¼ºÀº CreateWindowHandle() ÇÔ¼ö°¡ ó¸®ÇÑ´Ù.
5.2 CreateWindowHandle ÇÔ¼ö
¾Õ¿¡¼ ¸»ÇßµíÀÌ, CreateWindowHandle() ¸â¹ö ÇÔ¼ö°¡ CreateWindow() API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ½ÇÁ¦ À©µµ¿ì¸¦ ¸¸µç´Ù. »ç½Ç, CreateWindowHandle() ÇÔ¼ö´Â CreateWindowEx() API ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÇÔ¼öÀÇ À̸§´ë·Î, ÀÌ ÇÔ¼ö´Â CreateWindow() ÇÔ¼öÀÇ È®ÀåÆÇÀ¸·Î ´õ ¸¹Àº À©µµ¿ì ½ºÅ¸ÀÏ(È®Àå À©µµ¿ì ½ºÅ¸ÀÏ)À» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â TCreateParams ±¸Á¶Ã¼ÀÇ ExStyle µ¥ÀÌŸ ¸â¹ö¸¦ ¾Ë¸Â°Ô ¼³Á¤ÇÏ¸é µÈ´Ù.
HWND CreateWindowEx(
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);
¸ñ·Ï 2.4¿¡ C++ ·Î Ç¥ÇöÇÑ CreateWindowHandle() ÇÔ¼ö°¡ Àִµ¥, CreateWindowEx() API ÇÔ¼ö¸¸ È£ÃâÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.
¸ñ·Ï 2.4
void __fastcall TWinControl::CreateWindowHandle(const TCreateParams &Params)
{
FHandle = CreateWindowEx(
Params.ExStyle,
Params.WinClassName,
Params.Caption,
Params.Style,
Params.X, Params.Y,
Params.Width, Params.Height,
Params.WndParent, NULL,
Params.WindowClass.hInstance,
Params.Param
);
}
¸ñ·Ï 2.3 ¿¡ Á¤ÀÇµÈ CreateWindowHandle() ÇÔ¼ö¸¦ »ìÆìº¸¸é ½ÇÁ¦ À©µµ¿ì¸¦ ¸¸µç´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ÀÏÀº °£´ÜÇÏ°Ô CreateWindowEx() API ÇÔ¼ö¸¦ È£ÃâÇØ¼ ÀÌ·ïÁö°í À̶§, ÃʱâÈµÈ Params ÀÇ ¸â¹ö¸¦ ÇÔ¼öÀÇ ÀÎÀÚ·Î Àü´ÞÇÑ´Ù. CreateWindow() API ÇÔ¼öó·³ CreateWindowEx() ÇÔ¼öµµ »õ·Ó°Ô ¸¸µé¾îÁø À©µµ¿ì ÇÚµéÀ» ¹ÝȯÇÑ´Ù. ÀÌ °ªÀº FHandle ¸â¹ö¿¡ ÀúÀåµÇ´Âµ¥ TWinControl::Handle ¼Ó¼ºÀ» ÅëÇØ¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
Áö±Ý±îÁö »ìÆìº» ¼¼°¡Áö ¸â¹ö ÇÔ¼öÀÎ, CreateParams(), CreateWnd(), CreateWindowHandle() ·Î TWinControl Ŭ·¡½º´Â À©µµ¿ì »ý¼º ¸ÞÄ«´ÏÁòÀ» Á¦°øÇÑ´Ù. CreateParams() ÇÔ¼ö´Â TCreateParams ±¸Á¶Ã¼¸¦ ¾Ë¸Â°Ô ¼³Á¤Çϰí, CreateWnd() ÇÔ¼ö´Â »õ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇϸç CreateWindowHandle() ÇÔ¼ö´Â ½ÇÁ¦ À©µµ¿ìÀ» ¸¸µç´Ù. ÀÌ ¼¼ ´Ü°è°¡ »õ·Î¿î À©µµ¿ì Ŭ·¡½º¸¦ ¸¸µé±â À§Çؼ ÇÊ¿äÇÏ´Ù. »ç½Ç, ÀÌ ¼¼°¡Áö ¸â¹ö ÇÔ¼ö´Â ÇϳªÀÇ ÇÔ¼ö·Î ÇÕÄ¥ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ¾Õ¿¡¼µµ ¾ê±âÇßµíÀÌ, TWinControl ¿¡¼ ÆÄ»ýµÈ Ŭ·¡½º ´ëºÎºÐÀÌ ±âÁ¸ÀÇ À©µµ¿ì Ŭ·¡½º¸¦ ¹ÙÅÁÀ¸·Î ¸¸µé¾îÁø °ÍÀÌ´Ù. ¿ì¸®´Â ÀÌ °ÍÀÌ ½´ÆÛŬ·¡½ÌÀ̶õ ±â¼úÀ» ÅëÇØ¼ ÀÌ·ïÁø´Ù´Â °ÍÀ» ¾Ë°í ÀÖ´Ù. ±×·³ Áö±ÝºÎÅÍ TWinControl Ŭ·¡½º°¡ ¾î¶»°Ô ½´ÆÛŬ·¡½ÌÀ» ĸ½¶ÈÇß´ÂÁö ¾Ë¾Æº¸ÀÚ.
5.3 TWinControl Ŭ·¡½º·Î ½´ÆÛŬ·¡½ÌÇϱâ
±âÁ¸ÀÇ ÄÁÆ®·Ñ Ŭ·¡½º¸¦ ½´ÆÛŬ·¡½ÌÇϱâ À§Çؼ ÇÇ·æÇÑ ´Ü°è¸¦ »ý°¢Çغ¸¸é ù°, GetClassInfo() ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ±âÁ¸ À©µµ¿ì Ŭ·¡½ºÀÇ Á¤º¸¸¦ WNDCLASS ±¸Á¶Ã¼¿¡ ´ã¾Æ¾ßÇÑ´Ù. µÑ°, Ŭ·¡½ºÀÇ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ® ÁÖ¼Ò°ªÀ» ÀúÀåÇÏ°í »õ·Ó°Ô ¸¸µç À©µµ¿ì ÇÁ·Î½ÃÁ® ÁÖ¼Ò°ªÀ¸·Î ±³Ã¼ÇؾßÇÑ´Ù. ¼Â°, WNDCLASS µ¥ÀÌŸ ¸â¹öÀÎ hInstance ¿Í lpClassName À» ¾Ë¸Â°Ô ¹Ù²ã¾ßÇÑ´Ù. °ð ¾Ë°Ô µÇ°ÚÁö¸¸, ÀÌ ¼¼°¡Áö ´Ü°è´Â TWinControl ÀÇ ¸â¹ö ÇÔ¼ö Çϳª·Î ÀÌ·ïÁø´Ù.
CreateParams() ¸â¹ö ÇÔ¼ö´Â TCreateParams::WindowClass ÀÇ ¸â¹öÀÎ hInstance ¸¦ ¼³Á¤ÇÏ´Â °ÍÀ¸·Î ½´ÆÛŬ·¡½Ì¿¡µµ »ç¿ëµÈ´Ù. ¸ñ·Ï 2.1 ÀÇ ±¸Çöó·³, CreateParams() ¸â¹ö ÇÔ¼ö´Â ¾îÇø®ÄÉÀ̼ÇÀÇ ÀνºÅϽºÀÎ HInstance ¸¦ hInstance µ¥ÀÌŸ ¸â¹ö¿¡ ¼³Á¤ÇÑ´Ù. CreateWnd() ¸â¹ö ÇÔ¼ö ¶ÇÇÑ ½´ÆÛŬ·¡½Ì¿¡ »ç¿ëµÇ´Âµ¥ ±âº» À©µµ¿ì ÇÁ·Î½ÃÁ®¸¦ FDefWndProc ¸â¹ö¿¡ ÀúÀåÇϸç, ½´ÆÛŬ·¡½º ÇÁ·Î½ÃÁ®¸¦ lpfnWndProc ¸â¹ö¿¡ ¼³Á¤Çϰí, lpszClassName ¸â¹ö¿¡ »õ·Î¿î À©µµ¿ì Ŭ·¡½º À̸§À» ¼³Á¤ÇÑ´Ù. ±×·³ ³²Àº ÀÏÀÌ ¹«¾ùÀϱî? Áö±Ý±îÁöÀÇ ±¸ÇöÀ» º¸¸é ±âÁ¸ Ŭ·¡½ºÀÇ Á¤º¸¸¦ TCreateParams::WindowClass ¸â¹ö¿¡ ¼³Á¤Çϱâ À§Çؼ GetClassInfo() ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °÷ÀÌ ¾ø´Ù. ÀÌ ÀÏÀº TWinControl::CreateSubClass ¸â¹ö ÇÔ¼ö°¡ ¼öÇàÇÑ´Ù.
ÇÔ¼ö À̸§¿¡ ¸ÂÁö ¾Ê°Ô, CreateSubClass() ¸â¹ö ÇÔ¼ö´Â CreateParams() ¶Ç´Â CreateWnd() ÇÔ¼ö¿¡¼ ÇÏÁö ¾ÊÀº ½´ÆÛŬ·¡½ÌÀÇ ³ª¸ÓÁö ÀÛ¾÷À» ó¸®ÇÑ´Ù. Áï, CreateSubClass() ¸â¹ö ÇÔ¼öÀÇ ¿ªÇÒÀº TCreateParams::WindowClass µ¥ÀÌŸ ¸â¹ö¸¦ ±âÁ¸ À©µµ¿ì Ŭ·¡½ºÀÇ Á¤º¸·Î ¼³Á¤ÇÏ´Â °ÍÀÌ´Ù. ¸ñ·Ï 2.5 ¿¡ C++ ·Î Ç¥ÇöÇÑ TWinControl::CreateSubClass() ¸â¹ö ÇÔ¼öÀÇ Äڵ尡 ÀÖ´Ù.
¸ñ·Ï 2.5
void __fastcall TWinControl::CreateSubClass(TCreateParams &Params, char *ControlClassName)
{
if (ControlClassName)
{
HINSTANCE SaveInstance = Params.WindowClass.hInstance;
if (!GetClassInfo(HInstance, ...) && !GetClassInfo(NULL, ...) && !GetClassInfo(MainInstance, ...))
{
GetClassInfo(Params.WindowClass.hInstance, ControlClassName, &Params.WindowClass);
}
Params.WindowClass.hInstance = SaveInstance;
}
}
CreateSubClass() ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ControlClassName ÀÎÀÚ´Â ±â¹Ý Ŭ·¡½ºÀÌ À̸§ÀÌ´Ù. ¿¹¸¦ µé¾î¼, À©µµ¿ìÁîÀÇ BUTTON Ç¥ÁØ ÄÁÆ®·ÑÀ» ½´ÆÛŬ·¡½ÌÀ» ÇÏ·Á¸é, ControlClassName ÀÎÀÚ¿¡ "BUTTON" À» Àü´ÞÇØ¾ß ÇÑ´Ù. Params ÀÎÀÚ´Â CreateParams() ÇÔ¼ö·Î ÃʱâÈÇÑ TCreateParms ±¸Á¶Ã¼ °ªÀÌ´Ù. CreateParams() ÇÔ¼ö´Â CreateSubClass() ÇÔ¼ö ÀÌÀü¿¡ È£ÃâµÇ¾î¾ß ÇÑ´Ù. ¸¸¾à, CreateParams() ÇÔ¼ö°¡ CreateSUbClass() ÇÔ¼öº¸´Ù ´Ê°Ô È£ÃâµÈ´Ù¸é, CreateParams() ÇÔ¼ö°¡ CreateSubClass() ¿¡ ÀÇÇØ ÃʱâÈµÈ Á¤º¸¸¦ Áö¿ö¹ö¸®°í ´Ù½Ã ¾µ °ÍÀÌ´Ù. ´ë°³, CreateSubClass() ÇÔ¼ö´Â ¿À¹ö¶óÀ̵å(override)µÈ CreateParams() ÇÔ¼ö ¾È¿¡¼ È£ÃâµÇ´Âµ¥, ºÎ¸ð Ŭ·¡½ºÀÇ CreateParams() ÇÔ¼ö¸¦ È£ÃâÇÑ´ÙÀ½¿¡ CreateSubClass() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
¸ñ·Ï 2.5¸¦ º¸¸é, CreateSubClass() ÇÔ¼ö´Â ´ëºÎºÐ GetClassInfo() API ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ TCreateParams::WindowClass ¸â¹ö¸¦ ¼³Á¤ÇÏ´Â ³»¿ëÀ¸·Î µÇ¾î ÀÖ´Ù. CreateSubClass() ÇÔ¼ö´Â ÃÑ 4 ¹ø¿¡ °ÉÃļ GetClassInfo() ÇÔ¼ö¸¦ È£ÃâÇϴµ¥, °¢°¢ÀÇ È£Ã⸶´Ù hInstance ÀÎÀÚ°¡ ´Ù¸£´Ù. GetClassInfo() ÇÔ¼ö¿¡ Àü´ÞµÈ´Â hInstance °ªÀº Ŭ·¡½º°¡ µî·ÏµÇ¾î ÀÖ´Â ¾îÇø®ÄÉÀ̼ÇÀÇ ÀνºÅϽº ÇÚµéÀÌ´Ù. CreateSubClass() ÇÔ¼ö´Â ¿ì¼± Àü¿ª HInstance º¯¼ö¸¦ »ç¿ëÇØ¼ ÇöÀç ¾îÇø®ÄÉÀ̼ǿ¡ ±â¹Ý Ŭ·¡½º°¡ µî·ÏµÇ¾î ÀÖ´ÂÁö »ìÆìº»´Ù. ù¹øÂ° È£ÃâÀÌ ½ÇÆÐÇϸé, hInstance ¿¡ NULL °ªÀ» ÁÖ¾î È£ÃâÇϴµ¥, ÀÌ °ÍÀº À©µµ¿ìÁî ¿î¿µÃ¼Á¦¿¡ ±â¹Ý Ŭ·¡½º°¡ µî·ÏµÇ¾î ÀÖ´ÂÁö¸¦ »ìÆìº¸´Â °ÍÀÌ´Ù. µÎ¹øÂ° È£Ãâµµ ½ÇÆÐÇϸé, hInstance ÀÎÀÚ¿¡ MainInstance ¸¦ Àü´ÞÇØ È£ÃâÇÑ´Ù. MainInstance ´Â DLL ÀÌ »ç¿ëµÉ °æ¿ì HInsatnce ¿Í ´Ù¸¥ °ªÀ» °¡Áö°Ô µÈ´Ù. ¼¼¹ø¿¡ °ÉÄ£ È£ÃâÀÌ ¸ðµÎ ½ÇÆÐÇϸé, ¸¶Áö¸· È£Ãâ·Î, WNDCLASS::hInstance µ¥ÀÌŸ ¸â¹ö¸¦ GetClassInfo() ÇÔ¼ö¿¡ Àü´ÞÇØ È£ÃâÇÑ´Ù. ÀÌ °æ¿ì¿¡´Â GetClassInfo() ÇÔ¼ö¸¦ À§Çؼ WindowClass µ¥ÀÌŸ ¸â¹öÀÎ hInstance ¿¡ ¾îÇø®ÄÉÀ̼ÇÀÇ ÇÚµéÀ» ¸í½ÃÀûÀ¸·Î ¼³Á¤Çؼ CreateSubClass() ÇÔ¼ö¿¡ Àü´ÞÇØ¾ß ÇÑ´Ù.
½´ÆÛŬ·¡½Ì ÀÛ¾÷À» ¿©·¯ ¸â¹öÇÔ¼ö·Î Âɰ³ ³õÀº °ÍÀÌ ºñÁ÷°üÀûÀÏ ¼öµµ ÀÖ´Ù. »ç½Ç, CreateSubClass() ÇÔ¼ö°¡ ½´ÆÛŬ·¡½Ì ÀÛ¾÷À» ÇѲ¨¹ø¿¡ ó¸®ÇÏ´Â °ÍÀÌ ´õ ³í¸®ÀûÀÏ ¼öµµ ÀÖ´Ù. °ð ¾Ë°Ô µÇ°ÚÁö¸¸, ½´ÆÛŬ·¡½Ì ÀÛ¾÷À» ÀÌ·¸°Ô ³ª´©´Â °ÍÀÌ ²À ÇÊ¿äÇѵ¥, TWinControl Ŭ·¡½º¿¡¼ ÆÄ»ýµÈ ÄÁÆ®·Ñ Áß ±â¹Ý Ŭ·¡½º¸¦ ½´ÆÛŬ·¡½Ì ÇÏÁö ¾Ê´Â °Íµµ Àֱ⠶§¹®ÀÌ´Ù. ¿¹¸¦ µé¸é, TCustomGrid Ŭ·¡½º´Â TWinControl ¿¡¼ ÆÄ»ýµÈ °ÍÀÌÁö¸¸, ±â¹Ý ÄÁÆ®·Ñ Ŭ·¡½º°¡ ¾ø´Ù. ±×·¸±â ¶§¹®¿¡, TCustomGrid::CreateParams() ¸â¹ö ÇÔ¼öÀÇ ±¸ÇöÀ» º¸¸é CreateSubClass() ÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸, TWinControl ±× ÀÚü´Â ÀϹÝ(generic) À©µµ¿ì¸¦ ½´ÆÛŬ·¡½ÌÇÑ °ÍÀÌ´Ù. »ç½Ç, TWinControl Àº ÀÛÀº ºó°ø°£¿¡, °æ°è(border)°¡ ¾ø´Â ÀÚ½Ä À©µµ¿ì´Ù. ±×·¸±â ¶§¹®¿¡ TWinControl::CreateParams() ±¸Çö¿¡¼ TCreateParams::Style ¸â¹ö¿¡ WS_CHILD ½ºÅ¸ÀÏÀ» ±âº»À¸·Î »ç¿ëÇÑ´Ù.
ÀÌ ¸â¹ö ÇÔ¼öµéÀÇ ÀÚ¼¼ÇÑ ¼³¸í¿¡ Áú·Á¹ö¸± °Í °°´Ù¸é, Àá½Ã ½¬¸é¼ Á¤¸®Çغ¸ÀÚ. ÀÌ ±ÛÀÇ ÁÖÁ¦´Â CreateParams(), CreateWnd() ±×¸®°í CreateWindowHandle() ¸â¹ö ÇÔ¼ö°¡ »õ·Î¿î Ŭ·¡½º¸¦ µî·ÏÇϰí, ÀÌ »õ·Î¿î Ŭ·¡½ºÀÇ À©µµ¿ì¸¦ ¸¸µé¾î Áشٴ °ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î CreateSubClass() ÇÔ¼ö¸¦ "½´ÆÛŬ·¡½Ì À¯Æ¿¸®Æ¼" ¸â¹ö ÇÔ¼ö¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ½´ÆÛŬ·¡½ÌÀ» È®½ÇÇÏ°Ô ÀÌÇØÇϱâ À§Çؼ ÀÌÁ¦ ¿¹Á¦¸¦ »ìÆìº¸ÀÚ. ÀÌ ¿¹Á¦´Â ¸ñ·Ï 2.1 ¿¡¼ ¸¸µé¾îº» TMyButton ÄÁÆ®·ÑÀ» TWinControl Ŭ·¡½º¸¦ »ç¿ëÇØ¼ ¸¸µé¾î º» °ÍÀÌ´Ù. ¸ñ·Ï 2.6a ¿Í 2.6b ¿¡ Àüü Äڵ尡 ÀÖ´Ù.
¸ñ·Ï 2.6a
//----------------------------------------------------------------------
#ifndef SuperClassMyButtonH
#define SuperClassMyButtonH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//----------------------------------------------------------------------
class TMyButton : public TWinControl
{
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
public:
__fastcall TMyButton(TComponent *Owner) : TWinControl(Owner) {};
};
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
TMyButton *MyButton;
Public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
¸ñ·Ï 2.6b
//----------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "SuperClassMyButton.h"
//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MyButton = new TMyButton(this);
MyButton->Parent = this;
MyButton->SetBounds(10, 10, 200, 75);
// use SetWindowText to set the caption of the
// button since we have not published the
// TControl::Caption property
SetWindowText(MyButton->Handle, "MyButton1");
}
//----------------------------------------------------------------------
void __fastcall TMyButton::CreateParams(TCreateParams &Params)
{
// have the TWinControl::CreateParams member function
// perform its default initialization of Params
TWinControl::CreateParams(Params);
// superclass the Windows BUTTON Standard Control
CreateSubClass(Params, "BUTTON");
}
//----------------------------------------------------------------------
ÀÌ ¿¹Á¦ÀÇ ÇÙ½ÉÀº TMyButton::CreateParams() ÇÔ¼ö¿¡ ÀÖ´Ù. ¿ì¼±, ºÎ¸ð Ŭ·¡½ºÀÎ TWinControl ÀÇ CreateParams() ÇÔ¼ö¸¦ È£ÃâÇØ¼ Params ÀÎÀÚ¸¦ ¾Ë¸Â°Ô ÃʱâÈÇÑ ´ÙÀ½ TWinControl::CreateSubClass() ¸â¹ö ÇÔ¼ö¿¡ ÃʱâÈµÈ Params °ª°ú ±â¹Ý ÄÁÆ®·Ñ Ŭ·¡½ºÀÇ À̸§ÀÎ "BUTTON" À» Àü´ÞÇØ¼ È£ÃâÇß´Ù.
ÀÌ ¿¹Á¦´Â TWinControl Ŭ·¡½ºÀÇ À©µµ¿ì »ý¼º ¸ÅÄ«´ÏÁòÀ» ÀÚ¼¼È÷ »ìÆìº¸´Â ÀÏÀº ¸Å¿ì ¾î·Á¿üÁö¸¸, ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀº ¸Å¿ì Á÷°üÀûÀÎ °ÍÀ» º¸¿©ÁØ´Ù. ¹Ì¸® Á¤ÀÇµÈ ÄÁÆ®·Ñ Ŭ·¡½º´Â Á¦ÇÑ µÇ¾î Àֱ⠶§¹®¿¡, CreateSubClass() ÇÔ¼ö°¡ Ç×»ó ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù.
6 À©µµ¿ì »ý¼ºÀÇ Ä¿½ºÅ͸¶ÀÌÁî
Ŭ·¡½º ¼³°è Áß °¡Àå Áß¿äÇÑ °ÍÀº È®ÀåÀÌ ½¬¿ö¾ß ÇÏ´Â °ÍÀε¥ ÀÌ °ÍÀº TWinControl Ŭ·¡½ºÀÇ ¾ÆÁÖ °ÇÑ ¸éÁß Çϳª´Ù. È¥ÇÕµÇ¾î »ç¿ëÇÒ ¼ö ÀÖ´Â À©µµ¿ì ½ºÅ¸ÀÏÀÌ ¾î¸¶¾î¸¶ÇÏÁö¸¸, TWinControl Ŭ·¡½º´Â ÀÌ ¸ðµç ½ºÅ¸ÀÏÀ» ¾ÆÁÖ À¯¿¬ÇÏ°Ô ´Ù·ê ¼ö ÀÖ´Ù. ¹Ì¸® Á¤ÀÇµÈ ÄÁÆ®·ÑÀº ¸î°³ ¾È µÇÁö¸¸ °¢ ÄÁÆ®·ÑÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â ½ºÅ¸ÀÏÀº ¾ÆÁÖ ¸¹´Ù. ¿¹¸¦ µé¾î¼ ¾Æ·¡¿¡ ÀÖ´Â ½ºÅ¸ÀÏÀº Ç¥ÁØ ÄÁÆ®·ÑÀÎ STATIC ÀÌ »ç¿ëÇÏ´Â ½ºÅ¸ÀÏÀÌ´Ù.
SS_BITMAP, SS_BLACKFRAME, SS_BLACKRECT, SS_CENTER, SS_CENTERIMAGE, SS_ENHMETAFILE, SS_ETCHEDFRAME, SS_ETCHEDHORZ, SS_ETCHEDVERT, SS_GRAYFRAME, SS_GRAYRECT, SS_ICON, SS_LEFT, SS_LEFTNOWORDWRAP, SS_NOPREFIX, SS_NOTIFY, SS_OWNERDRAW, SS_REALSIZEIMAGE, SS_RIGHT, SS_RIGHTJUST, SS_ICON, SS_SIMPLE, SS_SUNKEN, SS_WHITEFRAME, SS_WHITERECT.
TWinControl ¿¡¼ ÆÄ»ýµÈ Ŭ·¡½ºµéÀº CreateParams() ¸â¹ö ÇÔ¼ö¸¦ ÀçÁ¤Çؼ À©µµ¿ì »ý¼º¿¡ »ç¿ëµÇ´Â ¿©·¯ ÀÎÀÚµéÀ» ¼³Á¤ÇÑ´Ù. ¿¹¸¦ µé¾î¼, TCustomStaticText::CreateParams() ÇÔ¼ö´Â ¾ÆÁÖ ¸¹Àº STATIC ÄÁÆ®·ÑÀÇ ½ºÅ¸ÀÏÀ» ´Ù·é´Ù. ¸ñ·Ï 2.7 À» º¸ÀÚ.
¸ñ·Ï 2.7
void __fastcall TCustomStaticText::CreateParams(TCreateParams &Params)
{
TWinControl::CreateParams(Params);
CreateSubClass(Params, "STATIC");
Params.Style |= SS_NOTIFY;
switch (FAlignment)
{
case taLeftJustify:
{
Params.Style |= SS_LEFT;
break;
}
case taRightJustify:
{
Params.Style |= SS_RIGHT;
break;
}
case taCenter:
{
Params.Style |= SS_CENTER;
break;
}
}
// <snip> some right to left alignment support...
// BorderStyle...
switch (BorderStyle)
{
case sbsSingle:
{
Params.Style |= WS_BORDER;
break;
}
case sbsSunken:
{
Params.Style |= WS_BORDER;
break;
}
}
Params.WindowClass.style &= ~(CS_HREDRAW | CS_VREDRAW);
}
¸ñ·Ï 2.7 ¿¡¼ TCreateParams::Style °ú TCreateParams::WindowClass:style µ¥ÀÌŸ ¸â¹ö¸¦ ´Ù·ç´Â ¿¹¸¦ º¼ ¼ö ÀÖ´Ù. ¸ðµç Ä¿½ºÅ͸¶ÀÌÁî´Â CreateParams() ¸â¹ö ÇÔ¼ö ³»¿¡¼ ÇÒ ¼ö ÀÖ´Ù. °è¼ÓÇØ¼ À©µµ¿ì »ý¼ºÀ» Ä¿½ºÅ͸¶ÀÌÁîÇÏ´Â ¿¹Á¦¸¦ »ìÆìº¸ÀÚ.
6.1 Style °ú ExStyle ´Ù·ç±â
¾Õ¿¡¼ ¸»ÇßµíÀÌ, CreateWindowEx() ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ÀÎÀÚ¸¦ ´Ù·ï¾ßÇÒ ¶§°¡ ÀÖ´Ù. º¸Åë dwStyle °ú dwExStyle ÀÎÀÚ¸¦ ¸¹ÀÌ ´Ù·é´Ù. ÇÏÁö¸¸, CreateWindowEx() ÇÔ¼ö¸¦ Á÷Á¢ È£ÃâÇØ¾ßÇÒ ÀÏÀÌ ¾ø±â ¶§¹®¿¡, ¾î¶»°Ô ÀÌ ÀÎÀÚµéÀ» ´Ù·ï¾ß Çϴ°¡? TCreateParams ±¸Á¶Ã¼ÀÇ µ¥ÀÌŸ ¸â¹öÁß Style °ú ExStyle °¡ CreateWindowEx() ÇÔ¼öÀÇ dwStyle °ú dwExStyle ·Î Àü´ÞµÇ±â ¶§¹®¿¡ TCreateParams ±¸Á¶Ã¼ÀÇ Style °ú ExStyle À» ´Ù·ç¸é µÈ´Ù. ÀÌ ÀÏÀº ´ë°³ CreateParams ÇÔ¼ö ³»¿¡¼ ÀÌ·ïÁø´Ù.
¶°ÀÖ´Â(ÇÃ·ÔÆÃ) µµ±¸¹Ù¸¦ ¸¸µé±â À§Çؼ ¸¹ÀÌ »ç¿ëÇÏ´Â ÅøÀ©µµ¿ì¸¦ ¸¸µé¾îº¸ÀÚ. ÅøÀ©µµ¿ì´Â TForm::BorderStyle ¼Ó¼ºÀ» bsToolWindow ·Î °íÄ¡¸é ½±°Ô ¸¸µé ¼ö ÀÖÁö¸¸, ÀÌ ¿¹Á¦¿¡¼´Â ÀÌ °ÍÀ» TForm::CreateParams() ¸â¹ö ÇÔ¼ö¿¡¼ ¸¸µé¾î º»´Ù. ƯÈ÷, ÅøÀ©µµ¿ì´Â CreateWindowEx() ÇÔ¼öÀÇ dwExStyle ÀÎÀÚ¿¡ WS_EX_TOOLWINDOW ¸¦ ¼³Á¤Çؼ ¸¸µé±â ¶§¹®¿¡, TCreateParams::ExStyle ¸¦ ¾Ë¸Â°Ô ¼³Á¤ÇØÁà¾ß ÇÑ´Ù. ¸ñ·Ï 2.8a ¿Í 2.8b ´Â ±¸Çö ÄÚµå´Ù.
¸ñ·Ï 2.8a
//----------------------------------------------------------------------
#ifndef ToolWindowH
#define ToolWindowH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
virtual void __fastcall CreateParams(TCreateParams &Params);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
¸ñ·Ï 2.8b
//----------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ToolWindow.h"
//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = Params.ExStyle | WS_EX_TOOLWINDOW;
}
//----------------------------------------------------------------------
¸ñ·Ï 2.8b ¿¡ ÀÖ´Â TForm1::CreateParams() ÇÔ¼ö¿¡¼, ¿ì¼± ºÎ¸ðŬ·¡½ºÀÇ CreateParams() ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇß´Ù. ±×¸®°í ³ª¼ Params º¯¼öÀÇ ExStyle µ¥ÀÌŸ ¸â¹ö¿¡ WS_EX_TOOLWINDOW ½ºÅ¸ÀÏ·Î ¼³Á¤Çß´Ù. »ç½Ç, ÀÌ °ÍÀº BorderStyle ¼Ó¼ºÀÌ bsToolWindow ·Î ¼³Á¤µÉ ¶§ ¼öÇàÇÏ´Â Àϰú °°Àº °ÍÀÌ´Ù. ÀÌ ¿¹Á¦´Â BorderStyle ¼Ó¼ºÀ» ´Ù·ç´Â °ÍÀ¸·Î ´õ ½±°Ô ¸¸µé ¼ö Àֱ⠶§¹®¿¡ ´õ ÁÁÀº ¿¹Á¦¸¦ ¸¸µé¾îº¸ÀÚ.
±×¸² 2.0 °ú °°ÀÌ ÆÄÀÏÀÇ ¼Ó¼ºÀ» ¾Ë·ÁÁÖ´Â °£´ÜÇÑ ÆûÀ» »ý°¢Çغ¸ÀÚ.
Ž»ö±â¿¡¼ ÆûÀ¸·Î ÆÄÀÏÀ» ²ø¾î´Ù³õ±â(µå·¡±×¾Øµå·Ó drag and drop)°¡ µÇµµ·Ï ¸¸µé °ÍÀÌ´Ù. "From Message to Event" ¿¡¼ DragAcceptFiles() API ÇÔ¼ö¸¦ µå·Ó ¸ñÇ¥ À©µµ¿ì¸¦ Á¤ÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ¾ú´Ù. »ç½Ç, DragAcceptFiles() ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í ¸ñÇ¥ À©µµ¿ì¸¦ ¼³Á¤ÇÏ´Â ´Ù¸¥ ¹æ¹ýÀÌ Àִµ¥, WS_EX_ACCEPTFILES È®Àå À©µµ¿ì ½ºÅ¸ÀÏÀ» ¼³Á¤Çϸé ÇØ´ç À©µµ¿ì°¡ µå·Ó ¸ñÇ¥ À©µµ¿ì·Î ¸¸µé¾îÁø´Ù. À§ÀÇ ¿¹Á¦Ã³·³, TCreateParms::ExStyle ¸¸ °£´ÜÈ÷ ¼öÁ¤ÇÏ¸é µÈ´Ù. ¸ñ·Ï 2.9a ¿Í 2.9b ´Â ±¸Çö ÄÚµå´Ù.
¸ñ·Ï 2.9a
//----------------------------------------------------------------------
#ifndef DragDropH
#define DragDropH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *NameLabel;
TLabel *SizeLabel;
TLabel *DateLabel;
TBevel *Bevel1;
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
private: // User declarations
void __fastcall WMDropFiles(TMessage &Msg);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DROPFILES, TMessage, WMDropFiles)
END_MESSAGE_MAP(TForm)
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
¸ñ·Ï 2.9b
//----------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <memory>
#include "DragDrop.h"
//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.ExStyle = Params.ExStyle | WS_EX_ACCEPTFILES;
}
//----------------------------------------------------------------------
void __fastcall TForm1::WMDropFiles(TMessage &Msg)
{
// grab a handle to the drop object
HDROP HDrop = reinterpret_cast<HDROP>(Msg.WParam);
// find the number of files dropped
int num_files = DragQueryFile(HDrop, 0xFFFFFFFF, NULL, NULL);
if (num_files > 1)
{
ShowMessage("You have dropped too many files.");
return;
}
// extract the name and path of the dropped file
char filename[MAX_PATH];
DragQueryFile(HDrop, 0, filename, MAX_PATH);
NameLabel->Caption = NameLabel->Caption + " " + filename;
std::auto_ptr<TFileStream> fs;
try
{
fs.reset(new TFileStream(filename, fmOpenRead));
// get the file information
SizeLabel->Caption = SizeLabel->Caption + " " + GetFileSize(reinterpret_cast<HANDLE>(fs->Handle), NULL);
DateLabel->Caption = DateLabel->Caption + " " + FileDateToDateTime(FileGetDate(fs->Handle));
}
catch (...)
{
// close the drop handle
DragFinish(HDrop);
}
// close the drop handle
DragFinish(HDrop);
Msg.Result = 0;
}
//----------------------------------------------------------------------
¸ñ·Ï 2.8b ¿¡ ÀÖ´Â TForm1::CreateParams() ÇÔ¼ö ³»¿¡¼, ¿ì¼± ºÎ¸ð Ŭ·¡½ºÀÇ CreateParams() ÇÔ¼ö¸¦ È£ÃâÇÑ´ÙÀ½¿¡ ExStyle ¸â¹ö¿¡ WS_EX_ACCEPTFILES ¸¦ Ãß°¡Çß´Ù. WMDropFiles ¸Þ¼¼Áö Çڵ鷯¿¡¼, µå·ÓµÈ ÆÄÀÏÀÇ Å©±â¸¦ ¾ò±â À§Çؼ GetFileSize() API ÇÔ¼ö¸¦ »ç¿ëÇß°í ÆÄÀÏÀÌ ¸¶Áö¸·À¸·Î ¼öÁ¤µÈ ³¯Â¥¸¦ ¾Ë±âÀ§Çؼ VCL ÇÔ¼öÀÎ FileGetDate() ¿Í FileDateToDateTime() ÇÔ¼ö¸¦ »ç¿ëÇß´Ù.
Style °ú ExStyle ¸â¹ö´Â ÀÚ½Ä ÄÁÆ®·ÑÀ» ¸¸µé ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ì»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, TListBox ¿¡¼ ¼öÁ÷ ½ºÅ©·Ñ¹Ù¸¦ ¾ø¾Ö·Á¸é Style µ¥ÀÌŸ ¸â¹ö¿¡¼ WS_VSCROLL À» Á¦°ÅÇÏ¸é µÈ´Ù.
¸ñ·Ï 2.10
//----------------------------------------------------------------------
#ifndef NoScrollListBoxH
#define NoScrollListBoxH
//----------------------------------------------------------------------
#include <StdCtrls.hpp>
//----------------------------------------------------------------------
class TMyListBox : public TListBox
{
protected:
virtual void __fastcall CreateParams(TCreateParams &Params)
{
TListBox::CreateParams(Params);
Params.Style = Params.Style & ~WS_VSCROLL;
}
public:
__fastcall TMyListBox(TComponent *Owner) : TListBox(Owner) {};
};
//----------------------------------------------------------------------
#endif
6.2 WindowClass ¸â¹ö ´Ù·ç±â
»õ·Î¿î ÄÁÆ®·Ñ Ŭ·¡½ºÀÇ À©µµ¿ì¸¦ ¸¸µå´Â ù¹øÀç ´Ü°è´Â WNDCLASS º¯¼ö¸¦ ¼³Á¤ÇÏ´Â °ÍÀ̾ú´Ù. RegisterClass() API ÇÔ¼ö¿¡ Àü´ÞµÇ´Â WNDCLASS º¯¼ö´Â »õ·Î¿î ÄÁÆ®·Ñ Ŭ·¡½ºÀÇ ¼Ó¼ºÀ» ¼³Á¤Çϴµ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù. style ¸â¹ö´Â Ŭ·¡½ºÀÇ ½ºÅ¸ÀÏÀ» Á¤ÀÇÇϴµ¥ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, ¸ñ·Ï 2.0 ¿¡¼ form_wc ÀÇ style ¸â¹ö¸¦ CS_VREDRAW, CS_HREDRAW, CS_DBLCLKS Ŭ·¡½º ½ºÅ¸ÀÏÀ» ¼¯¾î¼ ¼³Á¤Çß¾ú´Ù.
TCreateParams::WindowClass µ¥ÀÌŸ ¸â¹ö´Â RegisterClass() ÇÔ¼ö¿¡ Àü´ÞµÇ´Â WNDCLASS ±¸Á¶Ã¼ º¯¼ö´Ù. ÀÌ ¸â¹ö´Â CreateParams() ¸â¹ö ÇÔ¼ö¿¡¼ ¼³Á¤µÇ´Âµ¥, Style °ú ExStyle ¸â¹öó·³ WindowClass ¸â¹ö¸¦ Ä¿½ºÅ͸¶ÀÌÁîÇÒ ¼ö ÀÖ´Ù.
±âº» ¸¶¿ì½º Ä¿¼·Î ½ÊÀÚ¼± Ä¿¼¸¦ °®´Â ÆûÀ» ¸¸µé¾îº¸ÀÚ. ÀÌ·± ÆûÀº Cursor ¼Ó¼ºÀ» ¼öÁ¤Çؼ ½±°Ô ¸¸µé¼ö ÀÖÁö¸¸, ÀÌ ¿¹Á¦¿¡¼´Â WindowClass ÀÇ hCursor µ¥ÀÌŸ ¸â¹ö¸¦ ¼öÀúÇØ¼ ¸¸µé¾î º»´Ù.
//----------------------------------------------------------------------
#ifndef HelpCursorH
#define HelpCursorH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
#include <StdCtrls.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
protected:
virtual void __fastcall CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WindowClass.hCursor = LoadCursor(NULL, IDC_CROSS);
}
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
Àü°ú °°ÀÌ, ¿ì¼± ºÎ¸ð Ŭ·¡½ºÀÇ CreateParams() ¸â¹ö ÇÔ¼ö·Î Params ¸¦ ¼³Á¤ÇÑ´ÙÀ½¿¡, LoadCursor() API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ hCursor ÀÇ ¸â¹ö¿¡ ½ÊÀÚÇü ¸¶¿ì½º Ä¿¼¸¦ ¼³Á¤Çß´Ù.
WindowClass ¸â¹ö¸¦ ´Ù·ç´Â ´Ù¸¥ ¿¹Á¦¸¦ »ìÆìº¸ÀÚ. ÀÌ ¿¹Á¦´Â ±×¸² 2.1 ó·³ À©µµ¿ìÀÇ "´Ý±â" ¹öưÀ» ºñȰ¼º ¹öưÀ¸·Î ¸¸µç´Ù.
WindowClass µ¥ÀÌŸ ¸â¹ö¿§ CS_NOCLASS Ŭ·¡½º ½ºÅ¸ÀÏÀ» Ãß°¡ÇÏ¸é µÈ´Ù.
¸ñ·Ï 2.12
//----------------------------------------------------------------------
#ifndef NoCloseH
#define NoCloseH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
#include <StdCtrls.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
protected:
virtual void __fastcall CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WindowClass.style = Params.WindowClass.style | CS_NOCLOSE;
}
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
¾Õ¿¡¼ »ìÆìº» hCursor ¸â¹ö¸¦ ¼³Á¤ÇÏ´Â ¿¹Á¦Ã³·³, WindowClass ÀÇ style µ¥ÀÌŸ ¸â¹ö¿¡ CS_NOCLOSE Ŭ·¡½º ½ºÅ¸ÀÏÀ» Ãß°¡Çß´Ù. ÀÌ ½ºÅ¸ÀÏÀº ŸÀÌÆ²¹ÙÀÇ "´Ý±â" ¹öưÀ» ºñȰ¼º ¹öưÀ¸·Î ¸¸µé°í ½Ã½ºÅÛ ¸Þ´º¿¡¼ "´Ý±â" Ç׸ñÀ» Á¦°ÅÇÑ´Ù. ÇÏÁö¸¸, Žº¹Ù¿¡ ÀÖ´Â ¾îÇø®ÄÉÀÌ¼Ç ¹öưÀ§¿¡¼ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ» ´©¸£¸é "´Ý±â" ¸Þ´º Ç׸ñÀÌ ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸ÀÚ.
6.3 WndParent ¸â¹ö ´Ù·ç±â
°¡Àå ¸¹ÀÌ ¹¯´Â Áú¹® Áß¿¡ Çϳª´Â, '¾îÇø®ÄÉÀÌ¼Ç ³»ÀÇ ÆûµéÀ» ¾î¶»°Ô Å×½ºÅ©¹Ù À§¿¡ ¹öưÀ¸·Î ³ªÅ¸³»´À³Ä' ÀÌ´Ù. ±âº»ÀûÀ¸·Î, VCL ¾îÇø®ÄÉÀ̼ǿ¡¼ ¾²ÀÌ´Â ÆûÀº Å×½ºÅ©¹Ù ¹öưÀ¸·Î ³ªÅ¸³ªÁú ¾Ê´Â´Ù. ¿ì¸®°¡ º¸´Â °ÍÀº TApplication À©µµ¿ìÀÌ´Ù. Å×½ºÅ©¹Ù ¹öư À§¿¡¼ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ» ´·¯º¸¸é, Ç¥ÁØ À©µµ¿ìÁî ¾îÇø®ÄÉÀ̼ǰú VCL ¾îÇø®ÄÉÀ̼ǰúÀÇ Â÷ÀÌÁ¡À» º¼ ¼ö ÀÖ´Ù. ¸Þ¸ðÀåÀÇ ÆË¾÷ ¸Þ´º´Â ±×¸² 2.2 ó·³ ½Ã½ºÅÛ ¸Þ´º´Ù.
VCL ¾îÇø®ÄÉÀ̼ÇÀº ´Ù¸¥ ¸Þ´º°¡ ³ª¿Â´Ù. TApplication::CreateHandle() ¸â¹ö ÇÔ¼ö°¡ ±×¸² 2.3 ó·³ ÃÖ´ëÈ(Maximize), À̵¿(Move), Å©±â Á¶Á¤(Size) ¿É¼ÇÀ» Á¦°ÅÇϱ⠶§¹®ÀÌ´Ù.
±×·³ ¿Ö TApplication::CreateHandle() ¸â¹ö ÇÔ¼ö´Â ÃÖ´ëÈ, À̵¿, Å©±âÁ¶Á¤ÀÇ ¸Þ´º¸¦ ¸¸µéÁö ¾Ê´Â °ÍÀϱî? ±×°ÍÀº TApplication ÀÇ À©µµ¿ì°¡ ÃÖ´ëÈ, À̵¿, Å©±âº¯È¯ÀÌ µÇ¸é ¾È µÇ±â ¶§¹®ÀÌ´Ù.
CreateWindowEx() ÇÔ¼öÀÇ hWndParent ÀÎÀÚ¿¡ ´ëÇØ¼ ¾ê±âÇÒ ¶§, ±âº»À¸·Î ÀÌ °ª¿¡ ¾îÇø®ÄÉÀ̼Ç(TApplication) À©µµ¿ìÀÇ ÇÚµéÀ» ¼³Á¤Çß¾ú´Ù. ±×·¸±â ¶§¹®¿¡ Å×½ºÅ©¹Ù¿¡¼ ÆûÀÇ ¹öưÀ» º¼ ¼ö ¾ø´Â °ÍÀÌ´Ù. ¾ÕÀÇ ¿¹Á¦Ã³·³ CreateParams() ÇÔ¼ö¸¦ »ç¿ëÇØ¼, TCreateParams::WndParent ¸â¹ö¸¦ ¹ÙÅÁȸé(desktop) À©µµ¿ìÀÇ ÇÚµé·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¸ñ·Ï 2.13 Àº ±¸Çö ÄÚµå´Ù.
¸ñ·Ï 2.13
//----------------------------------------------------------------------
#ifndef AppWindow2H
#define AppWindow2H
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//----------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
virtual void __fastcall CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WndParent = GetDesktopWindow(); // or NULL
}
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//----------------------------------------------------------------------
#endif
GetDesktopWindow() API ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ¹ÙÅÁȸé(desktop)ÀÇ À©µµ¿ì ÇÚµéÀ» °¡Á®¿Â ´ÙÀ½¿¡, ÀÌ ÇÚµé °ªÀ» Params ÀÇ WndParent µ¥ÀÌŸ ¸â¹ö¿¡ ¼³Á¤Çß´Ù. À§ÀÇ ±¸ÇöÀ¸·Î, Form2 ´Â Å×½ºÅ©¹Ù¿¡ ¹öưÀ¸·Î ³ªÅ¸³´Ù. ±×¸®°í ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ» ´·¯º¸¸é ½Ã½ºÅÛ ¸Þ´º°¡ ³ª¿Â´Ù. ÇÏÁö¸¸, ¾îÇø®ÄÉÀ̼Ç(TApplication) ÀÚü°¡ ÃÖ¼Ò鵃 ¶§ Form2 ´Â ÃÖ¼ÒȵÇÁö ¾Ê´Â´Ù.
»ç½Ç, À§ÀÇ ¹æ¹ýÀº Application ÀÇ MainFrom( TApplication::MainForm) À» »« ¸ðµç ÆûÀÌ Àß µ¿ÀÛÇÑ´Ù. ÇÏÁö¸¸ ¿Ö MainForm ¿¡¼ ÃÖ¼ÒÈ ¸Þ´º°¡ ÀÛµ¿ÇÏÁö ¾Ê´ÂÁö ¾Ë¾Æº¸±â À§Çؼ ¸ñ·Ï 2.13 ÀÇ Äڵ带 TFrom1 Ŭ·¡½º·Î ´Ù½Ã ¸¸µé¾îº¸ÀÚ.
¸ñ·Ï 2.14
//----------------------------------------------------------------------
#ifndef AppWindow2H
#define AppWindow2H
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
virtual void __fastcall CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WndParent = GetDesktopWindow(); // or NULL
}
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
//----------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//----------------------------------------------------------------------
#endif
ÀÌ ¿¹Á¦¸¦ ½ÇÇà½Ã۸é, µÎ°¡Áö ¹®Á¦Á¡À» ¹ß°ßÇÒ °ÍÀÌ´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ À©µµ¿ì ¹öưÀÌ Å×½ºÅ©¹Ù¿¡ ±×´ë·Î ÀÖ°í, Form1 ÀÇ »õ·Î¿î ¹öưµµ Å×½ºÅ©¹Ù À§¿¡ ³ªÅ¸³´Ù. ¾îÇø®ÄÉÀ̼ÇÀÇ Å×½ºÆ®¹Ù ¹öưÀ§¿¡¼ ¸¶¿ì½º ¿À¸¥ÂÊ ¹öưÀ» ´·¯¼ ÃÖ¼ÒÈ ¸Þ´º¸¦ ¼±ÅÃÇϸé Form1 Àº ÃÖ¼ÒȵÇÁö ¾Ê°í ±×·¡µµ ÀÖ´Â ¹®Á¦¸¦ º¼ ¼ö ÀÖ´Ù.
¿Ö ±×·±Áö ¾Ë±â À§Çؼ´Â WndParent ¸â¹ö¿¡ ¾îÇø®ÄÉÀÌ¼Ç À©µµ¿ìÀÇ ÇÚµéÀÌ »ç¿ëµÈ °ÍÀ» ¾Ë¾Æ¾ßÇÑ´Ù. ±×·¸±â ¶§¹®¿¡ ¾îÇø®ÄÉÀ̼ÇÀÌ ÃÖ¼ÒÈµÇ¸é ¸ðµç ÆûÀÌ ÃÖ¼ÒȵǴ °ÍÀÌ´Ù. À§ÀÇ ¿¹Á¦¸¦ º¸¸é, Form1 °ú Form2 ´Â WndParent ÀÇ °ªÀ¸·Î ´õÀÌ»ó ¾îÇø®ÄÉÀ̼ÇÀÇ À©µµ¿ì ÇÚµéÀ» »ç¿ëÇÏÁö ¾Ê±â ¶§¹®¿¡ ¾îÇø®ÄÉÀ̼ÇÀÌ ÃÖ¼ÒÈ µÉ ¶§, ±×´ë·Î ÀÖ´Â °ÍÀÌ´Ù.
À©µµ¿ìÀÇ ÃÖ¼ÒÈ ½Ã½ºÅÛ ¸Þ´º°¡ ¼±ÅõǸé, À©µµ¿ì´Â SC_MINIMIZE ¸í·ÉÀ» wParam ÀÎÀÚ¿¡ ³Ö¾î WM_SYSCOMMAND ¸Þ¼¼Áö¸¦ º¸³½´Ù. TCustomForm Ŭ·¡½º´Â ÀÌ ¸Þ¼¼Áö¸¦ WMSysCommand ¸Þ¼¼Áö Çڵ鷯¿¡¼ ´Ù·ç´Âµ¥, ÀÌ Çڵ鷯 ¾È¿¡¼ ¸Þ¼¼ÁöÀÇ ÇöÀç ÀνºÅϽº°¡ ¾îÇø®ÄÉÀ̼ÇÀÇ MainForm ÀÎÁö ¾Æ´ÑÁö¸¦ üũÇÑ´ÙÀ½¿¡, ±×·¸´Ù¸é ±× ¸Þ¼¼Áö¸¦ ¾îÇø®ÄÉÀÌ¼Ç À©µµ¿ì¿¡ Àü´ÞÇÑ´Ù. ¸Þ¼¼Áö¸¦ ¹ÞÀº ¾îÇø®ÄÉÀÌ¼Ç À©µµ¿ì´Â TApplication::Minimize() ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¸Þ¼¼Áö¸¦ ó¸®ÇÑ´Ù. ÀÌ·¸°Ô ÇÏ¸é ¸ðµç ÆûµéÀÌ ÃÖ¼ÒȵÇÁö¸¸, WndParent ¸¦ Á¶ÀÛÇÑ ÆûÀº ÃÖ¼ÒȵÇÁú ¾Ê´Â´Ù.
ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ, ¸Þ¼¼Áö ¸ÅÅ©·Î¸¦ »ç¿ëÇØ¾ßÇÑ´Ù.( Áï, Dispatch() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °Í ) ±×·¸°ÔÇϸé, TCustomForm Ŭ·¡½º¿¡ Àü´ÞµÇ´ø WM_SYSCOMMAND ¸Þ¼¼Áö¸¦ ¿ì¸®°¡ ¸¸µç WMSysCommand ¸Þ¼¼Áö Çڵ鷯¿¡¼ °¡·Îç ¼ö ÀÖ´Ù. ¸ñ·Ï 2.15a ¿Í 2.15b ¿¡ ±¸Çö Äڵ尡 ÀÖ´Ù.
¸ñ·Ï 2.15a
//----------------------------------------------------------------------
#ifndef AppWindowH
#define AppWindowH
//----------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall FormShow(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall WMSysCommand(TMessage &Msg);
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand)
END_MESSAGE_MAP(TForm)
};
//----------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//----------------------------------------------------------------------
#endif
¸ñ·Ï 2.15b
//----------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "AppWindow.h"
#include "AppWindow2.h"
//----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------------------------------------------------------------------
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WndParent = GetDesktopWindow();
}
//----------------------------------------------------------------------
void __fastcall TForm1::WMSysCommand(TMessage &Msg)
{
// trap the WM_SYSCOMMAND message only if the
// SC_MINIMIZE flag is specified
unsigned int op_code = Msg.WParam & 0xFFF0;
if (op_code == SC_MINIMIZE)
{
WindowState = wsMinimized;
Msg.Result = 0;
return;
}
TForm::Dispatch(&Msg);
}
//----------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
// hide the Application window (and its taskbar button)
ShowWindow(Application->Handle, SW_HIDE);
}
//----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// display Form2 (notice its own taskbar button)
Form2->Show();
}
//----------------------------------------------------------------------
¸ñ·Ï 2.15a ¿¡¼ ¸Þ¼¼Áö ¸ÅÅ©·Î¸¦ »ç¿ëÇߴµ¥, ÀÌ ¸ÅÅ©·Î´Â Dispatch() ¸â¹ö ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ¸ñ·Ï 2.15b ÀÇ WM_SYSCOMMAND ¸Þ¼¼Áö Çڵ鷯ÀÎ WMSysCommand() ³»¿¡¼, WParam ÀÌ SC_MINIMIZE ÀÎÁö üũÇÑ´ÙÀ½¿¡ ¸Â´Ù¸é, TCustomForm::WindowState ¼Ó¼ºÀ» ¼³Á¤Çؼ Form1 À» ÃÖ¼ÒȽÃŰ°í ¸Þ¼¼Áö¸¦ Æ®·¦Çß´Ù.
TCustomForm::OnShow À̺¥Æ® Çڵ鷯¸¦ »ç¿ëÇߴµ¥, ShowWindow() API ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¾îÇø®ÄÉÀÌ¼Ç À©µµ¿ì¿Í Å×½ºÆ®¹ÙÀÇ ¹öưÀ» º¸ÀÌÁö ¾Ê°Ô Çß´Ù. ÀÌ·¸°Ô ÇØ¼ ¸ðµç ¹®Á¦¸¦ ÇØ°áÇß´Ù.
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)