ÀÌÁ¦ ÄÁÆ®·ÑÀÇ º»Ã¼¸¦ º¸µµ·Ï ÇÏÀÚ. ÄÁÆ®·ÑÀº C++ Ŭ·¡½º·Î Ç¥ÇöµÇ¸ç ShowMsg.h ÆÄÀÏ¿¡ Ŭ·¡½º°¡ Á¤ÀǵȴÙ.
class CShowMsg
{
private:
int x;
int y;
TCHAR *str;
public:
HWND hWnd;
CShowMsg();
~CShowMsg();
BOOL Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent);
void ChangeString(TCHAR *nstr);
virtual LRESULT OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam);
};
Àü¿ª º¯¼öµéÀº ¸ðµÎ ÀÌ Å¬·¡½ºÀÇ ¸â¹öº¯¼ö·Î ¼±¾ðµÇ¾úÀ¸¸ç ÄÁÆ®·Ñ ³»ºÎÀÇ º¯¼öÀ̹ǷΠprivate ¾×¼¼½º ¼Ó¼ºÀ» °¡Áø´Ù. ¿ÜºÎ·Î °ø°³Çصµ µÇ´Â ¸â¹ö¶ó¸é public ¼Ó¼ºÀ¸·Î ¼±¾ðÇصµ »ó°ü¾ø´Ù. ¿ø·¡ºÎÅÍ ÀÖ´ø º¯¼öµé ¿Ü¿¡ À©µµ¿ì Çڵ鰪ÀÎ hWnd¸¦ Ãß°¡·Î °¡Áö´Âµ¥ µµ¿ì¹Ì Ŭ·¡½ºÀÇ AddObject ÇÔ¼ö°¡ °´Ã¼ ¸ÊÀ» ÀÛ¼ºÇÒ ¶§ hWnd ¸â¹ö¿¡ À©µµ¿ì ÇÚµéÀ» ´ëÀÔÇÑ´Ù.
¸â¹öº¯¼ö ¿Ü¿¡ »ý¼ºÀÚ, Æı«ÀÚ°¡ ÀÖ°í ¼¼ °³ÀÇ ÇÔ¼ö°¡ Àִµ¥ ÀÌ ÇÔ¼öµéÀÇ ÄÚµå´Â ShowMsg.cpp ÆÄÀÏ¿¡ µµ¿ì¹Ì Ŭ·¡½º¿Í ÇÔ²² Á¤ÀǵǾî ÀÖ´Ù.
CShowMsg::CShowMsg()
{
}
CShowMsg::~CShowMsg()
{
if (_RegisterHelper.arObj)
_RegisterHelper.RemoveObject(hWnd);
}
BOOL CShowMsg::Create(int x,int y,int w,int h,DWORD style,UINT id,HWND hParent)
{
CreateWindow("ShowMsgCtrl",NULL, style,
x,y,w,h,hParent,(HMENU)id,GetModuleHandle(NULL),this);
return TRUE;
}
void CShowMsg::ChangeString(TCHAR *nstr)
{
lstrcpy(str,nstr);
InvalidateRect(hWnd,NULL,TRUE);
}
LRESULT CShowMsg::OnMessage(UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT crt;
switch(iMessage) {
case WM_CREATE:
x=50;
y=50;
str=(TCHAR *)malloc(128);
lstrcpy(str,"String");
return 0;
case WM_KEYDOWN:
GetClientRect(hWnd,&crt);
switch (wParam) {
case VK_LEFT:
if (x > 0)
x--;
break;
case VK_RIGHT:
if (x < crt.right-50)
x++;
break;
case VK_UP:
if (y > 0)
y--;
break;
case VK_DOWN:
if (y < crt.bottom-10)
y++;
break;
}
InvalidateRect(hWnd,NULL,TRUE);
return 0;
case WM_LBUTTONDOWN:
if (lstrcmp(str,"String") == 0) {
ChangeString("¹®ÀÚ¿");
} else {
ChangeString("String");
}
SetFocus(hWnd);
return 0;
case WM_PAINT:
GetClientRect(hWnd,&crt);
hdc=BeginPaint(hWnd, &ps);
Rectangle(hdc,0,0,crt.right,crt.bottom);
TextOut(hdc,x,y,str,lstrlen(str));
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
free(str);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
»ý¼ºÀڴ Ưº°È÷ ÃʱâÈÇÒ °ÍÀÌ ¾ø´Ù. º¸Åë ¸â¹öº¯¼ö¸¦ ÃʱâÈÇÏ´Â ÀÛ¾÷À» ÇÏÁö¸¸ ÀÌ ÄÁÆ®·ÑÀº WM_CREATE¿Í WM_DESTROY¿¡¼ ÃʱâÈ ¹× ÇØÁ¦¸¦ ÇÏ°í ÀÖÀ¸¹Ç·Î »ý¼ºÀÚ´Â ±×³É ºóµÕºóµÕ ³î°í ÀÖÀ¸¸é µÈ´Ù. Æı«ÀÚ´Â µµ¿ì¹Ì Ŭ·¡½ºÀÇ RemoveObject ÇÔ¼ö¸¦ È£ÃâÇÏ¿© °´Ã¼ ¸Ê¿¡¼ ÀÚ½ÅÀ» Á¦°ÅÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
Create ÇÔ¼ö´Â CreateWindow ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÀÌ ÄÁÆ®·ÑÀÇ À©µµ¿ì¸¦ »ý¼ºÇÏ´Â ÀÏÀ» Çϴµ¥ ÀÌ ºÎºÐÀÌ ´Ù¼Ò È¥¶õ½º·´´Ù. °´Ã¼´Â ÀÌ¹Ì ¸¸µé¾îÁ³´Âµ¥ À©µµ¿ì´Â ¿Ö ¶Ç ¸¸µå´ÂÁö ¸»ÀÌ´Ù. ±×·¯³ª °´Ã¼¿Í À©µµ¿ì´Â ºÐ¸íÈ÷ ´Ù¸£´Ù. °´Ã¼°¡ À©µµ¿ì¸¦ Ç¥ÇöÇÏÁö¸¸ °´Ã¼¸¦ ¸¸µé¾ú´Ù°í Çؼ À©µµ¿ì°¡ ¸¸µé¾îÁö´Â °ÍÀº ¾Æ´Ï´Ù. ±×·¡¼ °´Ã¼°¡ »ý¼ºµÉ ¶§ À©µµ¿ì´Â µû·Î »ý¼ºÇØ¾ß ÇÑ´Ù. À©µµ¿ì¸¦ Ŭ·¡½º·Î Ç¥ÇöÇÏ´Â MFC¿¡¼µµ ÀÌ´Â ¸¶Âù°¡Áö´Ù. CButton Ŭ·¡½ºÀÇ °´Ã¼¸¦ ¼±¾ðÇÑ´Ù°í Çؼ ¹öÆ°ÀÌ ¸¸µé¾îÁö´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÌ °´Ã¼ÀÇ Create ÇÔ¼ö¸¦ µû·Î ºÒ·¯¾ß ÇÑ´Ù.
¸¸¾à »ý¼ºÀÚ¿¡¼ À©µµ¿ì±îÁö °°ÀÌ »ý¼ºÇϵµ·Ï ÇÏ°í ½Í´Ù¸é ±×·¸°Ô ÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª °´Ã¼°¡ »ý¼ºµÇ´Â ½ÃÁ¡¿¡´Â À©µµ¿ìÀÇ À§Ä¡¸¦ Á¤Çϱ⵵ ¾î·Æ°í ºÎ¸ð À©µµ¿ìÀÇ Çڵ鵵 ¸ð¸£±â ¶§¹®¿¡ °´Ã¼ º¯¼ö¸¦ °ð¹Ù·Î »ý¼ºÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇØÁø´Ù. »ý¼ºÀÚ¿¡¼ À©µµ¿ì±îÁö ¸¸µéµµ·Ï ÀÛ¼ºÇß´Ù¸é ÀÌ °´Ã¼´Â µ¿ÀûÀ¸·Î »ý¼ºÇÏ´Â ¼ö¹Û¿¡ ¾øÀ¸¹Ç·Î È°¿ë¼ºÀÌ ¶³¾îÁö°Ô µÈ´Ù. ±×·¡¼ Á» ¹ø°Å·Ó´õ¶óµµ °´Ã¼¸¦ ¸ÕÀú ¸¸µé°í À©µµ¿ì´Â Create ÇÔ¼ö·Î µû·Î ¸¸µéµµ·Ï ÇÏ¿´´Ù.
Create ÇÔ¼ö´Â CreateWindow·Î À©µµ¿ì¸¦ »ý¼ºÇÒ ¶§ ¸¶Áö¸· Àμö lpParamÀ¸·Î this Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ´Â ¸·ÁßÇÑ ÀÓ¹«¸¦ ¶í´Ù. ÀÌ Æ÷ÀÎÅÍ°¡ Àü´ÞµÇ¾î¾ß ShowMsgProc¿¡¼ °´Ã¼¸¦ µî·ÏÇÒ ¶§ °´Ã¼ Æ÷ÀÎÅÍ¿Í À©µµ¿ìÀÇ ´ëÀÀ °ü°è¸¦ ¸ÊÀ¸·Î ÀÛ¼ºÇÒ ¼ö ÀÖÀ¸¸ç ÀÌÈÄÀÇ ¸Þ½ÃÁö°¡ Á¦´ë·Î °´Ã¼¸¦ ãÀ» ¼ö ÀÖ´Ù. Àμö·Î Àü´Þ¹ÞÀº styleÀº CreateWindow È£Ãâ½Ã ±×´ë·Î ³Ñ°Ü ÁÖ¸ç id´Â ¸Þ´º ÇÚµé ´ë½Å ÁöÁ¤ÇÑ´Ù. ¸Þ´º ÇÚµéÀÌ ÄÁÆ®·Ñ¿¡¼´Â ID°ªÀ¸·Î ´ë½Å »ç¿ëµÈ´Ù´Â °ÍÀº Àß ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù.
ChangeString ÀϹÝÇÔ¼ö´Â ÄÁÆ®·Ñȸ¦ Çϱâ ÀüÀÇ ÇÔ¼ö¿Í µ¿ÀÏÇÏ´Ù. ´Ù¸¸ Ŭ·¡½ºÀÇ ¸â¹ö°¡ µÇ¾úÀ¸¹Ç·Î CShowMsg::ÀÌ ¾Õ¿¡ ºÙ¾î ÀÖ´Ù´Â Á¡¸¸ ´Ù¸£´Ù. Ŭ·¡½ºÀÇ ¸â¹öÇÔ¼ö´Â ¾Ï½ÃÀûÀ¸·Î this Æ÷ÀÎÅ͸¦ Àü´Þ¹ÞÀ¸¸ç ÀÌ Æ÷ÀÎÅÍ·Î hWnd¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖÀ¸¹Ç·Î À©µµ¿ì ÇÚµéÀ» µû·Î Àμö·Î Àü´Þ ¹ÞÀ» ÇÊ¿ä°¡ ¾ø¾îÁ³´Ù.
OnMessage ÇÔ¼ö´Â Ŭ·¡½º ³»ºÎÀÇ ¸Þ½ÃÁö ÇÁ·Î½ÃÀú ¿ªÇÒÀ» ÇÑ´Ù. Ŭ·¡½ºÈ¸¦ Çϱâ ÀüÀÇ ¸ð¾ç°ú °ÅÀÇ µ¿ÀÏÇÏµÇ Ã¹ ¹ø° Àμö hWnd°¡ ºÒÇÊ¿äÇØÁ³´Ù. Ŭ·¡½ºÀÇ ¸â¹öÇÔ¼öÀ̹ǷΠhWnd¸¦ Àμö·Î Àü´Þ¹ÞÁö ¾Ê¾Æµµ °ð¹Ù·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. hWnd´Â °ð this->hWnd¿Í µ¿ÀÏÇÏ´Ù. Äڵ嵵 ÄÁÆ®·Ñȸ¦ Çϱâ ÀüÀÇ ÄÚµå¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ WM_LBUTTONDOWN¿¡ SetFocus°¡ Ãß°¡µÇ¾ú°í WM_DESTROY¿¡¼ PostQuitMessage¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù´Â Á¡¸¸ ´Ù¸¦ »ÓÀÌ´Ù.
´ÙÀ½Àº ÀÌ ÄÁÆ®·ÑÀ» »ç¿ëÇÏ´Â ¸ÞÀÎ À©µµ¿ìÀÇ Äڵ带 º¸ÀÚ. ShowMsgTest.cppÀÇ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
#include <windows.h>
#include "ShowMsg.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("ShowMsgTest");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
hWndMain=hWnd;
while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
CShowMsg msg, msg2;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
msg.Create(10,10,100,100,WS_CHILD | WS_VISIBLE,1,hWnd);
msg2.Create(210,10,100,100,WS_CHILD | WS_VISIBLE,2,hWnd);
return 0;
case WM_LBUTTONDOWN:
msg.ChangeString("text");
return 0;
case WM_RBUTTONDOWN:
CShowMsg *msg3;
msg3=new CShowMsg;
msg3->Create(0,0,0,0,WS_CHILD | WS_VISIBLE,3,hWnd);
Sleep(500);
delete msg3;
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
µµ¿ì¹Ì Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼ ÄÁÆ®·ÑÀÇ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇϹǷΠº°µµÀÇ Ãß°¡ ÄÚµå¾øÀÌ °ð¹Ù·Î ÄÁÆ®·ÑÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. µÎ °³ÀÇ ÄÁÆ®·Ñ °´Ã¼¸¦ Àü¿ªÀ¸·Î ¼±¾ðÇÏ¿´À¸¸ç WM_CREATE¿¡¼ °´Ã¼ÀÇ Create ÇÔ¼ö¸¦ È£ÃâÇÏ¿© À©µµ¿ì¸¦ »ý¼ºÇϵµ·Ï ÇÏ¿´´Ù. ÀÌ·¸°Ô »ý¼ºÇϱ⸸ Çϸé ÄÁÆ®·ÑÀº ¾Ë¾Æ¼ ½ÇÇàµÈ´Ù. ¹®ÀÚ¿À» º¯°æÇÒ ¶§´Â °´Ã¼ÀÇ ChangeString ÇÔ¼ö¸¦ È£ÃâÇÏ¿´´Ù.
WM_RBUTTONDOWN¿¡¼´Â °´Ã¼¸¦ µ¿ÀûÀ¸·Îµµ ¸¸µé ¼ö ÀÖ´ÂÁö Å×½ºÆ®ÇÏ°í Àִµ¥ °´Ã¼ÇüÀÇ Æ÷ÀÎÅÍ º¯¼ö¸¦ ¼±¾ðÇÑ ÈÄ new ¿¬»êÀÚ·Î »ý¼ºÇÑ´Ù. ±×¸®°í Create ÇÔ¼ö·Î °´Ã¼¸¦ »ý¼ºÇÏ¿´À¸¸ç 0.5ÃÊ ÈÄ¿¡ delete ¿¬»êÀÚ·Î °´Ã¼¸¦ ÇØÁ¦Çß´Ù. °´Ã¼´Â ÀÌ·± ½ÄÀ¸·Î µ¿Àû »ý¼ºÀÌ ½±´Ù. Á¦´ë·Î °´Ã¼µéÀÌ ¸¸µé¾îÁö´ÂÁö Å×½ºÆ®Çغ¸ÀÚ.
µÎ °³ÀÇ °´Ã¼°¡ ÀÌ»ó¾øÀÌ »ý¼ºµÇ¾ú´Ù. ¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¸é µ¿ÀûÀ¸·Î °´Ã¼¸¦ »ý¼ºÇß´Ù°¡ ÇØÁ¦Çϴµ¥ ȸé»óÀ¸·Î º¸ÀÌÁö´Â ¾Ê´Â´Ù.