<ÇÁ·Î±×·¥ ½ÃÀ۽à 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))
}
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);