´Ù. CShowMsg

ÀÌÁ¦ ÄÁÆ®·ÑÀÇ º»Ã¼¸¦ º¸µµ·Ï ÇÏÀÚ. ÄÁÆ®·ÑÀº 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 ¿¬»êÀÚ·Î °´Ã¼¸¦ ÇØÁ¦Çß´Ù. °´Ã¼´Â ÀÌ·± ½ÄÀ¸·Î µ¿Àû »ý¼ºÀÌ ½±´Ù. Á¦´ë·Î °´Ã¼µéÀÌ ¸¸µé¾îÁö´ÂÁö Å×½ºÆ®Çغ¸ÀÚ.

µÎ °³ÀÇ °´Ã¼°¡ ÀÌ»ó¾øÀÌ »ý¼ºµÇ¾ú´Ù. ¸¶¿ì½º ¿À¸¥ÂÊ ¹öÆ°À» Ŭ¸¯ÇÏ¸é µ¿ÀûÀ¸·Î °´Ã¼¸¦ »ý¼ºÇß´Ù°¡ ÇØÁ¦Çϴµ¥ È­¸é»óÀ¸·Î º¸ÀÌÁö´Â ¾Ê´Â´Ù.