<µµÅ¥¸ÕÆ®¿Í ¸ÖƼ ºä°£ÀÇ Åë½Å>

ÇϳªÀÇ µµÅ¥¸ÕÆ®¿Í ¼¼ °³ÀÇ ºä(View)°¡ Àִµ¥, ÀÌ  ¼¼ °³ÀÇ ºä(ÇϳªÀÇ ºä¸¦ ¼¼ °³°¡ ³ª´©¾î ¾¹´Ï´Ù)°¡ ÇϳªÀÇ µµÅ¥¸ÕÆ®¸¦ °øÀ¯Çϸ鼭 ¼­·ÎÀÇ ¾×¼Ç(action)À» °¨ÁöÇÏ°Ô ÇÏ°í ½Í½À´Ï´Ù. ¿¹¸¦ µé¸é ¾Æ¿ô·è ÀͽºÇÁ·¹½º ¸ÞÀÏ(Outlook Express Mail)ó·³ ¸Þ½ÃÁöÀÇ Çì´õ°¡ ³ª¿ÍÀÖ´Â ºä(¸®½ºÆ® ÄÁÆ®·Ñ ºä)¿¡¼­ ÇϳªÀÇ Çì´õ¸¦ ¼±ÅÃÇÏ¸é ±× Çì´õ¿¡ ÇØ´çµÇ´Â ³»¿ëÀ» ´Ù¸¥ ºä(Æû ºä)·Î Ãâ·ÂÇÏ°í ½Í½À´Ï´Ù. À̶§ ¸®½ºÆ® ÄÁÆ®·Ñ ºä´Â ¾î¶² ¹æ½ÄÀ¸·Î Æû ºä¿¡ ÀÚ½ÅÀÇ ÇൿÀ» ¾Ë·ÁÁÖ´ÂÁö¿ä?

¸ÕÀú °¢ÀÚÀÇ ¿ªÇÒÀ» Á¤È®È÷ ±¸ºÐÇØ º¸°Ú½À´Ï´Ù. µµÅ¥¸ÕÆ®´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ °¡Á®¾ß ÇÏ´Â Á¤º¸¸¦ ÀúÀåÇÏ´Â ¿ªÇÒÀ» Çϸç ÀÚ½ÅÀ» Ç¥ÇöÇÏ´Â ºäÀÇ ¸®½ºÆ®¸¦ °ü¸®ÇÕ´Ï´Ù. ±×¸®°í ºä´Â ÀڱⰡ º¸¿©ÁÙ Á¤º¸¸¦ °¡Áö°í ÀÖ´Â µµÅ¥¸ÕÆ®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °¡Áö°í ÀÖÀ¸¸ç, È­¸éÀÌ °»½ÅµÉ ¶§ ÀڱⰡ Ç¥½ÃÇØ¾ßÇÒ Á¤º¸¸¦ ±×¸³´Ï´Ù. º¸Åë ½º¸ôÅäÅ©¿¡¼­ »ç¿ëÇÏ´Â MVC ±¸Á¶ Áß C¿¡ ÇØ´çÇÏ´Â ÄÁÆ®·ÑÀº MFC¿¡¼­´Â µ¶¸³ÀûÀ¸·Î ¼³°èµÇ¾î ÀÖÁö ¾Ê½À´Ï´Ù. ÀϹÝÀûÀ¸·Î ºä°¡ ÄÁÆ®·ÑÀÇ ¿ªÇÒÀ» ¸Ã°Ô µÇÁö¿ä.
ÀÌ·± ±¸Á¶·Î ÇÁ·Î±×·¥À» © °æ¿ì¿¡´Â ´ÙÀ½°ú °°Àº ¿øÄ¢À» ÁöÄÑ¾ß ÇÒ °ÍÀÔ´Ï´Ù.

¨ç µµÅ¥¸ÕÆ®´Â Á¤º¸¸¦ °ü¸®ÇÏ´Â ¿ªÇÒ¸¸À» ÇØ¾ß Çϸç Àý´ë·Î ºä¿¡ ³ªÅ¸³¯ °ÍÀ» Á÷Á¢ ±×¸®¸é ¾ÈµË´Ï´Ù.
¨è ºä´Â µµÅ¥¸ÕÆ®¿¡¼­ ÀڱⰡ ÇÊ¿äÇÑ Á¤º¸¸¦ °¡Á®´Ù°¡ È­¸é¿¡ ±×¸®´Â ¿ªÇÒ¸¸À» ÇØ¾ß Çϸç Àý´ë·Î µµÅ¥¸ÕÆ®ÀÇ ³»¿ëÀ» Á÷Á¢ ¼ÕºÁ¼­´Â ¾ÈµË´Ï´Ù. ¶ÇÇÑ Á¤º¸¸¦ °¡Á®´Ù°¡ ±×¸± ¶§µµ µÉ ¼ö ÀÖÀ¸¸é °¢ Á¤º¸¸¦ Ç¥ÇöÇÏ´Â °´Ã¼¿¡°Ô ±×¸®±â¸¦ ¿äÃ»ÇØ¾ßÁö Á÷Á¢ °´Ã¼ÀÇ Á¤º¸¸¦ Àоî´Ù°¡ È­¸é¿¡ ±×¸®´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾Ê½À´Ï´Ù.
¨é ÄÁÆ®·ÑÀÇ ¿ªÇÒÀ» ÇÏ´Â ºä´Â »ç¿ëÀÚ°¡ ¾î¶² µ¿ÀÛÀ» ÇßÀ» °æ¿ì µµÅ¥¸ÕÆ®¿¡ ÀÌ »ç°Ç¿¡ ´ëÇÑ Ã³¸®¸¦ ¿äÃ»ÇØ¾ßÁö Á÷Á¢ ±× »ç°ÇÀ» ó¸®Çؼ­´Â ¾ÈµË´Ï´Ù.

ÀÌ·¯ÇÑ ÀÔÀå¿¡¼­ º¸¾ÒÀ» ¶§, À§ ¹®Á¦¿¡ ´ëÇÑ ÇØ°áÃ¥À» ´ÙÀ½°ú °°ÀÌ Á¦½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.

¨ç ¸ÕÀú ¸®½ºÆ® ºä¿¡¼­ »ç¿ëÀÚ°¡ ¹º°¡¸¦ ¼±ÅÃÇÏ¸é ±× Á¤º¸¸¦ µµÅ¥¸ÕÆ®¿¡°Ô º¸³»¸é¼­ ÀÌ¿¡ ´ëÇÑ Ã³¸®¸¦ ¿äûÇÕ´Ï´Ù(¿¹¸¦ µé¸é ¼±ÅÃÇÑ ÁÙÀÇ À§Ä¡³ª ¹®ÀÚ¿­ Á¤º¸¸¦ ³Ñ°ÜÁָ鼭 µµÅ¥¸ÕÆ®ÀÇ À̺¥Æ® Çڵ鷯¸¦ ºÎ¸£´Â °ÍÀÔ´Ï´Ù).
¨è ±×·¯¸é µµÅ¥¸ÕÆ®´Â À̸¦ ó¸®Çϰí(¿¹¸¦ µé¸é ¼±ÅÃÇÑ ÁÙÀÇ À§Ä¡¿¡ µû¶ó ÇöÀç ¼±ÅÃµÈ ¾ÆÆ¼Å¬À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ º¯°æÇÑ´Ù´ø°¡ ÇÏ´Â ÀÛ¾÷) ¸ðµç ºä¿¡°Ô ³» Á¤º¸°¡ ¹Ù²î¾úÀ¸´Ï ¾Ë¾Æ¼­ È­¸éÀ» °íÄ¡¶ó°í ½ÅÈ£¸¦ º¸³À´Ï´Ù(À̶§ º¸Åë UpdateAllViews()¸¦ »ç¿ëÇÕ´Ï´Ù).
¨é °¢ ºä°¡ °»½ÅÇ϶ó´Â ½ÅÈ£¸¦ ¹ÞÀ¸¸é(º¸Åë OnUpdate()¿¡¼­ ó¸®ÇÏÁö¿ä) ÆÄ¶ó¹ÌÅ͸¦ º¸°í ÀÚ½ÅÀÌ Ã³¸®ÇØ¾ß ÇÏ´Â Á¤º¸ÀÎÁö¸¦ ÆÇ´ÜÇÕ´Ï´Ù. ¸¸¾à ÀÚ½ÅÀÌ Ã³¸®ÇØ¾ß ÇÏ´Â Á¤º¸¶ó¸é µµÅ¥¸ÕÆ®¿¡¼­ °ü·Ã Á¤º¸¸¦ Àоî´Ù°¡ ÀڱⰡ ´ã´çÇÑ È­¸éÀ» °íĨ´Ï´Ù.

 

 <¸â¹ö ÇÔ¼ö¿¡¼­ ´Ù¸¥ ÇÔ¼öÀÇ Æ÷ÀÎÅÍ È£Ãâ>

C++ ÀÔ¹®ÀÚÀÔ´Ï´Ù. ¸â¹ö ÇÔ¼ö¿¡¼­ ´Ù¸¥ ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ¾î¶»°Ô ºÒ·¯¿Í¾ß ÇÒ±î¿ä? ´Ù¸¥ ÇÔ¼öÀÇ Æ÷ÀÎÅÍ´Â ±»ÀÌ ¸â¹ö ÇÔ¼öÀÏ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. Àú´Â Áö±Ý 'C'¿¡¼­ »ç¿ëÇß´ø signal ÇÔ¼ö¸¦ »ç¿ëÇÏ·Á°í Çϴµ¥¿ä, ¾Æ½Ã°ÚÁö¸¸ ÀÎÀÚ·Î ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¹ÞÁö ¾Ê½À´Ï±î? ±×·±µ¥ ±×°ÍÀ» C++¿¡ ±×´ë·Î Àû¿ëÇÏ·Á´Ï Àß µÇÁö°¡ ¾Ê½À´Ï´Ù.

class staticÀ¸·Î ÇÔ¼ö¸¦ Çϳª ¸¸µé¾î ¾²´Â °ÍÀÌ ÁÁÀ» µíÇÕ´Ï´Ù. ´ÙÀ½ÀÇ Äڵ带 ÂüÁ¶Çϼ¼¿ä.

class CThread : public CObject {
     ...
     class thr_args {
          public:
          CThread *the_thread;
          CObject *arg;
          void (CThread::*handler)(CObject *);
     };

     static void *
     startup(void *arg) {
          thr_args *t = (thr_args *)arg;

          t->the_thread->result = t->the_thread->run(t->arg);
          delete t;
          return 0;
     }
     ...
};

<API·Î ÆÄÀÏ ¿ÀÇ ´ëÈ­»óÀÚ ¶ç¿ì±â>

MFC¸¦ ¾²Áö ¾Ê°í ÆÄÀÏ ¿ÀÇ ´ëÈ­»óÀÚ¸¦ ¶ç¿ì·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÏ´ÂÁö ¾Ë°í ½Í½À´Ï´Ù.

´ÙÀ½Àº Á¦°¡ API·Î ÇÁ·Î±×·¡¹ÖÇÒ ¶§ ¾²´Â ¹æ¹ýÀÔ´Ï´Ù. ¸¸¾à¿¡ .AVI ÆÄÀÏÀ» ·ÎµåÇÏ´Â °æ¿ì¶ó¸é ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.

void FileOpen(HWND hWnd, char szFileName[], OPENFILENAME * ofn)
{
     static char szTitleName[_MAX_FNAME + _MAX_EXT];

     ofn->lStructSize = sizeof(OPENFILENAME);
     ofn->hInstance = NULL;

     ofn->lpstrFilter = "AVI Files(*.AVI)\0*.avi\0ALL Files(*.*)\0*.*\0\0";
     ofn->lpstrCustomFilter = NULL;

     ofn->nMaxCustFilter = 0;

     ofn->nMaxFile = _MAX_PATH;
     ofn->nMaxFileTitle = _MAX_FNAME + _MAX_EXT;

     ofn->lpstrInitialDir = NULL;
     ofn->lpstrTitle = NULL;

     ofn->nFileOffset = 0;
     ofn->nFileExtension = 0;

     ofn->lpstrDefExt = "raw";
     ofn->lCustData = 0L;
     ofn->lpfnHook = NULL;
     ofn->lpTemplateName = NULL;

     ofn->hwndOwner = hWnd;
     ofn->lpstrFile = szFileName;
     ofn->lpstrFileTitle = szTitleName;
     ofn->Flags = OFN_CREATEPROMPT;
}

ÆÄÀϸíÀ» ¼±ÅÃÇØÁÙ ¶§´Â ¿©±â¼­ lpstrFilter ºÎºÐÀ» °íÃÄÁÖ¸é µË´Ï´Ù.

 

<ÇÚµéÀ̶õ ¹«¾ùÀΰ¡¿ä>

ºñÁÖ¾ó C++¿¡¼­ ¸®¼Ò½ºÂÊÀ» °øºÎÇϰí ÀÖ½À´Ï´Ù. ¸®¼Ò½º ID¸¦ Àμö·Î ¹Þ¾Æ¼­ Ä¿¼­ÀÇ ÇÚµéÀ» ¸®ÅÏÇÑ´Ù°í Çϴµ¥, ÀÌ°Ô ¹«½¼ ¸»ÀÎÁö Àß ¸ð¸£°Ú½À´Ï´Ù. ÀÏÁ¾ÀÇ ¿î¿ë ±ÇÇÑ °°Àº °ÍÀΰ¡¿ä? ±×¸®°í ¸â¹ö ÇÔ¼ö ¼±¾ð ½Ã const·Î ¼±¾ðÇÏ¸é °ªÀ» ¹Ù²Ü ¼ö ¾ø´Ù°í Çϴµ¥, Help ÆÄÀÏÀ» Àо¸é Read Only¶ó°í µÇ¾î ÀÖ´õ±º¿ä. ÀÌ´Â Çüº¯È¯À» ¸øÇÏ´Â°Ô ¾Æ´Ï°í ÇÔ¼ö°¡ ÇÑ ¹ø ¹Þ¾ÆµéÀÎ °ªÀ» ¹Ù²Ü ¼ö ¾ø´Ù´Â ¸»Àΰ¡¿ä?

È­¸éÀ̳ª ÇÁ¸°ÅÍ °°Àº ±×·¡ÇÈ Ãâ·Â ÀåÄ¡¿¡ ±×¸®±â¸¦ ¿øÇÏ´Â °æ¿ì, ¸Ç ¸ÕÀú µð¹ÙÀ̽º ÄÁÅýºÆ®(DC)¿¡ ´ëÇÑ ÇÚµéÀ» ¾ò¾î¾ß ÇÕ´Ï´Ù. ÇÁ·Î±×·¥¿¡¼­ ÀÌ ÇÚµéÀ» ÁÖ´Â °ÍÀº ±× ÀåÄ¡¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï À©µµ¿ì°¡ Çã¶ôÇÏ´Â °ÍÀÌÁö¿ä. À̾ ±×¸®±â ¿øÇÏ´Â ÀåÄ¡¸¦ À©µµ¿ì¿¡°Ô ¾Ë¸®±â À§ÇØ GDI ÇÔ¼ö¿¡ ÀÎÀÚ·Î ÇÚµéÀ» Æ÷ÇÔÇÏ´Â ½ÄÀÔ´Ï´Ù. Áï ÇÚµéÀ̶õ ¾î¶°ÇÑ °ÍÀ» Á¶Àý, ¿î¿ëÇÒ(Çڵ鸵) ¼ö ÀÖ´Â °´Ã¼¶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù.
±×¸®°í constÇüÀ̶õ ±× º¯¼öÀÇ °ªÀ» º¯È­½Ãų ¼ö ¾ø´Â º¯¼ö¶õ ¶æÀÔ´Ï´Ù. ¸¸ÀÏ A¶ó´Â ÇÔ¼ö¸¦ 'A(char *szStr)'¶ó´Â ½ÄÀ¸·Î ¸¸µé¸é ÀÌ ÇÔ¼ö ¾È¿¡¼­ szStrÀ» ¸¶À½´ë·Î º¯È­½Ãų ¼ö°¡ ÀÖ½À´Ï´Ù. ±×·¯³ª 'A(const char *szStr)'¶ó°í ¸¸µé¾î ¹ö¸®¸é szStrÀ» °¡°øÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ¾î¶² Ŭ·¡½º¿¡¼­ ƯÁ¤ÇÑ ¸É¹ö º¯¼ö¸¦ ¾²°í Àִµ¥ °¡»ó ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù°í »ó»óÇÒ ¶§ ÀÌ °¡»ó ÇÔ¼ö¿¡¼­´Â ÀÌ º¯¼ö¸¦ ´ÜÁö ÂüÁ¶¸¸ ÇØ¾ß ÇÑ´Ù´Â °¡Á¤À» ÇÑ´Ù¸é ´ç¿¬È÷ ±× º¯¼ö ŸÀÔ¿¡ const¸¦ ³Ö¾î¼­ ¼±¾ðÀ» ÇÕ´Ï´Ù. ¸¸ÀÏ ÀÌ ¼±¾ðÀ» ÇÏÁö ¾ÊÀ¸¸é °¡»ó ÇÔ¼ö¿¡¼­ ±× ¸É¹ö º¯¼ö¸¦ ¸¶À½´ë·Î Á¶ÀÛÇØ ÀÌ»óÇÑ °á°ú¸¦ ÃÊ·¡ÇÒÁöµµ ¸ð¸¨´Ï´Ù.

 

<º£À̽º Ŭ·¡½º ¹Ù²Ù´Â ¹æ¹ý>

AppWizard¿¡¼­ Dialog Based·Î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇߴµ¥, ±âº» ºä(View)°¡ CDialog¿¡¼­ »ó¼Ó¹ÞÀº °ÍÀÌÁö ¾Ê½À´Ï±î? À̰ÍÀ» CPropertySheet·Î ¹Ù²Ù°í ½ÍÀºµ¥ ¾î¶»°Ô ÇØ¾ß ÇÒÁö ¸ð¸£°Ú½À´Ï´Ù.

±×³É Class Wizard¿¡¼­ CPropertySheet¸¦ º£À̽º Ŭ·¡½º·Î »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µç ´ÙÀ½ CxxxApp Ŭ·¡½ºÀÇ InitInstance() ÇÔ¼ö¿¡¼­

CxxxDlg dlg;
m_pMainWnd &dlg;
int nResponse = dlg.DoModal();
if(nResponse == IDOK){
}
else if(nResponse == IDCANCEL){
}

ÀÌ ºÎºÐÀ» »õ·Î ¸¸µç Ŭ·¡½º·Î ÀûÀýÈ÷ ¿¬°áÇØ¼­ ¾²¸é µË´Ï´Ù. ¿ø·¡ ÀÖ´ø CxxxDlg Ŭ·¡½º´Â º° Çʿ䰡 ¾ø½À´Ï´Ù. ±×°Ç WorkspaceÀÇ FileView¿¡¼­ xxxDlg.cppÇϰí xxxDlg.h¸¦ Áö¿ì¸é(Del Ű) ClassView¿¡¼­µµ ¾ø¾îÁý´Ï´Ù.

 

<ÇÁ·Î±×·¥ ½ÃÀÛ ½Ã ÇÑ/¿µÅ°ÀÇ º¯È¯>

ÇÁ·Î±×·¥À» ½ÇÇàÇϸ鼭 ¿µ¹® »óŸ¦ ÇÑ±Û »óÅ·Π¹Ù²Ù·Á°í Çϴµ¥, ÇÑ¿µ ÀüȯÀº ¾î¶»°Ô ÇÏ¸é µÇ´ÂÁö¿ä.

CRichEditView¿¡¼­ WM_CREATE ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¶§ ¾Æ·¡¿Í °°Àº Äڵ带 Ãß°¡ÇØ ÇÑ±Û »óÅ·Π¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù. Âü°í·Î ÄÄÆÄÀÏÀ» ÇÏ·Á¸é imm.h¿Í imm32.lib°¡ Æ÷ÇԵǾî ÀÖ¾î¾ß ÇÕ´Ï´Ù.

HIMC hImc;
DWORD dwConversion, dwSentence;

hImc = ImmGetContext(GetSafeHwnd());
ImmGetConversionStatus(hImc, &dwConversion, &dwSentence);

if (!(dwConversion & IME_CMODE_HANGEUL))
     ImmSetConversionStatus(hImc, dwConversion | IME_CMODE_HANGEUL, dwSentence);

 

<´ÙÀ̾ó·Î±×¹Ú½º¸¦ Áß¾Ó¿¡ ¿À°Ô ÇÏ·Á¸é>

´ÙÀ̾ó·Î±×¹Ú½º ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸®¼Ò½º¿¡ ÀÖ´Â ´ÙÀ̾ó·Î±×¹Ú½º¸¦ Çϳª ¶ç¿ü½À´Ï´Ù. À̸¦ ºÎ¸£´Â À©µµ¿ì°¡ ÀÌ ´ÙÀ̾ó·Î±×¹Ú½ºÀÇ ºÎ¸ð À©µµ¿ì°¡ µÉ ÁÙ ¾Ë¾Ò´Âµ¥, ÇØ´ç ´ÙÀ̾ó·Î±× ¹Ú½ºÀÇ ÇÁ·Î½ÃÀú¿¡¼­ GetParent¸¦ ÇØº¸´Ï±î Àß ¾ÈµË´Ï´Ù. ´ÙÀ̾ó·Î±×¹Ú½º¸¦ ¿ø·¡ À©µµ¿ì À§¿¡ ÇÑ °¡¿îµ¥ ¶ç¿ì·Á¸é ¾î¶»°Ô ÇØ¾ßÇÏ´ÂÁö¿ä.

´ÙÀ½°ú °°Àº ¹æ¹ýÀ» ÅëÇØ ´ÙÀ̾ó·Î±×¹Ú½º¸¦ Áß¾Ó¿¡ ¿Àµµ·Ï ÇÒ ¼ö ÀÖ½À´Ï´Ù.

HWND hwndOwner;
RECT rc, rcDlg, rcOwner;

case WM_INITDIALOG:

if ((hwndOwner = GetParent(hwndDlg)) == NULL)
     hwndOwner = GetDesktopWindow();

GetWindowRect(hwndOwner, &rcOwner);
GetWindowRect(hwndDlg, &rcDlg);
CopyRect(&rc, &rcOwner);

OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
OffsetRect(&rc, -rc.left, -rc.top);
OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);

SetWindowPos(hwndDlg, HWND_TOP, rcOwner.left + (rc.right / 2), rcOwner.top + (rc.bottom / 2),
    0, 0, // Å©±âÀμö¸¦ÀνÄÇÑ´Ù
    SWP_NOSIZE);

if (GetDlgCtrlID((HWND) wParam) != ID_ITEMNAME) {
     SetFocus(GetDlgItem(hwndDlg, ID_ITEMNAME));
     return FALSE;
}
return TRUE;