<ÇÁ·Î±×·¥ ½ÃÀ۽à About¹Ú½º¸¦ Ç¥½ÃÇÏ·Á¸é>

 MFC 5.0À» »ç¿ëÇØ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§ ÇÁ·Î±×·¥ÀÇ ¼ÒÀ¯±ÇÀÚ¸¦ º¸¿©ÁÖ´Â About box¸¦ ¶ç¿ì°í ½Í½À´Ï´Ù.   

About¹Ú½ºÀÇ ¾Ë°í¸®ÁòÀ» »ìÆìº¸¸é »ý°¢º¸´Ù ½±½À´Ï´Ù. ¸ÕÀú About¹Ú½º¸¦ »ý¼ºÇÏ·Á¸é ´ÙÀ̾ó·Î±×¸¦
¸ðµé¸®½º(modeless)·Î ¸¸µé¾î¾ß ÇÕ´Ï´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø About¹Ú½º´Â À©µµ¿ì°¡ ¶ç±â Àü¿¡ ÀÚµ¿À¸·Î
³ªÅ¸³³´Ï´Ù. À̶§ »ç¿ëÀÚ°¡ ¸¶¿ì½º Ŭ¸¯Çϰųª ۸¦ ÀÔ·ÂÇϸé ÇÁ·Î±×·¥ ¿ÀºêÁ§Æ®ÀÇ
PreTranslateMessage ¸Þ½îµå°¡ È£ÃâµÇ´Âµ¥, ÀÌ ¸Þ½îµå´Â À©µµ¿ì°¡ About¸¦ Á¦°øÇÏ´ÂÁö üũÇϰí
»ç¿ëÀÚÀÇ ÀÔ·ÂÀÌ ÀÖÀ¸¸é About¹Ú½º¸¦ ¼Ò¸ê½Ãŵ´Ï´Ù.

¸¸¾à »ç¿ëÀÚ°¡ 5Ãʰ£ ±â´Ù¸®¸é OnIdle ¸Þ½îµå°¡ È£ÃâµÇ°í, À©µµ¿ì¸¦ ¼Ò¸ê½Ãų ½Ã°£ÀÌ °æ°úÇß´ÂÁö
üũÇÕ´Ï´Ù. ÀÌ·± ½ÄÀ¸·Î È帧À» ÀâÀ¸¸é µË´Ï´Ù. ´ÙÀ½À» Âü°íÇϼ¼¿ä.

  BOOL CSampleApp::PreTranslateMessage(MSG* pMsg){
      BOOL bResult = CWinApp::PreTranslateMessage(pMsg);
      if (m_splash.m_hwnd != NULL &&
      (pMsg->message ==WM_KEYDOWN ||
      pMsg->message == WM_SYSKEYDOWN ||     
      pMsg->message == WM_LBUTTONDOWN ||
      pMsg->message == WM__RBUTTONDOWN ||
      pMsg->message == WM__MBUTTONDOWN ||
      pMsg->message == WM__NCLBUTTONDOWN ||
      pMsg->message == WM__NCRBUTTONDOWN ||
      pMsg->message == WM__NCMBUTTONDOWN)){
          m_splash.DestoryWindow();
          m_pMainWnd->UpdateWindow();
      }
      return bResult;
  }

 <ÀÔ·Â ÄÁÆ®·Ñ¿¡¼­ Çã¿ëÇÏ´Â ¹®ÀÚ Á¦ÇÑÇϱâ>

MFC 5.0À» »ç¿ëÇØ ÀÔ·Â ÄÁÆ®·Ñ¿¡ ¼ýÀÚ¸¸ Ãâ·ÂÇϵµ·Ï Á¶Á¤ÇÏ°í ½Í½À´Ï´Ù.  

 CEdit¿¡¼­ Ŭ·¡½º¸¦ ÆÄ»ýÇØ WM_CHAR ¸Þ½ÃÁö¸¦ ó¸®Çϸé ÀÔ·Â ÄÁÆ®·Ñ¿¡¼­ ƯÁ¤ ¹®ÀÚ¸¸ ÀԷ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. ¿ì¼± Ŭ·¡½ºÀ§Àúµå¸¦ »ç¿ëÇØ CEdit¿¡¼­ ÆÄ»ýµÈ Ŭ·¡½º¸¦ »ý¼ºÇÑ ÈÄ ´ëÈ­»óÀÚÀÇ Å¬·¡½º¿¡¼­ ¸â¹ö º¯¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù. ±×¸®°í OnInitDialog¿¡¼­ CWnd::SubclassDlgItemÀ» È£ÃâÇØ ÀÔ·Â ÄÁÆ®·ÑÀ» ¼­ºê Ŭ·¡½ÌÇÏ¸é µË´Ï´Ù.

  //´ëÈ­»óÀÚ Å¬·¡½º ¼±¾ð¹®
  Private :
      CMyEdit m_wndEdit; //»õ·Î¿î ÀÔ·Â ÄÁÆ®·ÑÀÇ ÀνºÅϽº
  //´ëÈ­»óÀÚ Å¬·¡½º ±¸ÇöÀÎ .CPP ÆÄÀÏ
  BOOL CSampleDialog::OnInitDialog(){
     ....
     //ÀÔ·Â ÄÁÆ®·ÑÀ» ¼­ºê Ŭ·¡½ÌÇÑ´Ù.
      m_wndEdit.SubclassDlgItem(IDC_EDIT, this);
      ...
  }

 ÀÌÁ¨ Ŭ·¡½ºÀ§Àúµå¸¦ »ç¿ëÇØ WM_CHAR ¸Þ½ÃÁö¸¦ ó¸®ÇÏ¸é µË´Ï´Ù. ¸ÕÀú nChar Àμö¸¦ Æò°¡ÇØ ¾î¶² µ¿ÀÛÀ» ¼öÇàÇÒ °ÍÀÎÁö ÁöÁ¤ÇØ¾ß Çϴµ¥ ¼±Åÿ¡ µû¶ó ¹®ÀÚ°¡ Ãâ·ÂµÇÁö ¾Ê°Ô, ¶Ç´Â ¹®ÀÚ¸¦ ±×´ë·Î Àü´ÞÇϰųª ¹®ÀÚ¸¦ º¯°æÇØ Àü´ÞÇÒ ¼ö ÀÖ½À´Ï´Ù.
 Áú¹®Ã³·³ nChar¸¦ ¼ýÀÚ·Î Á¦ÇÑÇÏ°í ½Í´Ù¸é CWnd::OnChar¿¡ Àü´ÞÇϰí, ±×·¸Áö ¾Ê´Ù¸é
CWnd::OnChar¸¦ È£ÃâÇÏÁö ¾ÊÀ¸¸é µË´Ï´Ù.

  //¼ýÀÚ¸¸ Ãâ·ÂÇÑ´Ù.
  void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
      //nChar°¡ ¼ýÀÚÀÎÁö È®ÀÎÇÑ´Ù.
     if(IsCharAlphaNumeric(TCHAR)nChar) && !IsCharAlpha((TCHAR)nChar))
           CEdit::OnChar(nChar, nRepCnt, nFlags);

´õ ³ª¾Æ°¡ ¹®ÀÚ¸¦ º¯°æÇÏ·Á¸é º¯°æµÈ nChar Àμö¸¸À» Àü´ÞÇÏ¸é µÇ´Âµ¥, À̶§ Àý´ë CEdite::OnChar¸¦ È£ÃâÇØ¼­´Â ¾ÈµË´Ï´Ù. ¿Ö³ÄÇϸé CEdite::OnChar¿¡¼­ wParam°ú lParamÀ» óÀ½ °ªÀ¸·Î ä¿ì´Â CWnd::Default¸¦ ºÎ¸£±â ¶§¹®ÀÔ´Ï´Ù. µû¶ó¼­ nChar¸¦ º¯°æÇϰí CWnd::DefWindowProc¸¦ È£ÃâÇÕ´Ï´Ù. ¹æ¹ýÀº ´ÙÀ½°ú °°½À´Ï´Ù.

  //¸ðµç ¹®ÀÚ¸¦ ´ë¹®ÀÚ·Î ¸¸µç´Ù.
  void CMyedit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){
      //¹®ÀÚ¸¦ ±×´ë·Î º¯È¯ÇÑ´Ù.
      if (IsCharAlpha((TCHAR)nChar))
           nChar = toupper(nChar);
       //±âº»ÀûÀÎ OnChar ÇÔ¼ö¸¦ ¹«½ÃÇϰí, À©µµ¿ì ±âº» ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÑ´Ù.
      DefWindowProc(WM_CHAR, nChar, MAKEPARAM(nRepCnt,nFlags))
  }

 

<MFC È®Àå DLLÀ̶õ?>

 DLLÀ» °øºÎÇÏ´Ù º¸´Ï MFC È®Àå DLLÀ̶ó´Â ¿ë¾î°¡ ³ª¿É´Ï´Ù. Win32 DLL°úÀÇ Â÷ÀÌÁ¡ÀÌ ÀÖ³ª¿ä?

 ¾ÖÇø®ÄÉÀÌ¼Ç À§Àúµå´Â DLLÀÇ Äڵ带 MFC È®Àå DLL·Î ±¸¼ºÇϰí ÀÖ½À´Ï´Ù. À̰ÍÀº ±âÁ¸ MFC Ŭ·¡½º¿¡¼­ ÆÄ»ýµÈ Àç»ç¿ë °¡´ÉÇÑ Å¬·¡½º¸¦ ±¸ÇöÇÑ DLLÀÔ´Ï´Ù. ±×·¯¹Ç·Î »ç¿ëÀÚ´Â MFC Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â °Í°ú °°Àº ¹æ¹ýÀ¸·Î È®Àå DLLÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
 ´Ù¸¸ È®Àå DLL¿¡´Â ¸î °¡Áö Á¦ÇÑÀÌ ÀÖ½À´Ï´Ù. ±×Áß Çϳª°¡ MFC ÀÀ¿ë ÇÁ·Î±×·¥À̾î¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù. °¡·É ´Ù¸¥ ¾ð¾î³ª Ŭ·¡½º ¶óÀ̺귯¸®(ºñÁÖ¾ó º£ÀÌÁ÷À̳ª º¼·£µåÀÇ OWL)·Î ¸¸µç ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏ·Á°í DLLÀ» »ý¼ºÇØ¾ß ÇÑ´Ù¸é È®Àå DLLÀ» »ý¼ºÇÒ Çʿ䰡 ÀüÇô ¾ø½À´Ï´Ù. ±×·¯³ª MFC·Î ¸¸µç ÀÀ¿ë ÇÁ·Î±×·¥¿¡´Â È®Àå DLLÀ» »ý¼ºÇØ¾ß ÇÕ´Ï´Ù.

 

<ĸ¼Ç ¿Ü¿¡ ´Ù¸¥ °÷À» Ŭ¸¯ÇØ À©µµ¿ì¸¦ À̵¿ÇÏ·Á¸é>

 ´ë°³ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì À©µµ¿ìÀÇ Ä¸¼Ç¹Ù ¿µ¿ªÀ» ¸¶¿ì½º·Î ´­·¯ À̵¿Çϴµ¥, ´Ù¸¥ °÷À» Ŭ¸¯Çؼ­´Â ¿Å±æ ¼ö ¾ø³ª¿ä?

 À©µµ¿ì´Â ¸¶¿ì½º À§Ä¡¸¦ °áÁ¤ÇÒ Çʿ䰡 ÀÖÀ» ¶§ À©µµ¿ì¿¡ WM_NCHITTEST ¸Þ½ÃÁö¸¦ Àü´ÞÇÕ´Ï´Ù. µû¶ó¼­ ¸¶¿ì½º°¡ âÀÇ Ä¸¼Ç¿¡ ÀÖ´Â °Íó·³ ÀνÄÇϵµ·Ï À©µµ¿ì¸¦ ¼ÓÀÌ¸é °£´ÜÈ÷ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸ÕÀú Ŭ·¡½ºÀ§Àúµå¸¦ »ç¿ëÇØ WM_NCHITTEST ¸Þ½ÃÁö¸¦ ó¸®Çϰí, ±âº» Ŭ·¡½º ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ¸¸¾à ÇÔ¼ö°¡ HTCLIENT¸¦ ¹ÝÈ¯ÇØ ¸¶¿ì½º°¡ Ŭ¶óÀÌ¾ðÆ® ¿µ¿ª¿¡ ÀÖ´Ù°í ÀÏ·¯ÁÖ¸é, À©µµ¿ì´Â ¸¶¿ì½º À§Ä¡¸¦ ĸ¼ÇÀ¸·Î ÀνÄÇØ HTCAPTIONÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù. ÄÚµå´Â ´ÙÀ½°ú °°½À´Ï´Ù.

  UINT CSampleDialog::ONNcHitTest(CPoint point) {
     UINT nHitTest = CDialog::OnNcHitTest(point);
     return(nHitTest == HTCLIENT)?HTCAPTION : nHitTest;
  }

ÇÏÁö¸¸ ÀÌ ¹æ¹ýÀº 2°¡Áö ´ÜÁ¡À» °®°í ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ Ŭ¶óÀÌ¾ðÆ® ¿µ¿ªÀ» ´õºíŬ¸¯ÇÒ ¶§ À©µµ¿ì°¡ ÃÖ´ëÈ­µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù´Â °Í°ú ºä¸¦ °®°í ÀÖ´Â ÇÁ·¹ÀÓ À©µµ¿ì¿¡¼­´Â Çã¿ëµÇÁö ¾Ê´Â´Ù´Â °ÍÀÔ´Ï´Ù. À̿ܿ¡µµ »ç¿ëÀÚ°¡ ¿ÞÂÊ ¸¶¿ì½º ´ÜÃ߸¦ ´©¸¦ ¶§ °¨ÁöÇØ ĸ¼Ç¹Ù¸¦ Ŭ¸¯ÇÑ °Íó·³ ÀνÄÇÏ°Ô ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ¼ÓÀÌ´Â ¹æ¹ýµµ ÀÖ½À´Ï´Ù. ÀÌ·± °æ¿ì Ŭ·¡½ºÀ§Àúµå¸¦ »ç¿ëÇØ ºä¿¡¼­ WM_LBUTTONDOWN ¸Þ½ÃÁö¸¦ ó¸®Çϰí, ÇÁ·¹ÀÓ À©µµ¿ì¿¡ ´ÜÃßÀÇ ´©¸§ »óŸ¦ HTCAPTIONÀ¸·Î ÁöÁ¤ÇØ WM_NCBUTTON ¸Þ½ÃÁö¸¦ Àü´ÞÇÕ´Ï´Ù.

  void CSampleView::OnLButtonDown(UINT nFlag, CPoint point) {
     CView ::OnButtonDown(nFlags, point);
     // »ç¿ëÀÚ°¡ ĸ¼ÇÀ» Ŭ¸¯ÇÑ °Íó·³ ÇÁ·¹ÀÓ À©µµ¿ì¸¦ ¼ÓÀδÙ.  
     GetParent()->PostMessage(WM_NCLBUTTONDOWN, HTCAPTION)
  }

Á»´õ ÀÀ¿ëÇÏ¸é ´ëÈ­»óÀÚ¿Í ´ëÈ­»óÀÚ ±â¹ÝÀÇ ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­µµ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ´Ü, CWnd::GetParent¿¡ ´ëÇÑ È£ÃâÀÌ ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù. ´ÙÀ½À» Âü°íÇϼ¼¿ä.

  void CSampleDialog::OnLButtonDown(UINT nFlag, CPoint point) {
      CDialog::OnLButtonDown(nFlag, point)   
     // »ç¿ëÀÚ°¡ ĸ¼ÇÀ» Ŭ¸¯ÇÑ °Íó·³ ÀÎ½ÄµÇ°Ô ²û ´ëÈ­»óÀÚ¸¦ ¼ÓÀÔ´Ï´Ù.  
     PostMessage(WM_NCLBUTTONDOWN, HTCAPTION,
         MAKEPRAM(point.x, point.y));
  }

<ÁÙ ´ÜÀ§·Î ²÷±â´Â CEditView¸¦ ¸¸µé·Á¸é>

 MFC·Î ¿¡µðÅ͸¦ ÀÛ¼ºÇÏ¸é ³ëÆ®ÆÐµå¿Í °°ÀÌ <Enter>۸¦ Ä¡Áö ¾Ê´Â ÀÌ»ó ÁÙÀÌ ²÷±âÁö ¾Ê½À´Ï´Ù. È­¸é ¿µ¿ªÀ» ¹þ¾î³¯ °æ¿ì ´ÙÀ½ ÁÙ·Î ³Ñ¾î°¡´Â ¿¡µðÅ͸¦ ¸¸µé°í ½Í½À´Ï´Ù.

 ¸ÕÀú ES_AUTOHSCROLL°ú WS_HSCROLL ½ºÅ¸ÀÏ ºñÆ®¸¦ Ãë¼ÒÇÕ´Ï´Ù. ±×·± ´ÙÀ½ CWnd::PreCreateWindow¸¦ ¿À¹ö¶óÀ̵ùÇϰí CREATESTRUCT ±¸Á¶Ã¼¸¦ º¯°æÇÏ¸é µË´Ï´Ù. ´Ù¸¸ ÁÖÀÇÇÒ Á¡Àº CEditView::PreCreateWindow´Â cs.style ÀÌ ¼³Á¤µÅ ÀÖÀ¸¹Ç·Î º¯°æÇÏ·Á¸é ±âº» Ŭ·¡½ºÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ ÈÄ cs.style À» ¹Ù²ã¾ß ÇÕ´Ï´Ù.

//ÀÔ·Â ºä¿¡¼­ ´ÙÀ½ ÁÙ·Î ²÷¾î Ãâ·ÂÇÏ´Â ±â´ÉÀ» Áö¿øÇÑ´Ù.
BOOL bResult =
        CEditView::PreCreateWindow(cs);
cs.style &= (ES_AUTOHSCROLL | WS_HSCROLL);
return Result;

 ½ÇÇà½Ã ÀÌ ±â´ÉÀ» Àüȯ(toggle)ÇÏ´Â °ÍÀº ´õ¿í º¹ÀâÇÕ´Ï´Ù. ÇöÀç À©µµ¿ìÀÇ ÀڷḦ ÀúÀåÇØ¾ß Çϰí, À©µµ¿ì¸¦ ÆÄ±«Çϰí Á¤È®ÇÑ ½ºÅ¸ÀÏÀÇ »õ·Î¿î À©µµ¿ì¸¦ »ý¼ºÇÑ ÈÄ ÀڷḦ º¹±¸ÇÒ Çʿ䰡 Àֱ⠶§¹®ÀÔ´Ï´Ù. ºñÁÖ¾ó C++°ú ÇÔ²² Á¦°øµÇ´Â ½´ÆÛ ÆÐµå ¿¹Á¦¿¡¼­ CPadView::SetWordWrap ¸Þ½îµå¸¦ Âü°íÇϸé ÀÌÇØÇϱ⠽¬¿ï °ÍÀÔ´Ï´Ù.

 

<»óÅÂ¹Ù¿Í Åø¹ÙÀÇ Æ÷ÀÎÅÍ ¾ò±â>

 MFC·Î »óÅÂ¹Ù¿Í Åø¹Ù¸¦ Á¶ÀÛÇÏ´Â ÇÁ·Î±×·¥À» ÇÏ´Ùº¸´Ï ÀÌµé Æ÷ÀÎÅͰ¡ ÇÊ¿äÇÑ °æ¿ì°¡ ¸¹½À´Ï´Ù. ¾îµð¼­µç ¾òÀ» ¼ö ¾øÀ»±î¿ä?

 ÇÁ·¹ÀÓ¿÷Àº ±âº»ÀûÀ¸·Î ¸ÞÀÎ ÇÁ·¹ÀÓÀÇ ÇÏÀ§ À©µµ¿ì·Î »óÅÂ¹Ù¿Í Åø¹Ù¸¦ »ý¼ºÇÕ´Ï´Ù. »óŹٴ AFX_IDW_STATUS_BAR ¶ó´Â ½Äº°ÀÚ¸¦, Åø¹Ù´Â AFX_IDW_TOOLBAR ¶ó´Â ½Äº°ÀÚ¸¦ °¡Áý´Ï´Ù. ´ÙÀ½Àº AfxGetMainWnd ¿Í ÇÔ²² CWnd:: GetDescendantWindow¸¦ È£ÃâÇØ ÀÌ·¯ÇÑ ÇÏÀ§ À©µµ¿ì¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò´Â ¹æ¹ýÀ¸·Î Áú¹®ÇÑ µ¶ÀÚ¿Í °°Àº °æ¿ì ¿ä±äÇÏ°Ô ¾µ ¼ö ÀÖ½À´Ï´Ù.

// »óŹٿ¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù.
CStatusBar* pStatusBar =
      (CStatusBar*)AfxGetMainWnd() ->
   GetDescendantWindow(AFX_IDW_ATATUS_BAR);
// Åø¹Ù¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù.
CToolBar* pToolBar =
       (CToolBar *)AfxGetMainWnd() ->
   GetDescendantWindow(AFX_IDW_TOOLBAR);