³ª. µµ¿ì¹Ì

¿ÀºêÁ§Æ®È­ÀÇ ÇÙ½ÉÀº À©µµ¿ì ÇÚµé°ú °´Ã¼ Æ÷ÀÎÅÍÀÇ ´ëÀÀ °ü°è¸¦ Àû¾î³õ´Â °´Ã¼ ¸Ê¿¡ ÀÖ´Ù. ±×·¸´Ù¸é °´Ã¼ ¸ÊÀ» ´©°¡ °ü¸®ÇÒ °ÍÀΰ¡ ÇÏ´Â ¹®Á¦°¡ »ý±â´Âµ¥ °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ´Ù·ç´Â ÀÏÀ» °´Ã¼ ÀÚ½ÅÀÌ Á÷Á¢ ÇÒ ¼ö´Â ¾ø´Ù. °´Ã¼ ¸ÊÀº °´Ã¼ ¿ÜºÎ¿¡ Àֱ⠶§¹®¿¡ ÀÌ ÀÛ¾÷¸¸ Àü¹®ÀûÀ¸·Î ÇÏ´Â µµ¿ì¹Ì Ŭ·¡½º°¡ ÇÊ¿äÇÏ´Ù. ¼Ò½º¿¡ ÀÖ´Â CRegisterHelper Ŭ·¡½º°¡ ¹Ù·Î °´Ã¼ ¸ÊÀ» °ü¸®ÇÏ´Â µµ¿ì¹Ì Ŭ·¡½ºÀÌ´Ù. ÀÌ Å¬·¡½º´Â ShowMsg.cpp¿¡ °°ÀÌ ¼±¾ð ¹× Á¤ÀǵǾî ÀÖÀ¸¸ç Àü¿ª °´Ã¼±îÁö ¸¸µé¾îÁ® ÀÖ´Ù.

 

#include <windows.h>

#include "ShowMsg.h"

 

LRESULT CALLBACK ShowMsgProc(HWND,UINT,WPARAM,LPARAM);

 

class CRegisterHelper

{

public:

     CRegisterHelper();

     ~CRegisterHelper();

 

     struct _arObj

     {

          CShowMsg *pObj;

          HWND hWnd;

     } *arObj;

     int arSize;

     int nReg;

 

     CShowMsg *FindObject(HWND hWnd);

     void AddObject(HWND hWnd, CShowMsg *pObj);

     void RemoveObject(HWND hWnd);

 

};

 

CRegisterHelper::CRegisterHelper()

{

     WNDCLASS WndClass;

 

     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=GetModuleHandle(NULL);

     WndClass.lpfnWndProc=(WNDPROC)ShowMsgProc;

     WndClass.lpszClassName="ShowMsgCtrl";

     WndClass.lpszMenuName=NULL;

     WndClass.style=CS_HREDRAW | CS_VREDRAW;

     RegisterClass(&WndClass);

 

     nReg=0;

     arSize=10;

     arObj=(_arObj *)malloc(arSize*sizeof(_arObj));

     memset(arObj,0,arSize*sizeof(_arObj));

}

 

CRegisterHelper::~CRegisterHelper()

{

     free(arObj);

     arObj=NULL;

}

 

CShowMsg *CRegisterHelper::FindObject(HWND hWnd)

{

     int i;

 

     for (i=0;i<nReg;i++) {

          if (arObj[i].hWnd == hWnd)

              return arObj[i].pObj;

     }

     return NULL;

}

 

void CRegisterHelper::AddObject(HWND hWnd, CShowMsg *pObj)

{

     int i;

 

     if (nReg == arSize-1) {

          arSize++;

          arObj=(_arObj *)realloc(arObj,arSize*sizeof(_arObj));

          arObj[arSize-1].hWnd=NULL;

          arObj[arSize-1].pObj=NULL;

     }

 

     for (i=0;;i++) {

          if (arObj[i].hWnd == NULL)

              break;

     }

     arObj[i].hWnd=hWnd;

     arObj[i].pObj=pObj;

     pObj->hWnd=hWnd;

     nReg++;

}

 

void CRegisterHelper::RemoveObject(HWND hWnd)

{

     int i,j;

 

     if (IsWindow(hWnd)) {

          DestroyWindow(hWnd);

     }

     for (i=0;i<nReg;i++) {

          if (arObj[i].hWnd == hWnd)

              break;

     }

     for (j=i+1;j<arSize;j++) {

          arObj[j-1].hWnd=arObj[j].hWnd;

          arObj[j-1].pObj=arObj[j].pObj;

     }

     nReg--;

}

 

CRegisterHelper _RegisterHelper;

 

LRESULT CALLBACK ShowMsgProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     CShowMsg *pSM;

 

     pSM=_RegisterHelper.FindObject(hWnd);

     if (pSM == NULL) {

          pSM=(CShowMsg *)((LPCREATESTRUCT)lParam)->lpCreateParams;

          _RegisterHelper.AddObject(hWnd,pSM);

     }

 

     return pSM->OnMessage(iMessage, wParam, lParam);

}

 

ÀÌ Å¬·¡½º¸¦ °°ÀÌ ºÐ¼®Çغ¸µµ·Ï ÇÏÀÚ. ¸â¹ö·Î arObj ±¸Á¶Ã¼ Æ÷ÀÎÅ͸¦ °¡Áö´Âµ¥ ÀÌ ¹è¿­ÀÌ ¹Ù·Î °´Ã¼ ¸ÊÀÌ´Ù. ±¸Á¶Ã¼ÀÇ ¸â¹ö¿¡´Â CShowMsg Ŭ·¡½ºÀÇ Æ÷ÀÎÅÍ pObj¿Í À©µµ¿ì ÇÚµé hWnd°¡ Æ÷ÇԵǾî ÀÖ¾î ¾î¶² °´Ã¼°¡ ¾î¶² À©µµ¿ì ÇÚµé°ú ´ëÀÀµÇ´ÂÁö¸¦ ±â¾ïÇÑ´Ù. arSize º¯¼ö´Â °´Ã¼ ¸ÊÀÇ ÇÒ´çµÈ Å©±âÀ̸ç nReg´Â µî·ÏµÈ °´Ã¼ÀÇ °³¼öÀÌ´Ù. °´Ã¼ ¸ÊÀ» °ü¸®ÇÏ´Â ¼¼ °³ÀÇ ¸â¹öÇÔ¼ö¿Í »ý¼ºÀÚ Æı«ÀÚ°¡ Àִµ¥ °¢ ÇÔ¼ö¸¦ ºÐ¼®Çغ¸ÀÚ.

 

FindObject

À©µµ¿ì ÇÚµé·ÎºÎÅÍ °´Ã¼ Æ÷ÀÎÅ͸¦ ã¾ÆÁØ´Ù. ¸¸¾à ¸Ê¿¡ À©µµ¿ì ÇÚµéÀÌ ¾øÀ¸¸é NULLÀ» ¸®ÅÏÇÏ¿© ¾ÆÁ÷ µî·ÏµÇÁö ¾ÊÀº °´Ã¼¶ó´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. ÄÚµå´Â ¾ÆÁÖ °£´ÜÇѵ¥ µî·ÏµÈ °´Ã¼¼ö¸¸Å­ ·çÇÁ¸¦ µ¹¸é¼­ À©µµ¿ì ÇÚµéÀ» ºñ±³Çغ¸°í ¹ß°ßµÇ¸é ¸ÊÀÇ °´Ã¼ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¹è¿­ÀÇ Å©±â°¡ Å©Áö ¾ÊÀ¸¹Ç·Î ¼øÂ÷ °Ë»öÀ» Çصµ ¼Óµµ»óÀÇ ºÒÀÌÀÍÀº Å©Áö ¾ÊÀ¸¸ç À©µµ¿ì ÇÚµéÀÌ Á¤·ÄµÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ ¼øÂ÷ °Ë»ö¹Û¿¡ ÇÒ ¼ö°¡ ¾ø´Ù.

AddObject

°´Ã¼ ¸Ê¿¡ »õ·Î¿î °´Ã¼¸¦ µî·ÏÇÑ´Ù. Àμö·Î´Â °´Ã¼ÀÇ À©µµ¿ì ÇÚµé°ú °´Ã¼ Æ÷ÀÎÅ͸¦ Àü´Þ¹Þ´Â´Ù. ¸Ê ¹è¿­ÀÇ ºóÀÚ¸®¸¦ ã¾Æ hWnd¿Í pObj¸¦ ´ëÀÔÇÏ°í °´Ã¼ÀÇ hWnd ¸â¹öº¯¼ö¿¡µµ À©µµ¿ì ÇÚµéÀ» ´ëÀÔÇÏ´Â ºñ±³Àû °£´ÜÇÑ ÄÚµå·Î µÇ¾î ÀÖ´Ù. °´Ã¼¸¦ µî·ÏÇÑ ÈÄ nReg´Â 1 Áõ°¡ÇÑ´Ù.

ÀÌ ÇÔ¼ö°¡ ÇØ¾ß ÇÒ ¶Ç ´Ù¸¥ ÀÛ¾÷Àº °´Ã¼ ¸ÊÀÇ Å©±â¸¦ °ü¸®ÇÏ´Â °ÍÀÌ´Ù. ¸Ê ¹è¿­Àº ÃÖÃÊ 10ÀÇ Å©±â¸¦ °¡Áö´Âµ¥ µî·ÏµÇ´Â °´Ã¼ ¼ö°¡ ´Ã¾î³ª¸é ÀÌ ¹è¿­Å©±âµµ °°ÀÌ ´Ã¾î³ª¾ß ÇÑ´Ù. °´Ã¼ ¸ÊÀÌ °íÁ¤µÈ Å©±âÀÇ ¹è¿­À̶ó¸é »ý¼ºÇÒ ¼ö ÀÖ´Â °´Ã¼ÀÇ ÃÖ´ë °³¼ö°¡ Á¦ÇѵǴ ¹®Á¦°¡ ÀÖÀ¸¹Ç·Î ¹Ýµå½Ã µ¿ÀûÀ¸·Î ¹è¿­À» °ü¸®Çϵµ·Ï ÇØ¾ß ÇÑ´Ù. ÀÌ ¹æ¹ýÀº ¾Õ¿¡¼­µµ ½Ç½ÀÇØ º» ÀûÀÌ Àִµ¥ pLine ¹è¿­ÀÌ ¶È°°Àº ¹æ¹ýÀ¸·Î °ü¸®µÇ°í ÀÖ´Ù. µµ¿ì¹Ì Ŭ·¡½ºÀÇ arSize º¯¼ö´Â ApiEditÀÇ LineLen¿¡ ÇØ´çÇÏ´Â º¯¼öÀÌ°í nReg´Â TotalLine¿¡ ÇØ´çÇÑ´Ù.

nReg°¡ arSize-1°ú °°À¸¸é Áï, ¸¶Áö¸· ³¡ Ç¥½Ã¸¦ ³ªÅ¸³»´Â NULL¿ä¼Ò¸¦ Á¦¿ÜÇÏ°í ´õ µî·ÏÇÒ °ø°£ÀÌ ¾øÀ¸¸é arObj ¹è¿­À» ´Ù½Ã ÀçÇÒ´çÇÏ¿© Å©±â¸¦ ´Ã·Á ÁØ´Ù. ÀçÇÒ´çÇÒ ¶§ ¿©À¯ºÐÀ» µÑ ¼öµµ ÀÖÁö¸¸ °´Ã¼ µî·ÏÀº ÀÚÁÖ ÀÖ´Â ÀÏÀÌ ¾Æ´Ï¹Ç·Î ¿©À¯ºÐ¾øÀÌ ²À ÇÊ¿äÇÑ ¸¸Å­¸¸ ÀçÇÒ´çÇϵµ·Ï Çß´Ù.

RemoveObject

°´Ã¼ ¸Ê¿¡¼­ °´Ã¼¸¦ Á¦°ÅÇÑ´Ù. Àμö·Î Àü´ÞµÈ À©µµ¿ì ÇÚµéÀ» ºñ±³ÇÏ¿© ¹è¿­»óÀÇ À妽º¸¦ ã°í °Ë»öµÈ ¿ä¼Ò¸¦ »èÁ¦ÇÑ´Ù. »èÁ¦ÇÒ ¶§´Â µÚÂÊ¿¡ ÀÖ´Â °ªÀ» ¾ÕÀ¸·Î º¹»çÇØ ¹è¿­ Áß°£¿¡ ºóÄ­ÀÌ ¾øµµ·Ï Çß´Ù. °´Ã¼¸¦ Á¦°ÅÇÒ ¶§ À©µµ¿ìµµ °°ÀÌ Æı«½ÃÄÑ Áִµ¥ ÀÌ Äڵ忡 ´ëÇؼ­´Â Àá½Ã ÈÄ ºÎ¿¬ ¼³¸íÀ» ÇÒ °ÍÀÌ´Ù.

»ý¼ºÀÚ

»ý¼ºÀÚ´Â ¸â¹öº¯¼öµéÀ» ÃʱâÈ­ÇÏ°í °´Ã¼ ¸ÊÀ» Ãʱâ ÇÒ´çÇÏ´Â ÀÏÀ» ÇÑ´Ù. ÃÖÃÊ µî·ÏµÈ °´Ã¼°¡ ¾øÀ¸¹Ç·Î nReg´Â 0À¸·Î ÃʱâÈ­µÇ°í arSize´Â 10À¸·Î ÃʱâÈ­ÇÑ ÈÄ ÀÌ Å©±â¸¸Å­ °´Ã¼ ¸Ê ¹è¿­À» ÇÒ´çÇÑ´Ù. Áï °´Ã¼ ¸ÊÀÇ Ãʱâ Å©±â´Â 10ÀÌ´Ù. ÇÏÁö¸¸ AddObject ÇÔ¼ö°¡ ÀÌ ¹è¿­À» µ¿ÀûÀ¸·Î °ü¸®ÇϹǷΠµî·ÏÇÒ ¼ö ÀÖ´Â °´Ã¼ °³¼ö¿¡ Á¦ÇÑÀº ¾ø´Ù.

»ý¼ºÀÚ´Â °´Ã¼ ¸ÊÀ» ÃʱâÈ­ÇÏ´Â ÀÏ ¿Ü¿¡µµ ¾ÆÁÖ Áß¿äÇÑ ÀÏÀ» Çϳª ´õ ÇÏ°í Àִµ¥ ¹Ù·Î ShowMsg ÄÁÆ®·ÑÀÇ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇÏ´Â °ÍÀÌ´Ù. µµ¿ì¹Ì °´Ã¼´Â Àü¿ªº¯¼ö·Î ¼±¾ðµÇ¾úÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¶§ »ý¼ºÀÚ°¡ ¹Ýµå½Ã È£ÃâµÇ¸ç ¶ÇÇÑ µµ¿ì¹Ì °´Ã¼°¡ À¯ÀÏÇÏ°Ô Çϳª»ÓÀ̹ǷΠÁ¤È®ÇÏ°Ô ÇÑ ¹ø¸¸ È£ÃâµÈ´Ù. ±×·¡¼­ µµ¿ì¹ÌÀÇ »ý¼ºÀÚ¿¡¼­ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇϵµ·Ï Çϸé À©µµ¿ì Ŭ·¡½º°¡ ¾ÆÁÖ ÀÚ¿¬½º·´°Ô µî·ÏµÇ´Â °ÍÀÌ´Ù.

ÀÌ ¹æ¹ýÀº InitShowMsg ÇÔ¼ö¸¦ Á¦°øÇÏ´Â °Íº¸´Ù ÈξÀ ´õ ¹ßÀüµÈ ¹æ¹ýÀÌ´Ù. Ŭ·¡½º°¡ »ý¼ºµÉ ¶§ »ý¼ºÀÚ°¡ ¹Ýµå½Ã È£ÃâµÇ¹Ç·Î ÀÌ ¸ðµâÀ» ÇÁ·ÎÁ§Æ®¿¡ Æ÷ÇÔ½ÃÅ°´Â °Í¸¸À¸·Îµµ ÀÌ¹Ì À©µµ¿ì Ŭ·¡½º´Â µî·ÏµÇ´Â °ÍÀÌ´Ù. ±×·¡¼­ ÀÌ ÄÁÆ®·ÑÀ» »ç¿ëÇÏ´Â »ç¿ëÀÚ´Â InitShowMsg °°Àº ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÒ ÇÊ¿ä°¡ ¾ø°í ±× »ç½ÇÀ» ±â¾ïÇÒ ÇÊ¿äµµ ¾ø¾îÁ³´Ù. »ç¿ëÀÚ°¡ ±â¾ïÇØ¾ß ÇÒ ³»¿ëÀÌ ¸¹Àº ÇÁ·Î±×·¥Àº ÁÁÀº ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï´Ù. »ý¼ºÀÚÀÇ ÀÌ·± Ư¼ºÀ» ÀÌ¿ëÇÏ´Â °ÍÀº Àß ±â¾ïÇØ µÑ¸¸ÇÑ À¯¿ëÇÑ ¹æ¹ýÀε¥ MFCÀÇ CWaitCursor Ŭ·¡½º°¡ µ¿ÀÏÇÑ ±â¹ýÀ¸·Î Ä¿¼­¸¦ º¯°æÇÑ´Ù.

ÄÁÆ®·ÑÀÌ ¿ÀºêÁ§Æ®È­µÇ¸é °´Ã¼ÀÇ ¸â¹öº¯¼ö¿¡ Á¤º¸¸¦ ÀúÀåÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¿©ºÐ ¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø¾îÁ³´Ù. ±×·¡¼­ À©µµ¿ì Ŭ·¡½ºÀÇ cbWndExtra ¸â¹ö´Â 0À¸·Î Á¤ÀǵǾú´Ù. ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ShowMsgProcÀ̶ó´Â ÀϹÝÇÔ¼ö·Î ÁöÁ¤µÇ¾ú´Âµ¥ ÀÌ ÇÔ¼ö´Â Àá½Ã ÈÄ µû·Î ºÐ¼®ÇØ º¼ °ÍÀÌ´Ù.

Æı«ÀÚ

Æı«ÀÚ´Â °´Ã¼ ¸ÊÀ» Æı«ÇÑ´Ù. arObj¿¡ NULLÀ» ´ëÀÔÇÏ´Â ÀÌÀ¯´Â °´Ã¼°¡ Æı«µÇ¾úÀ½À» ¸íÈ®ÇÏ°Ô Ç¥½ÃÇسõ±â À§Çؼ­ÀÌ´Ù.

¸Þ½ÃÁö ó¸® ÇÔ¼ö

ShowMsgProcÀº ShowMsg À©µµ¿ì·Î Àü´ÞµÇ´Â ¸Þ½ÃÁö¸¦ ÀÏÂ÷ÀûÀ¸·Î ¹Þ¾Æ ÁÖ´Â ÇÔ¼öÀÌÁö¸¸ °´Ã¼ÀÇ ÀϺδ ¾Æ´Ï´Ù. ¿ÀÈ÷·Á µµ¿ì¹Ì Ŭ·¡½ºÀÇ ÀϺζó°í º¸¾Æ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö°¡ ÇÏ´Â ÀÏÀº ¸Þ½ÃÁö°¡ Àü´ÞµÇ´Â Áï½Ã ¸Þ½ÃÁö ¸Ê¿¡ °´Ã¼¸¦ µî·ÏÇÏ°í ÀÌ¹Ì µî·ÏµÈ °´Ã¼¿¡ ´ëÇؼ­´Â °´Ã¼ÀÇ OnMessage °¡»óÇÔ¼ö·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇÏ´Â °ÍÀÌ´Ù.

À©µµ¿ì°¡ »ý¼ºµÉ ¶§ °¡Àå ¸ÕÀú Àü´ÞµÇ´Â ¸Þ½ÃÁö´Â WM_NCCREATEÀÌ´Ù. ÀÌ ¸Þ½ÃÁö¸¦ ¹Þ¾ÒÀ» ¶§ hWnd°¡ ¸Ê¿¡ µî·ÏµÇ¾î ÀÖ´ÂÁö FindObject ÇÔ¼ö·Î °Ë»çÇØ º»´Ù. ¸¸¾à µî·ÏµÇ¾î ÀÖÁö ¾Ê´Ù¸é CREATESTRUCT·Î Àü´ÞµÈ this Æ÷ÀÎÅ͸¦ Á¶»çÇÏ¿© °´Ã¼¸¦ µî·ÏÇϴµ¥ µµ¿ì¹ÌÀÇ AddObject°¡ ÀÌ ÀÏÀ» ÇÑ´Ù. ±×¸®°í ÀÌ ¸Þ½ÃÁö¸¦ ±×´ë·Î °´Ã¼ÀÇ OnMessage ÇÔ¼ö·Î Àü´ÞÇÑ´Ù.

ÀÌÈĺÎÅÍ ¸Þ½ÃÁö°¡ Àü´ÞµÇ¸é ShowMsgProcÀº °´Ã¼ ¸Ê¿¡¼­ °´Ã¼ Æ÷ÀÎÅ͸¦ Á¶»çÇÑ ÈÄ ÀÌ °´Ã¼ÀÇ OnMessage·Î 󸮸¦ ³Ñ°ÜÁØ´Ù.