ÇϳªÀÇ µµÅ¥¸ÕÆ®¿Í ¼¼ °³ÀÇ ºä(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;