ÀÌ ³ëÆ®¿¡¼´Â ´ÙÁß »ó¼Ó (MI) Microsoft Foundation Ŭ·¡½º¿Í ÇÔ²² »ç¿ë ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù¡£
¿Ö ´ÙÁß »ó¼Ó?
³» Áý °ª c + + ¹× °´Ã¼ ÁöÇâ Ä¿¹Â´ÏƼ¿¡ Áö¼ÓÀûÀÎ ³íÀïÀÌ ÀÖ´Ù. Visual c + + ÄÄÆÄÀÏ·¯¿Í °³¹ß ȯ°æ ¹Ì¸¦ ¿Ïº® ÇÏ °Ô Áö¿ø¡£
MFC Ŭ·¡½º ¶óÀ̺귯¸® ¼³°è µÇ¾ú½À´Ï´Ù MFC¸¦ »ç¿ë ÇÏ ¿© ¸¶ÀÏÀ» ÀÌÇØÇÒ ÇÊ¿ä´Â ¾ø½À´Ï´Ù. ¹Ì½Ã°ÇÀº MFC Ŭ·¡½º¿¡¼ »ç¿ë µÇÁö ¾Ê½À´Ï´Ù. ¿ì¸® ¹Ì Ŭ·¡½º ¶óÀ̺귯¸®¸¦ ÀÛ¼º ÇÏÁö ¾Ê¾Æµµ ¾øÀ¸¸ç ±×°Í ½É°¢ÇÑ ÀÀ¿ë ÇÁ·Î±×·¥À» ÀÛ¼º Çϱâ À§ÇÑ ÇÊ¿äÇÑ °ÍÀ¸·Î ³ªÅ¸³µ½À´Ï´Ù. ¹Ì »ç¿ë ¼ö °³ÀÎ °áÁ¤, ±×·¡¼ ¿ì¸®´Â ´ç½Å¿¡ °Ô ±× °áÁ¤À» µÎ°í¡£
±×·¡¼ ´ç½ÅÀÌ »ç¿ë ¹Ì?
¹Ì¸¦ »ç¿ë ÇÏ ¿© ¼º´É Àå´ÜÁ¡À» ÀÌÇØ ÇÏ °í MFC¸¦ »ç¿ë ÇÏ´Â ¹æ¹ýÀ» ÀÌ¹Ì ¾Ë°í ÀÖ´Ù¸éÀÌ technote¸¦ ¼öÇà ÇØ¾ß ÇÕ´Ï´Ù ¸»ÇÒ °Í ÀÌ´Ù. Á¦ÇÑ »çÇ× Áß ÀϺδ ÀϹÝÀûÀÎ c + + Á¦ÇÑ, ´Ù¸¥ MFC ¾ÆÅ°ÅØÃ³¿¡ ÀÇÇØ ºÎ°ú µÈ´Ù.
´ÙÀ½ ÀϺÎÀÇ ¹Ì ÀϹÝÀûÀÎ MFC °ü¿ë±¸ÀÇ »ç¿ë¿¡ ¹ÌÄ¡´Â ¿µÇâÀÇ ±â¼úÀûÀÎ ¹®Á¦ ¼³¸í ÇÕ´Ï´Ù. ¸¶ÀÏÀ» »ç¿ë ÇÏ ¿© ¿ÏÀü ÇÑ MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Æ÷ÇÔ µÇ¾î ÀÖ´ÂÀÌ ±â¼ú ³ëÆ®ÀÇ ³¡¿¡ ÃßÃâ ¼ö ¹× ÄÄÆÄÀÏ¡£
CRuntimeClass
²ö±â¿Í MFCÀÇ µ¿Àû °³Ã¼ »ý¼º ¸ÞÄ¿´ÏÁò CRuntimeClass µ¥ÀÌÅÍ ±¸Á¶¸¦ »ç¿ë ÇÏ ¿© Ŭ·¡½º¸¦ °íÀ¯ ÇÏ °Ô ½Äº° ÇÕ´Ï´Ù. MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ °¢ µ¿Àû ¹×/¶Ç´Â serializable Ŭ·¡½º¿Í ÀÌ·¯ÇÑ Á¾·ùÀÇ ÇϳªÀÇ ±¸Á¶¸¦ ¿¬°áÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ±¸Á¶´Â AFX_CLASSINITÇü½ÄÀÇ Æ¯º° ÇÑ Á¤Àû °³Ã¼¸¦ »ç¿ë ÇÏ ¿© ÀÀ¿ë ÇÁ·Î±×·¥ ½ÃÀÛ ½Ã ÃʱâÈ µË´Ï´Ù. ´ç½ÅÀÌ ÇÊ¿ä °ÆÁ¤ ÇÏÁö ÀÚ½ÅÀÌ Á¤º¸ ±¸ÇöÀ¸·Î MFCÀÇ ¹öÀü °£¿¡ º¯°æ µÉ °¡´É¼ºÀÌ¡£
ÇöÀç ±¸ÇöÀÇ CRuntimeClass ´ÙÁß »ó¼Ó ·±Å¸ÀÓ Çü½Ä Á¤º¸¸¦ Áö¿ø ÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ ¶æ ¹Ì MFC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù ÀÖÁö¸¸ µÑ ÀÌ»óÀÇ ±âº» Ŭ·¡½º °³Ã¼¿¡¼ ÀÛ¾÷ÇÒ ¶§ ƯÁ¤ Ã¥ÀÓÀ»°¡Áö°í °ÍÀÔ´Ï´Ù ÇÒ °æ¿ì,¡£
CObject::IsKindOf ¸â¹ö ÇÔ¼ö¸¦ ¿Ã¹Ù¸£°Ô È®ÀÎ ÇÏÁö °³Ã¼ÀÇ Çü½ÄÀ» ¿©·¯ ±âº» Ŭ·¡½º¿¡ ÀÖ´Â °æ¿ì. µû¶ó¼, CObject °¡»ó ±âº» Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù ±×¸®°í ¸ðµç È£ÃâÀÌ Serialize ¹× »õ·Î¿î ¿¬»êÀÚ ¿Í °°Àº ¸â¹ö ÇÔ¼ö°¡ CObject ´Â c + +¿¡´Â ÀûÀý ÇÑ ÇÔ¼ö È£Ãâ ¸íÈ®È÷ ±¸ºÐ ¼ö ÀÖµµ·Ï ¹üÀ§ ÇÑÁ¤ÀÚ¸¦ °¡Á®¾ß ÇÒ °Í ÀÌ´Ù. MFC ³»¿¡¼ ¹Ì¸¦ »ç¿ëÇÒ Çʿ䰡 ÀÖÀ¸¸é ´ÙÀ½ ÇØ¾ß CObject ±âº» Ŭ·¡½ºÀÇ ±âº» Ŭ·¡½º ¸ñ·Ï¿¡¼ °¡Àå ¿ÞÂÊ Å¬·¡½º¸¦ Æ÷ÇÔ Çϴ Ŭ·¡½º¸¦ ¸¸µé ¼ö¡£
¹ÌÀÇ ³²¿ë ¹× »ç¿ë¿¡ ´ë ÇÑ Á¶¾ð, °í±Þ c + + ÇÁ·Î±×·¡¹Ö ½ºÅ¸Àϰú ¼÷¾î James O. Coplien (¾Öµð½¼ ¿þ½½¸®, 1992)¸¦ ÂüÁ¶ ÇϽʽÿÀ.
CObject-¸ðµç Ŭ·¡½ºÀÇ ·çÆ®
¾Ë´Ù½ÃÇÇ, ¸ðµç Áß¿ä ÇÑ Å¬·¡½º CObjectŬ·¡½º¿¡¼ Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀ¸·Î ÆÄ»ý µË´Ï´Ù. CObject ±¸¼º¿ø µ¥ÀÌÅÍ´Â ¾øÁö¸¸ ¸î °¡Áö ±âº» ±â´ÉÀ» °¡Áö°íÁö ¾Ê½À´Ï´Ù. ¸¶ÀÏÀ» »ç¿ë ÇÏ´Â °æ¿ì µÎ °³ ÀÌ»óÀÇ CObject¿¡¼ »ó¼Ó¿¡ °øÅë µÉ °ÍÀÔ´Ï´Ù-ÆÄ»ý Ŭ·¡½º´Â CFrameWnd ¹× CObList:
cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
...
};
CListWnd myListWnd
ÀÌ °æ¿ì¿¡ CObject Æ÷ÇÔ µÇ¾î µÎ ¹ø, µÎ ¹®Á¦¿¡ À̸£°Ô:
myListWnd.Dump(afxDump);
nbsp;? / / ÄÄÆÄÀÏ Å¸ÀÓ ¿À·ù, CFrameWnd::Dump ¶Ç´Â CObList::Dump(&N)
±ÇÀå µÇ´Â ´Ü°è
ÆÄ»ý µÈ ±âº» Ŭ·¡½º¸¦ µÎ °³ ÀÌ»óÀÇ CObject °¡Áø »õ Ŭ·¡½º¸¦ ¸¸µå´Â °æ¿ì »ç¿ë ÇÏ´Â »ç¶÷µéÀ» ±â´ë ±× CObject ¸â¹ö¸¦ ´Ù½Ã ±¸Çö. »õ ¿¬»êÀÚ ¹× »èÁ¦ ´Â Çʼö, ¼ö ´ýÇÁ ÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. ¿¹¸¦ µé¾î:
cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
°ø°³:
nbsp;? void * new ¿¬»êÀÚ (size_t nSize)
?????? {¹Ýȯ CFrameWnd::operator new(nSize);}
?? void ¿¬»êÀÚ delete (void * p)
?????? {CFrameWnd::operator delete(p);}
void ´ýÇÁ (CDumpContent & dc)
?????? {CFrameWnd::Dump(dc);
???????? CObList::Dump(dc); }
??? ...
}
CobjectÀÇ °¡»ó »ó¼Ó?
¿äûÇÒ ¼ö ÀÖ½À´Ï´Ù "»ç½Ç»ó Cobject¸¦ »ó¼Ó ÇÏ´Â °æ¿ì ¾ÊÀ» ¸ðµç ¸ðÈ£¼º ¹®Á¦ ¶°³ª?"¡£
È¿À²ÀûÀÎ Microsoft °³Ã¼ ¸ðµ¨¿¡µµ °¡»ó »ó¼Ó (¸¶Âù°¡Áö·Î ´ÙÁß »ó¼ÓÀº °æ¿ì¿¡ µû¶ó ´ÜÀÏ »ó¼ÓÀ¸·Î È¿À²ÀûÀ¸·Î) ºñ °¡»ó »ó¼ÓÀ¸·Î È¿À²ÀûÀÔ´Ï´Ù. °¡»ó »ó¼Ó ÀÌÈÄ CObject¿¡ ¾ø´Â ±¸¼º¿ø µ¥ÀÌÅÍ, ±âº» Ŭ·¡½º ¸â¹ö µ¥ÀÌÅÍÀÇ ¿©·¯ º¹»çº»À» ¹æÁö Çϱâ À§ÇØ ÇÊ¿ä ÇÏÁö ¾Ê½À´Ï´Ù.
ÁøÂ¥ ´ë´äÀº ¾Æ´Ï, °¡»ó »ó¼Ó À§ÀÇ ±×¸² ¸ðÈ£¼º ¹®Á¦°¡ ÇØ°á µÇÁö °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¸é: ´ýÇÁ °¡»ó ¸â¹ö ÇÔ¼ö´Â ¿©ÀüÈ÷ ¸ðÈ£ (ÀÌÈÄ CFrameWnd ¹× CObList ´Ù¸£°Ô ±¸Çö)¡£
µû¶ó¼ ÁÁ½À´Ï´Ù À§ÀÇ ´Ü°è¿¡ µû¶ó ¸íÈ®¼ºÀ» Á¦°ø Çϱâ À§ÇØ:
CObject::IsKindOf ¹× ·±Å¸ÀÓ ÀÔ·Â
CObject ¿¡¼ MFC¿¡ ÀÇÇØ Áö¿ø µÇ´Â ·±Å¸ÀÓ ÀÔ·Â ¸ÞÄ¿´ÏÁò DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE IMPLEMENT_DYNCREATE, DECLARE_SERIAL , IMPLEMENT_SERIAL¸ÅÅ©·Î »ç¿ë ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¾ÈÀü ij½ºÆ® ´Ù¿î½º ¼ö ÀÖµµ·Ï ·±Å¸ÀÓ Çü½Ä °Ë»ç¸¦ ÇÒ ´É·ÂÀ» ÁÙ¡£
ÀÌ·¯ÇÑ ¸ÅÅ©·Î¸¸ ´ÜÀÏ ±âº» Ŭ·¡½º¸¦ Áö¿ø ÇÏ °í °öÇϱ⠻ó¼Ó µÈ Ŭ·¡½º¿¡ ´ë ÇÑ Á¦ÇÑ µÈ ¹æ½ÄÀ¸·Î ÀÛµ¿ ÇÕ´Ï´Ù. IMPLEMENT_DYNAMIC ¶Ç´Â IMPLEMENT_SERIAL ¿¡¼ ÁöÁ¤ ÇÏ´Â ±âº» Ŭ·¡½º¿¡´Â ù ¹øÂ° (°¡Àå ¿ÞÂÊ) ±âº» Ŭ·¡½º À̾î¾ß ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î,
cListWnd Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CObList
{
nbsp;? DECLARE_DYNAMIC(CListWnd)
?? ...
};
IMPLEMENT_DYNAMIC (CListWnd, CFrameWnd)(&N)
°Í¸¸À¸·Î °¡Àå ¿ÞÂÊ ±âº» Ŭ·¡½º¿¡ ´ë ÇÑ °Ë»ç¸¦ ÀÔ·Â ÇÒ ¼ö ÀÖ½À´Ï´Ù. ·±Å¸ÀÓ Çü½Ä ½Ã½ºÅÛ Ãß°¡ ±âÁö (CObList ÀÌ °æ¿ì)¿¡ ´ëÇØ ¾Æ¹«°Íµµ ¾Ë °Í ÀÌ´Ù¡£
CWnd ¹× ¸Þ½ÃÁö ¸Ê
MFC ¸Þ½ÃÁö ¸Ê ½Ã½ºÅÛ ¿Ã¹Ù¸£°Ô ÀÛµ¿ Çϵµ·Ï Çϱâ À§Çؼ´Â, °Å±â¿¡ µÎ °³ÀÇ Ãß°¡ ¿ä±¸ »çÇ×:
À§ÀÇ ¿¹Á¦¿¡¼ CFrameWnd ´Â ù ¹øÂ° ±âº» Ŭ·¡½ºÀÔ´Ï´Ù.
ÀÛµ¿ ÇÏÁö ¾Ê´Â ¸î °¡Áö ¿¹:
cTwoWindows Ŭ·¡½º: °ø¿ë CFrameWnd, °ø°ø CEdit
nbsp;? { ... };
?????? / / ¿À·ù: CwndÀÇ µÎ º¹»çº»
CListEdit Ŭ·¡½º: °ø¿ë CObList, °ø°ø CEdit
?? { ... };
?????? / / ¿À·ù: CEdit (Cwnd¿¡¼ ÆÄ»ý) ù ¹øÂ° ¿©¾ß ÇÕ´Ï´Ù(&N).
¸¶ÀÏÀ» »ç¿ë ÇÏ ¿© »ùÇà ÇÁ·Î±×·¥
´ÙÀ½ ¿¹Á¦´Â CFrameWnd CWinApp¿¡¼ ÆÄ»ý µÈ Ŭ·¡½ºÀÇ ±¸¼º µÈ µ¶¸³ ½ÇÇàÇü ÀÀ¿ë ÇÁ·Î±×·¥ÀÔ´Ï´Ù. ÀÌ ¹æ¹ýÀ¸·Î ÀÀ¿ë ÇÁ·Î±×·¥À» ±¸Ãà ±ÇÀå, ÇÏÁö¸¸ ÀÌ°Ç ÇϳªÀÇ Å¬·¡½º¿Í ÀÛÀº MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¿¹¡£
´ÙÀ½ ÇÁ·Î±×·¥À» Àß¶ó³»¾î HELLOAPP »ó´Ü¿¡ º¹»çÇÒ ¼ö ÀÖ½À´Ï´Ù.´ÜÀÏ »ó¼Ó MFC ÀÏ¹Ý »ùÇÿ¡ CPP HELLOAPP. ´ç½ÅÀÌ Á¤»óÀûÀ¸·Î ÇÁ·Î±×·¥À» ±¸Ãà¡£
#include <afxwin.h>
class CHelloAppAndFrame : public CFrameWnd, public CWinApp
{
public:
CHelloAppAndFrame()
{ }
// Necessary evil for MI disambiguity
void* operator new(size_t nSize)
{ return CFrameWnd::operator new(nSize); }
void operator delete(void* p)
{ CFrameWnd::operator delete(p); }
// Implementation
// CWinApp overrides
virtual BOOL InitInstance();
// CFrameWnd overrides
virtual void PostNcDestroy();
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CHelloAppAndFrame, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
// since the frame window is not allocated on the heap, we must
// override PostNCDestroy not to delete the frame object
void CHelloAppAndFrame::PostNcDestroy()
{
// do nothing (do not call base class)
}
void CHelloAppAndFrame::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
CString s = "Hello, Windows!";
dc.SetTextAlign(TA_BASELINE | TA_CENTER);
dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkMode(TRANSPARENT);
dc.TextOut(rect.right / 2, rect.bottom / 2, s);
}
// Application initialization
BOOL CHelloAppAndFrame::InitInstance()
{
// first create the main frame
if (!CFrameWnd::Create(NULL, "Multiple Inheritance Sample",
WS_OVERLAPPEDWINDOW, rectDefault))
return FALSE;
// the application object is also a frame window
m_pMainWnd = this;
ShowWindow(m_nCmdShow);
return TRUE;
}
CHelloAppAndFrame theHelloAppAndFrame;
±â¼ú ³ëÆ® ¹øÈ£·Î |nbsp; Ä«Å×°í¸®º° ±â¼ú ³ëÆ®(&N)