Visual C++ tutorial
ʶһѵ¡ÃÃÁ Document/View (Document/View architecture)

ʶһѵ¡ÃÃÁ Document/View ¤×ÍÍÐäÃ?
¡ÒÃà¢Õ¹â»Ãá¡ÃÁ´éÇ MFC ã¹ÃÐÂÐáá æ ¹Ñé¹ ¨Ðà¢Õ¹àËÁ×͹ ã¹µÑÇÍÂèÒ§â»Ãá¡ÃÁ ·ÕèàÃÒä´é¡ÅèÒÇä»áÅéÇ㹺·µé¹ æ ¤×Í ã¹â¤é´â»Ãá¡ÃÁ ¨Ð»ÃСͺ´éÇ Çѵ¶Øà»éÒËÁÒ (object) ÍÂÙè 2 ª¹Ô´ ¤×Í
â´Â Applcation object ¨Ð·Ó˹éÒ·Õè㹡Òà ÊÃéҧ˹éÒµèÒ§ËÅÑ¡ (Frame Windows) ¢Í§â»Ãá¡ÃÁ¢Öé¹ÁÒ áÅéÇ˹éÒµèÒ§ËÅÑ¡¹Õé ¡ç¨Ð·Ó˹éÒ·Õè 㹡ÒèѴ¡ÒÃà¡ÕèÂǡѺ ¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ·Ñé§ËÁ´ àªè¹¡ÒÃÃѺ message ¨Ò¡àÁÒÊìËÃ×ͤÕÂìºÍÃì´ ¡ÒÃáÊ´§¼Åº¹ ˹éÒµèÒ§ËÅÑ¡ ¡ÒÃà¡çº¤èÒµÑÇá»ÃµèÒ§ æ áÅÐÍ×è¹ æ ÍÕ¡ÁÒ¡ÁÒ ¨ÐàËç¹ÇèÒ ¡ÒÃà¢Õ¹â»Ãá¡ÃÁ ã¹ÅѡɳÐẺ¹Õé ÀÒÃСÒ÷ӧҹ ·Ñé§ËÁ´¢Í§â»Ãá¡ÃÁ ¨ÐÍÂÙèÀÒÂã¹ ¤ÅÒÊ·ÕèÊ׺·Í´¨Ò¡ CFrameWnd ¹Õé «Öè§¶éÒâ»Ãá¡ÃÁ ·Õèà¢Õ¹¢Öé¹ ÁÕ¢¹Ò´ãË­è ¡ç¨ÐÁÕ¤ÇÒÁÂØè§ÂÒ¡ 㹡ÒÃà¢Õ¹â¤é´ à¾ÔèÁÁÒ¡¢Öé¹
´Ñ§¹Ñé¹ ã¹ MFC µÑé§áµèÃØè¹·Õè 2.0 à»ç¹µé¹ÁÒ ä´éÁÕ¡ÒÃá¹Ð¹Ó ʶһѵ¡ÃÃÁẺãËÁè¢Öé¹ÁÒ «Öè§ÁÕª×èÍàÃÕ¡ÇèÒ Ê¶Ò»ÑµÂ¡ÃÃÁ Document/View (Document/View architecture) â´ÂÁըش»ÃÐʧ¤ì à¾×èͨÐáºè§Êèǹ¢Í§â»Ãá¡ÃÁ ÍÍ¡à»ç¹Êèǹ æ â´Â¨ÐãËéÊèǹ·Õèà»ç¹¢éÍÁÙÅ ¢Í§â»Ãá¡ÃÁ ¶Ù¡á¡ÍÍ¡¨Ò¡ Êèǹ·Õèà»ç¹¡ÒÃáÊ´§¼Å¢Í§â»Ãá¡ÃÁ «Öè§ã¹¡ÒùÕé¨ÐÁÕ¡ÒÃà¾ÔèÁ¤ÅÒÊ à¢éÒÁÒã¹â»Ãá¡ÃÁ ÍÕ¡ 2 ¤ÅÒÊ ¤×ͤÅÒÊ ·ÕèÊ׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CDocument ãªé㹡ÒèѴ¡ÒáѺ¢éÍÁÙÅ ¢Í§â»Ãá¡ÃÁ áÅФÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CView ËÃ×ͤÅÒÊ ·Õèà»ç¹Í¹Ø¾Ñ¹¸ì (derivative) ¢Í§¤ÅÒÊ CView «Öè§ãªé㹡ÒèѴ¡Òà à¡ÕèÂǡѺ¡ÒÃáÊ´§¼Å ÍÍ¡Áҷҧ˹éÒµèÒ§ ¢Í§â»Ãá¡ÃÁ Êèǹ¤ÅÒÊ CFrameWnd ¨ÐÅ´¤ÇÒÁÊӤѭŧ à»ç¹à¾Õ§˹éÒµèÒ§ ·ÕèºÃèØË¹éÒµèÒ§¢Í§ ¤ÅÒÊ CView äÇéÀÒÂã¹à·èÒ¹Ñé¹ â´Â¤ÇÒÁÊÑÁ¾Ñ¹¸ì¢Í§ ¤ÅÒÊ·Ñé§ 4 ¤ÅÒÊ ¨Ðà»ç¹´Ñ§áÊ´§ã¹ÃÙ»µèÍ仹Õé


˹éÒ·Õè¢Í§¤ÅÒÊ·Ñé§ 4 ¤ÅÒÊ ã¹Ê¶Ò»ÑµÂ¡ÃÃÁ Document/View ¨ÐáÊ´§´Ñ§µÒÃÒ§µèÍ仹Õé
¤ÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡
˹éÒ·Õè
CDocument à¡çº¢éÍÁÙÅáÅШѴ¡ÒáѺ¢éÍÁÙŢͧâ»Ãá¡ÃÁ
CView à»ç¹Ë¹éÒµèÒ§áÊ´§¼Å·ÕèÇÒ§·ÑºÍÂÙ躹 client area ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ ·Ó˹éÒ·ÕèáÊ´§¼Å áÅÐÃѺ message ·Õèà¡Ô´¢Öé¹ÀÒÂ㹺ÃÔàdz client area ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ
CFrameWnd à»ç¹Êèǹ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ·ÕèºÃÃ¨Ø Ë¹éÒµèÒ§¢Í§ CView äÇéÀÒÂã¹ ¹Í¡¨Ò¡¹ÕéÂѧ ¨Ñ´¡ÒÃà¡ÕèÂǡѺ Tool bar áÅÐ Status bar ´éÇÂ
CWinApp ¤Çº¤ØÁ¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ à»ç¹¨Ø´àÃÔèÁµé¹¢Í§¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ


¢Ñ鹵͹àº×éͧµé¹¢Í§¡ÒÃà¢Õ¹â»Ãá¡ÃÁẺ Document/View
1. Ê׺·Í´¤ÅÒÊ·Ñé§ 4 ¤ÅÒÊ¢éÒ§µé¹ ÁÒ¨Ò¡¤ÅÒÊ CWinApp, CFrameWnd, CDocument, áÅÐ CView ËÃ×ͤÅÒÊ·ÕèÊ׺·Í´¨Ò¡ ¤ÅÒÊ CView Í×è¹ æ àªè¹ CEditView, CScrollView, ÏÅÏ
2. »ÃСÒÈãËé¤ÅÒÊ CFrameWnd, CDocument, áÅÐ CView ÁդسÊÁºÑµÔẺ Dynamic Creation
ã¹â»Ãá¡ÃÁẺ Document/View ¹Õé Çѵ¶Øà»éÒËÁÒ¢ͧ˹éÒµèÒ§â»Ãá¡ÃÁ (Frame Window), ¢éÍÁÙÅ (Document), áÅÐ˹éÒµèÒ§áÊ´§¼Å (View) ¨Ð¶Ù¡ÊÃéÒ§¢Öé¹áººªÑèǤÃÒǵ͹·Õèâ»Ãá¡ÃÁ·Ó§Ò¹ (Dynamically creation at run time) ¨Ö§¨Óà»ç¹·ÕèàÃÒ ¨Ðµéͧ¡Ó˹´ ãËé¤ÅÒÊ·ÕèÊ׺·Í´¨Ò¡ CFrameWnd, CDocument, Cview ÁդسÊÁºÑµÔẺ Dynamic Creation â´Â¡ÒÃãªé ¤ÓÊÑè§ÁÒâ¤Ã ´Ñ§µèÍ仹Õé
DECLARE_DYNCREATE(ClassName)
â´Â·Õè ClassName ¤×Í ª×èͧ͢¤ÅÒÊ·Õèµéͧ¡ÒÃãËéÁդسÊÁºÑµÔ Dynamic creation
¤ÓÊÑè§ DECLARE_DYNCREATE() ¹Õé¨ÐäÁèÁÕà¤Ã×èͧËÁÒ ";" (semi-colon) µèÍ·éÒ áÅШлÃСÒÈäÇéã¹â¤é´â»Ãá¡ÃÁ Êèǹ¢Í§¡ÒûÃСÒȤÅÒÊ ¹Ñè¹àͧ

àÁ×èÍ·Ó¡ÒûÃСÒÈãËé¤ÅÒÊ ÁդسÊÁºÑµÔ Dynamic creation àÃÕºÃéÍÂáÅéÇ ¡ç¨ÐµéͧÁÕ¡Òà à¾ÔèÁâ¤é´¤ÓÊÑè§ µèÍ仹Õé ŧä»ã¹â¤é´â»Ãá¡ÃÁ Êèǹ·ÕèãªéºÃÃÂÒ ÃÒÂÅÐàÍÕ´¢Í§¤ÅÒÊ´éÇÂ
IMPLEMENT_DYNCREATE(ClassName,BaseClassName)
â´Â·Õè ClassName ¤×ͪ×èͧ͢¤ÅÒÊ·Õèµéͧ¡ÒÃãËéÁդسÊÁºÑµÔ Dynamic creation
BaseClassName ¤×ͪ×èͤÅÒÊáÁè¢Í§¤ÅÒÊ ClassName

3. »ÃСÒȪ×èͿѧ¡ìªÑè¹áÅÐÃÒÂÅÐàÍÕ´¢Í§¿Ñ§¡ìªÑè¹ ·ÕèÊӤѭ æ ¢Í§¤ÅÒÊ CFrameWnd, CDocument, CView áÅÐ CWinApp
«Öè§àÃҨСÅèÒǶ֧ÃÒÂÅÐàÍÕ´¢Í§¿Ñ§¡ìªÑè¹·ÕèÊӤѭ 㹤ÅÒʵèÒ§ æ ´Ñ§µèÍ仹Õé

CFrameWnd
ÊÓËÃѺâ»Ãá¡ÃÁ ·Õèãªéʶһѵ¡ÃÃÁ Document/View Ẻàº×éͧµé¹·ÕèÊØ´¹Ñé¹ ã¹¤ÅÒʹÕé äÁè¨Óà»ç¹µéͧÁտѧ¡ìªÑè¹·ÕèÊӤѭ æ ã´ æ à¾ÃÒФÅÒʹÕé·Ó˹éÒ·Õè à»ç¹à¾Õ§ µÑǺÃÃ¨Ø View äÇéà·èÒ¹Ñé¹

CDocument
¤ÅÒÊ CDocument ¹Õé·Ó˹éÒ·Õèà¡ÕèÂǡѺ ¡ÒèѴ¡ÒÃà¡ÕèÂǡѺ¢éÍÁÙÅ ¢Í§µÑÇâ»Ãá¡ÃÁ¢Í§àÃÒ «Ö觨ÐÁտѧ¡ìªÑè¹·ÕèÊӤѭ æ ÍÂèÒ§¹éÍ 3 ¿Ñ§¡ìªÑè¹ ¤×Í
- Serialize( ) ¿Ñ§¡ìªÑè¹¹Õé·Ó˹éÒ·Õè ÃѺ¼Ô´ªÍºã¹¡ÒÃà¢Õ¹ÍèÒ¹¢éÍÁÙšѺµÑÇà¡çº¢éÍÁÙÅẺ¶ÒÇà (persistance data storage) â´ÂÁÕÃٻẺ ´Ñ§¹Õé
void Serialize(CArchive& ar);
â´Â·Õè ar ¤×Í µÓá˹è§ã¹Ë¹èǤÇÒÁ¨Ó ·Õèãªéà¡çºÇѵ¶Øà»éÒËÁÒ¢ͧ¤ÅÒÊ CArchive äÇé

¿Ñ§¡ìªÑè¹¹Õé ¨Ð¶Ù¡àÃÕ¡ãªéâ´ÂÍѵâ¹ÁÑµÔ àÁ×èÍÁÕ¡ÒÃà¢Õ¹ÍèÒ¹¢éÍÁÙšѺ disk drive â´ÂÃٻẺ¡ÒÃãªé§Ò¹¿Ñ§¡ìªÑè¹¹Õé ¨Ðà»ç¹´Ñ§¹Õé
void CMyDocument::Serialize(CArchive& ar)
{
  if(ar.IsStoring( ))  // ¶éÒà»ç¹¡Òúѹ·Ö¡¢éÍÁÙÅŧ´Ôʤì
   {
      ar<< yourdata;   // ãªéâÍà»ÍÃìàÃàµÍÃì << 㹡ÒÃà¡çº¢éÍÁÙÅà¢éÒÇѵ¶Øà»éÒËÁÒ ar
     }
  else
    {
      ar>>yourdata;   // äÁèàªè¹¹Ñé¹ ãËéãªé >> 㹡ÒÃÍèÒ¹¢éÍÁÙŨҡÇѵ¶Øà»éÒËÁÒ ar ÁÒà¡çºäÇéã¹µÑÇá»Ã yourdata
     }
}    

â´Â·Õè µÑÇá»Ã·Õè¨Ð¶Ù¡¨Ñ´à¡çºâ´Â¡Òà overload operator >> ËÃ×Í << ¹Õé ¨Ðµéͧà»ç¹µÑÇá»Ã ¾×é¹°Ò¹àªè¹ int, UINT, float ËÃ×ͤÅÒʺҧ¤ÅÒÊ àªè¹ ¤ÅÒÊ CString à»ç¹µé¹ áµè¶éÒµÑÇá»Ã·Õè¶Ù¡¨Ñ´à¡çº à»ç¹ª¹Ô´·ÕèàÃÒ¡Ó˹´¢Öé¹àͧ ¡ç¨ÐäÁèÊÒÁÒöãªé operator >> ËÃ×Í << 㹡Ãкǹ¡Òà serialization ¹Õéä´é à¾×è͹ æ ¨Ðµéͧà¢Õ¹¿Ñ§¡ìªÑè¹ã¹¡Òà serialization àͧ

- OnNewDocument( ) à»ç¹¿Ñ§¡ìªÑè¹ ·Õè¨Ð¶Ù¡àÃÕ¡ãªé·Ø¡¤ÃÑé§ àÁ×èÍà»Ô´â»Ãá¡ÃÁẺ Document/View ¢Öé¹ÁÒà»ç¹¤ÃÑé§áá ËÃ×Í àÁ×èÍ àÃÒà»Ô´àÍ¡ÊÒÃãËÁè¢Öé¹ÁÒ à¾ÃÒÐã¹â»Ãá¡ÃÁẺ Document/View Ẻ SDI (Single Document Interface) ¨ÐÁÕ¡Òà ÊÃéÒ§Çѵ¶Øà»éÒËÁÒ ¢Í§¤ÅÒÊ CDocument ¢Öé¹ÁÒà¾Õ§¤ÃÑé§à´ÕÂÇ ã¹µÍ¹àÃÔèÁµé¹â»Ãá¡ÃÁ áÅШÐãªéÇѵ¶Øà»éÒËÁÒ¹Õé «éÓáÅéÇ«éÓÍÕ¡ ¨¹¡ÇèҨлԴâ»Ãá¡ÃÁŧ ´Ñ§¹Ñé¹ ã¹¡ÒáÓ˹´¤èÒµèÒ§ æ ãËé¡ÑºàÍ¡ÊÒÃãËÁè àÃÒäÁèÊÒÁÒö¨Ð¡Ó˹´äÇéã¹ constructor ¢Í§¤ÅÒÊ CDocument ¹Õéä´é à¾ÃÒШзÓãËéÁÕ¡ÒáÓ˹´¤èÒàÃÔèÁµé¹à¾Õ§¤ÃÑé§à´ÕÂÇ àÁ×è͵͹à»Ô´â»Ãá¡ÃÁ¤ÃÑé§ááà·èÒ¹Ñé¹ ´Ñ§¹Ñé¹àÃÒ¤Çèеéͧ à¢Õ¹â¤é´ã¹¡Òà ¡Ó˹´¤èÒàÃÔèÁµé¹ãËé¡ÑºàÍ¡ÊÒÃãËÁè â´Âà¢Õ¹â¤é´äÇé㹿ѧ¡ìªÑè¹ OnNewDocument( ) ¹Õéàͧ à¾ÃÒпѧ¡ìªÑè¹¹Õé ¨Ð¶Ù¡àÃÕ¡ãªé§Ò¹ ·Ø¡¤ÃÑé§ ·Õèà»Ô´â»Ãá¡ÃÁ¤ÃÑé§áá áÅзء¤ÃÑé§·Õèà»Ô´àÍ¡ÊÒÃãËÁè ´éǤÓÊÑè§ File -> New â´ÂÃٻẺ¢Í§¿Ñ§¡ìªÑè¹¹Õé à»ç¹´Ñ§¹Õé

BOOL OnNewDocument( );
â´Â¿Ñ§¡ìªÑè¹¹Õé ¨Ð¤×¹¤èÒµÑÇá»ÃẺ Boolean ¡ÅѺÁÒ â´Â¤èÒ¹Õé¨ÐäÁèà»ç¹ 0 ¶éҿѧ¡ìªÑè¹·Ó§Ò¹ÊÓàÃç¨ áµè¨Ð¤×¹¤èÒ 0 ¡ÅѺÁÒ ¶éҿѧ¡ìªÑè¹·Ó§Ò¹äÁèÊÓàÃç¨

â´ÂÀÒÂ㹿ѧ¡ìªÑè¹ OnNewDocument( ) ¹Õé àÃҨеéͧ·Ó¡ÒÃàÃÕ¡ãªé§Ò¹¿Ñ§¡ìªÑè¹¹Õé ¢Í§ Base class àÊÕ¡è͹ áÅéǨ֧·Ó¡ÒáÓ˹´ ¤èÒàÃÔèÁµé¹ ãËé¡ÑºàÍ¡ÊÒâͧàÃÒ ´Ñ§µÑÇÍÂèÒ§
BOOL CMyDocument :: OnNewDocument( )
 {
     if( ! CDocument::OnNewDocument( ) )  // ¶éÒ ¿Ñ§¡ìªÑè¹ OnNewDocument ¢Í§ base class ¤×¹¤èÒ 0 ¡ÅѺÁÒ
            return FALSE;                                        // ãËéÍÍ¡¨Ò¡¿Ñ§¡ìªÑè¹¹Õé áÅФ׹¤èÒ 0 ¡ÅѺ仴éÇÂ
//................ ãËé¡Ó˹´¤èÒàÃÔèÁµé¹ µèÒ§ æ ãËé¡ÑºàÍ¡ÊÒÃäÇéµÃ§¹Õé return TRUE; // ¤×¹¤èÒ TRUE ¡ÅÑºä» à¾×èͺ͡ÇèÒ ¿Ñ§¡ìªÑè¹¹Õé·Ó§Ò¹ÊÓàÃç¨ }

- UpDateAllViews ( ) à»ç¹¿Ñ§¡ìªÑè¹ ¢Í§¤ÅÒÊ CDocument ·Õèãªéàª×èÍÁâ§¡Ò÷ӧҹ¡Ñº¤ÅÒÊ CView â´Â¿Ñ§¡ìªÑè¹¹Õé ¨Ð à»ç¹µÑǺ͡¤ÅÒÊ CView ÇèÒ ãËé·Ó¡ÒÃà¢Õ¹˹éÒ¨ÍãËÁè àÃÒÁÑ¡¨ÐàÃÕ¡ãªé¿Ñ§¡ìªÑè¹¹Õé ËÅѧ¨Ò¡ ·Ó¡ÒÃà»ÅÕè¹á»Å§¢éÍÁÙÅ ·ÕèÍÂÙè㹤ÅÒÊ CDocument à¾×èÍ·ÓãËé¤ÅÒÊ CView áÊ´§¼Å¢éÍÁÙÅ ·Õèà»ÅÕè¹á»Å§ä»ãËé¶Ù¡µéͧ µÑÇÍÂèÒ§¡ÒÃãªé§Ò¹ ¿Ñ§¡ìªÑè¹¹Õé áÊ´§´Ñ§µèÍ仹Õé
// ¿Ñ§¡ìªÑè¹ÊÁÁµÔ ª×èÍ EditMyDocument ( )
void CMyDocument :: EditMyDocument(int data1, int data2 )
{
   my_data1 = data1;   // à»ÅÕè¹á»Å§¢éÍÁÙÅã¹ CDocument
   my_data2 = data2;

   UpdateAllViews( ); // ºÍ¡ãËé CView à¢Õ¹˹éÒ¨Í View àÊÕÂãËÁè
}

CView
¤ÅÒÊ CView ËÃ×ͤÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CView Í×è¹ æ àªè¹ CScrollView, CEditView, CRichEditView, CFormView µèÒ§¡ç ·Ó˹éÒ·Õèà»ç¹ ˹éÒµèÒ§·Õèãªé áÊ´§¼Å ¢éÍÁÙÅ·ÕèÍÂÙèã¹ CDocument ·Ñé§ÊÔé¹ àÃÒÊÒÁÒöàÅ×Í¡ãªéä´é µÒÁ¤ÇÒÁàËÁÒÐÊÁ ¡Ñº§Ò¹¢Í§àÃÒ áµèã¹·Õè¹Õé ¢Í͹حҵ ¾Ù´¶Ö§¤ÅÒʾ×é¹°Ò¹·ÕèÊØ´ ¤×Í CView àÊÕ¡è͹ â´Â¤ÅÒʹÕé ¨ÐÁտѧ¡ìªÑè¹·ÕèÊӤѭ ÍÂÙèÁÒ¡ÁÒ áµèÁտѧ¡ìªÑè¹·Õè¨Óà»ç¹ ÍÂÙè 2-3 ¿Ñ§¡ìªÑè¹ ¤×Í

- OnDraw( )
à»ç¹¿Ñ§¡ìªÑè¹ ·Õèãªéã㹡ÒÃÇÒ´ÊÔè§·Õèµéͧ¡Òà ŧº¹Ë¹éÒ¨Í View «Öè§ÁÕÃٻẺ¿Ñ§¡ìªÑè¹ ´Ñ§µèÍ仹Õé
void OnDraw( CDC* pDC )
â´Â·Õè pDC ¤×Í µÑǪÕéä»Âѧ Device context ·ÕèãªéÊÓËÃѺÇÒ´ÀÒ¾ËÃ×Í¢éͤÇÒÁŧº¹ CView

¿Ñ§¡ìªÑè¹¹Õé ¨Ð¶Ù¡àÃÕ¡â´ÂÍѵâ¹ÁÑµÔ àÁ×èÍ FrameWork µéͧ¡ÒÃÇÒ´ ¢éÍÁÙŠŧº¹Ë¹éÒµèÒ§ View (ËÃ×ÍàÁ×èÍÁÕ¡ÒÃàÃÕ¡¿Ñ§¡ìªÑè¹ UpdateAllViews ( ) ¨Ò¡â¤é´â»Ãá¡ÃÁ ã¹Êèǹ¢Í§ CDocument «Ö觨ÃÔ§ æ áÅéǨÐÁÕ¡Ãкǹ¡Òà Í×è¹ æ à¡Ô´¢Öé¹ÁÒ¡ÁÒ ¡è͹·Õè¨ÐàÃÕ¡ãªé¿Ñ§¡ìªÑè¹ OnDraw( ) ¹Õé áµèà¾×èÍãËé§èÒ µèÍ¡ÒÃ¨Ó ¨Ö§¢ÍàÇé¹äÇéäÁè¡ÅèÒǶ֧¹Ð¤Ð) â´ÂàÁ×èÍÁÕ¡ÒÃàÃÕ¡ãªé ¿Ñ§¡ìªÑè¹¹Õé Frame work ¨ÐÊ觤èÒµÑǪÕé pDC «Öè§à»ç¹µÑǪÕéä»Âѧ Device context ¢Í§Ë¹éÒµèÒ§ CView ¹ÕéÁÒãËéàÃÕºÃéÍÂáÅéÇ àÃÒÊÒÁÒöãªé pDC ¹Õé㹡ÒÃÇÒ´ÊÔè§·Õèµéͧ¡Òà ŧä»ã¹Ë¹éÒµèÒ§ CView ä´éàÅÂ

- GetDocument( ) à»ç¹¿Ñ§¡ìªÑè¹ÊÁÒªÔ¡¢Í§¤ÅÒÊ CView ·Õèãªé㹡ÒÃÃѺµÑǪÕéä»Âѧ¤ÅÒÊ CDocument à¾×èͨÐä´éà¢éÒ¶Ö§µÑÇá»Ã ËÃ×Ϳѧ¡ìªÑè¹µèÒ§ æ 㹤ÅÒÊ CDocument ä´é â´ÂÃٻẺ¿Ñ§¡ìªÑè¹ ´Ñ§µèÍ仹Õé
CDocument* GetDocument( );
â´Â¿Ñ§¡ìªÑè¹¹Õé ¨Ð¤×¹¤èÒ µÑǪÕéä»Âѧ CDocument ·Õèàª×èÍÁµè͡Ѻ¤ÅÒÊ CView ¹Õé áµè¶éÒäÁèÁÕ¤ÅÒÊ CDocument àª×èÍÁµè͡Ѻ¤ÅÒÊ CView ¹ÕéàÅ ¿Ñ§¡ìªÑè¹¹Õé¨Ð¤×¹¤èÒ NULL ¡ÅѺÁÒ

CWinApp
à»ç¹¤ÅÒʤǺ¤ØÁ¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁàÃÒ áÅÐà»ç¹¤ÅÒÊà´ÕÂÇã¹ 4 ¤ÅÒÊ·Õè¡ÅèÒÇ¢éÒ§µé¹ ·ÕèäÁèä´é»ÃСÒÈãËéÁÕ¡ÒÃÊÃéҧẺ Dynamic â´Â㹤ÅÒʹÕé ¡ç¨ÐÁտѧ¡ìªÑè¹ ·ÕèÊӤѭà¾Õ§¿Ñ§¡ìªÑè¹à´ÕÂǤ×Í InitInstance( ) «Öè§ãªé㹡Òà ÊÃéÒ§µé¹áºº¢Í§ Document/View ¢Öé¹ÁÒ â´ÂÀÒÂã¹ ¿Ñ§¡ìªÑè¹ InitInstance( ) ¨ÐÁÕâ¤é´â»Ãá¡ÃÁ ·ÕèÊӤѭ´Ñ§µèÍ仹Õé
BOOL CMyApp::InitInstance()
{
	CSingleDocTemplate* pTemplate = new CSingleDocTemplate(
                                                                                    IDR_MAINFRAME,
                                                                                   RUNTIME_CLASS(CMyDoc),
                                                                                   RUNTIME_CLASS(CMyFrame),
                                                                                   RUNTIME_CLASS(CMyView));

	AddDocTemplate(pTemplate);

	OnFileNew();

	return TRUE;
}

â¤é´â»Ãá¡ÃÁ¢éÒ§µé¹ à»ç¹â¤é´â»Ãá¡ÃÁÍÂèÒ§§èÒ·ÕèÊØ´ ·ÕèãªéÊÃéÒ§µé¹áºº (Template) ¢Í§â»Ãá¡ÃÁẺ Doc/View â´ÂÁÕ â¤é´¤ÓÊÑè§ ·ÕèÊӤѭ ¤×Í
	CSingleDocTemplate(   UINT nIDResource, 
                                                   CRuntimeClass* pDocClass, 
                                                   CRuntimeClass* pFrameClass, 
                                                   CRuntimeClass* pViewClass );
à»ç¹â¤é´¤ÓÊÑè§ã¹¡ÒÃÊÃéÒ§Çѵ¶Øà»éÒËÁÒ (object) ¢Í§¤ÅÒÊ CSingleDocTemplate ¢Öé¹ÁÒ â´Â¨ÐÁÕ¾ÒÃÒÁÔàµÍÃì·Õè¼èÒ¹ãËé ÍÂÙè 4 µÑǤ×Í
nIDResource ¤×ͤèÒ ID ¢Í§ Resource ·Õèãªéã¹â»Ãá¡ÃÁ¹Õé ·Ñé§ àÁ¹Ù, äͤ͹, µÒÃÒ§¤ÕÂìÅÑ´ (accelerator table), áÅÐ string resource
pDocClass µÑǪÕéä»ÂѧÇѵ¶Øà»éÒËÁÒÂẺ CRuntimeClass ¢Í§¤ÅÒÊ CDocument ¢Í§â»Ãá¡ÃÁ
pFrameClass µÑǪÕéä»ÂѧÇѵ¶Øà»éÒËÁÒÂẺ CRuntimeClass ¢Í§¤ÅÒÊ CFrameWnd ¢Í§â»Ãá¡ÃÁ
pViewClass µÑǪÕéä»ÂѧÇѵ¶Øà»éÒËÁÒÂẺ CRuntimeClass ¢Í§¤ÅÒÊ CView ¢Í§â»Ãá¡ÃÁ

â¤é´¤ÓÊÑè§·ÕèÊӤѭ ºÃ÷ѴµèÍÁÒ¤×Í AddDocTemplate( ); ãªéÊÓËÃѺà¾ÔèÁµé¹áººàÍ¡ÊÒà à¢éÒä»ã¹ÃÒ¡Òà µé¹áººàÍ¡ÊÒà (Document Template) ·Õèâ»Ãá¡ÃÁÊÒÁÒö ãªé§Ò¹ä´é «Öè§ÁÕÃٻẺ¤ÓÊÑ觴ѧ¹Õé
void AddDocTemplate( CDocTemplate* pTemplate );
â´Â·Õè pTemplate ¤×Í µÑǪÕéä»Âѧµé¹áººàÍ¡ÊÒà (Document Template) ·Õèµéͧ¡Òà à¾ÔèÁà¢éÒä» ã¹ÃÒ¡Òõé¹áººàÍ¡ÊÒà ·Õèâ»Ãá¡ÃÁ¹Õé ÊÒÁÒöãªé§Ò¹ä´é

â¤é´¤ÓÊÑè§·ÕèÊӤѭÍÑ¹ÊØ´·éÒ¤×Í OnFileNew( ) à»ç¹¿Ñ§¡ìªÑè¹ÊÁÒªÔ¡¢Í§¤ÅÒÊ CWinApp ãªéÊÓËÃѺÊÃéÒ§àÍ¡ÊÒÃà»ÅèÒ æ ¢Öé¹ÁÒ â´ÂÁÕÃٻẺ¤ÓÊÑ觴ѧ¹Õé
afx_msg void OnFileNew( );

4. à¾ÔèÁàÁ¹Ùà¢éÒä» ã¹ä¿ÅìÃÕ«Í÷ì â´Â¡Ó˹´¤èÒ ID Áҵðҹ ãËé¡ÑºàÁ¹ÙäÍà·çÁ (menu item) ·ÕèÊӤѭ
à¹×èͧ¨Ò¡ã¹ ¡ÒÃà¢Õ¹â»Ãá¡ÃÁâ´Âãªé ʶһѵ¡ÃÃÁ Document/View ¹Õé µÑÇ Frame work ¨ÐªèǨѴ¡ÒÃà¡ÕèÂǡѺ ¡Ò÷ӧҹ¾×é¹°Ò¹ ·Õ辺ä´éã¹â»Ãá¡ÃÁ·ÑèÇ æ ä» àªè¹ ¡ÒÃà»Ô´-»Ô´ä¿Å,ì ¡Òúѹ·Ö¡ä¿Åì, áÅСÒþÔÁ¾ì¢éÍÁÙÅ ÍÍ¡·Ò§à¤Ã×èͧ¾ÔÁ¾ì à¾×èͪèÇÂÅ´ÀÒÃР㹡ÒÃà¢Õ¹â¤é´ ¤ÓÊÑè§Å§ ´Ñ§¹Ñé¹ MFC ¨Ö§ä´é¡Ó˹´ ËÁÒÂàÅ¢ ID Áҵðҹ (Standard command IDs) ¢Öé¹ÁÒ «Öè§ àÁ×è͵ÑÇ Frame work ä´éÃѺáÁÊàʨ WM_COMMAND ·ÕèÁÕËÁÒÂàÅ¢ ID ·Õè¡Ó˹´äÇéáÅéǹÕé Êè§ÁÒãËé ¡ç¨Ð·ÓãËéÁÕ¡ÒÃàÃÕ¡ãªé ¿Ñ§¡ìªÑè¹·Õèà¡ÕèÂÇ¢éͧ ÁÒ·Ó§Ò¹â´ÂÍѵâ¹ÁÑµÔ ËÁÒÂàÅ¢ ID Áҵðҹ ¹ÕéÁÕÁÒ¡ÁÒÂËÅÒµÑÇ áµè¨Ð¢Í¡ ੾ÒзÕèÊӤѭ æ ÁҴѧáÊ´§ã¹ µÒÃÒ§µèÍ仹Õé

ID Áҵðҹ
¿Ñ§¡ìªÑè¹·Õè¨Ð¶Ù¡àÃÕ¡ãªé
àÃÕ¡ãªéâ´ÂÍѵâ¹ÁÑµÔ (Prewired) ËÃ×ÍäÁè?
ID_APP_EXIT CWinApp::OnAppExit( )
YES
ID_FILE_NEW CWinApp::OnFileNew( )
NO
ID_FILE_OPEN CWinApp::OnFileOpen( )
NO
ID_FILE_CLOSE CDocument::OnFileClose( )
YES
ID_FILE_SAVE CDocument::OnFileSave( )
YES
ID_FILE_SAVE_AS CDocument::OnFileSaveAs()
YES
ID_FILE_PRINT CView::OnFilePrint( )
NO
ID_FILE_PRINT_PREVIEW CView::OnFilePrintPreview( )
NO
ID_FILE_PRINT_SETUP CWinApp::OnFilePrintSetup()
NO

¨ÐàËç¹ä´éÇèÒ ¨Ò¡µÒÃҧ㹤ÍÅÑÁ¹ìÊØ´·éÒ ·ÕèáÊ´§Çèҿѧ¡ìªÑè¹¹Ñ鹨ж١àÃÕ¡ãªéâ´ÂÍѵâ¹ÁÑµÔ (Prewired) ËÃ×ÍäÁè ¶éÒà»ç¹ YES ËÁÒ¤ÇÒÁÇèÒ ¿Ñ§¡ìªÑè¹¹Ñé¹ ¨Ð¶Ù¡àÃÕ¡ãªéâ´ÂÍѵâ¹ÁÑµÔ àÁ×èÍÁÕ¡ÒÃÊè§ WM_COMMAND ·ÕèÁÕ ID ·Õè¡Ó˹´äÇéàªè¹ ID_APP_EXIT ÁÒãËé¡Ñº¤ÅÒÊ CWinApp â´ÂàÃÒäÁèµéͧ ´Ñ¡¨ÑºáÁÊàʨ ´éÇÂÁÒâ¤Ã ON_COMMAND( ) àÅ áµè¶éÒËÁÒÂàÅ¢ ID ºÒ§µÑÇ·ÕèÁդسÊÁºÑµÔ Prewired à»ç¹ NO àªè¹ ID_FILE_NEW àÃҨеéͧ ·Ó¡Òôѡ¨ÑºáÁÊàʨ ´éÇÂÁÒâ¤Ã ON_COMMAND( ) äÇéã¹áÁÊàʨáÁ» ¢Í§¤ÅÒÊ CWinApp ´éÇ ´Ñ§¹Ñé¹ ã¹áÁÊàʨáÁ» ¢Í§¤ÅÒÊ ·ÕèÊ׺·Í´¨Ò¡¤ÅÒÊ CWinApp ¢Í§àÃÒ ¨ÐµéͧÁÕ¡Òôѡ¨ÑºáÁÊàʨ ´éÇÂÁÒâ¤Ã ON_COMMAND( ) ÍÂÙèÍÂèÒ§¹éÍ 2 µÑǤ×Í áÁÊàʨ·ÕèÁÕ ID à»ç¹ ID_FILE_NEW áÅÐ ID_FILE_OPEN ´Ñ§áÊ´§µèÍ仹Õé

// áÁÊàʨáÁ» ¢Í§¤ÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CWinApp
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
   // ´Ñ¡¨Ñº ID_FILE_NEW áÅéÇàÃÕ¡ãªé¿Ñ§¡ìªÑè¹ OnFileNew( ) ¢Í§ base class
   ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) 
   // ´Ñ¡¨Ñº ID_FILE_OPEN áÅéÇàÃÕ¡ãªé¿Ñ§¡ìªÑè¹ OnFileOpen( ) ¢Í§ base class
   ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)
END_MESSAGE_MAP( )

¨Ò¡µÑÇÍÂèÒ§¢éÒ§µé¹ ¨ÐàËç¹ÇèÒàÃÒäÁè¨Óà»ç¹µéͧ ´Ñ§¨ÑºáÁÊàʨ WM_COMMAND ·ÕèÁÕ ID à»ç¹ ID_APP_EXIT àÅ à¾ÃÒÐÁѹÁդسÊÁºÑµÔ Prewired «Ö觨ÐàÃÕ¡ãªé ¿Ñ§¡ìªÑè¹·Õèà¡ÕèÂÇ¢éͧ ãËéâ´ÂÍѵâ¹ÁѵÔÍÂÙèáÅéÇ

¨Ò¡µÒÃÒ§ ID ¢éÒ§µé¹ à¾×è͹ æ ÊѧࡵàËç¹ÍÐäà ·Õèá»Å¡ä»¨Ò¡»¡µÔ ËÃ×Íà»ÅèÒ¤Ð? »¡µÔáÅéÇã¹â»Ãá¡ÃÁẺ Frame Window ·ÑèÇ æ ä» ·ÕèÁÕ¡Òà µÔ´µÑé§àÁ¹ÙÅ§ä» àÁ×èÍÁÕ¡ÒäÅÔê¡àÅ×Í¡¤ÓÊÑ觨ҡàÁ¹Ù ¨ÐÁÕ¡ÒÃÊè§ WM_COMMAND ¾ÃéÍÁ¡Ñº¤èÒ ID ¢Í§ àÁ¹ÙäÍà·çÁ¹Ñé¹ ÁÒãËé¡Ñº Frame Window à»ç¹µÑǨѴ¡Òà ´Ñ§¹Ñé¹àÃҨеéͧ´Ñ¡¨ÑºáÁÊàʨ â´Â¡ÒÃãªéÁÒâ¤Ã ON_COMMAND «Ö觨еéͧÍÂÙèã¹áÁÊàʨáÁ» ¢Í§¤ÅÒÊ CFrameWnd à·èÒ¹Ñé¹ áµè·ÓäÁã¹Ê¶Ò»ÑµÂ¡ÃÃÁẺ Doc/View àÃÒÊÒÁÒö´Ñ¡¨ÑºáÁÊàʨ WM_COMMAND 㹤ÅÒÊã´ æ ¡çä´é·Ñé§ 4 ¤ÅÒʤ×Í CWinApp, CFrameWnd, CView, ËÃ×Í CDocument ·Õèà»ç¹àªè¹¹Õéà¾ÃÒÐã¹â»Ãá¡ÃÁẺ Doc/View ¨ÐÁդسÊÁºÑµÔ¾ÔàÈÉ ·ÕèàÃÕ¡ÇèÒ command routing «Öè§áÁÊàʨ WM_COMMAND ·Õèà¡Ô´¨Ò¡àÁ¹Ù, ·ÙźÒÃì, ËÃ×ͤÕÂìÅÑ´ ¨Ð¶Ù¡Êè§ä»ÂѧáÁÊàʨÅÙ»¢Í§¤ÅÒÊ·Ñé§ 4 ¤ÅÒÊã¹â»Ãá¡ÃÁẺ Doc/View àÃÕ§¡Ñ¹ä»´Ñ§áÊ´§ã¹ÃÙ»

¨Ò¡ÃÙ»¢éÒ§µé¹ àÃÒ¨ÐàËç¹ÇèÒáÁÊàʨ WM_COMMAND ¾ÃéÍÁËÁÒÂàÅ¢ ID ¨Ð¶Ù¡Êè§¼èÒ¹ä»ÂѧáÁÊàʨáÁ»¢Í§¤ÅÒʵèÒ§ æ àÃÕ§µÒÁÅӴѺ ¶éÒàÃÒÁÕ¡Òôѡ¨ÑºáÁÊàʨ WM_COMMAND ´éÇÂÁÒâ¤Ã ON_COMMAND( )äÇé·Õè¤ÅÒÊã´ ¡ç¨Ð·ÓãËéáÁÊàʨ ¶Ù¡¨Ñ´¡ÒÃàÃÕºÃéÍ 㹤ÅÒʹÑé¹ æ áÅШÐäÁè¶Ù¡Êè§µèÍä» ÂѧáÁÊàʨáÁ»¢Í§¤ÅÒÊÅӴѺ¶Ñ´ä» áµè¶éÒáÁÊàʨ WM_COMMAND ·Õèà¡Ô´¢Öé¹ äÁèä´éÁÕ¡Òôѡ¨ÑºäÇé â´Â¤ÅÒÊã´ æ àÅ áÁÊàʨ¹Ñé¹ ¡ç¨Ð¶Ù¡Êè§ä»¨Ñ´¡ÒÃÂѧ ::DefWindowProc à»ç¹ÅÓ´ÑºÊØ´·éÒÂ

¢éͤÇèÓ*** áÁÊàʨ·Õè¨Ð¶Ù¡Êè§¼èÒ¹ class µèÒ§ æ ´éÇ¡Ãкǹ¡Òà command routing ´Ñ§áÊ´§¢éÒ§µé¹ ¨Ðµéͧà»ç¹áÁÊàʨ ª¹Ô´ WM_COMMAND à·èÒ¹Ñé¹ «Öè§¡ç¤×ÍáÁÊàʨ·Õè ¨Ð¶Ù¡´Ñ¡ä´é´éÇÂÁÒâ¤Ã ON_COMMAND( ) ËÃ×Í ON_UPDATE_COMMAND_UI( ) à·èÒ¹Ñé¹ ÊèǹáÁÊàʨÍ×è¹ æ àªè¹ WM_MOUSEMOVE ËÃ×Í WM_CHAR ¨ÐäÁèÊÒÁÒö ¶Ù¡Êè§¼èÒ¹ ¤ÅÒʵèÒ§ æ ´Ñ§¢éÒ§µé¹ä´é ÊèǹãË­èáÁÊàʨ àËÅèÒ¹Õé¨Ð¶Ù¡Êè§ä»ãËé ˹éÒµèÒ§ÇÔ¹â´ÇÊì·ÕèàÁÒÊìà¤Å×è͹·ÕèÍÂÙè ËÃ×Í˹éÒµèÒ§ÇÔ¹â´ÇÊì ·Õèä´éÃѺ⿡ÑÊÍÂÙèã¹¢³Ð¹Ñé¹ «Öè§ÁÑ¡¨Ðà»ç¹Ë¹éÒµèÒ§¢Í§¤ÅÒÊ CView àÊÕÂà»ç¹ÊèǹãË­è ´Ñ§¹Ñ鹡Òèдѡ¨ÑºáÁÊàʨÍ×è¹ æ ·ÕèäÁèãªè WM_COMMAND ÁÑ¡¨Ð´Ñ¡¨ÑºäÇéã¹áÁÊàʨáÁ» ¢Í§¤ÅÒÊ CView

àÍÒÅèФèÐ ËÅѧ¨Ò¡¡ÅèÒǶ֧ ʶһѵ¡ÃÃÁẺ Document/View ÍÂèÒ§¤ÃèÒÇ æ áÅéÇ ¤ÃÒǹÕé àÃÒ¨ÐÁÒŧÁ×Í à¢Õ¹â»Ãá¡ÃÁ¡Ñ¹àÊÕÂ·Õ â»Ãá¡ÃÁ·ÕèàÃÒ ¨Ðà¢Õ¹¢Öé¹¹Õé à»ç¹â»Ãá¡ÃÁ§èÒÂ æ ·ÕèãªéºÑ¹·Ö¡ ª×èÍ áÅÐàºÍÃìâ·ÃÈѾ·ì ¢Í§à¾×è͹ æ àÃҹФРâ´Ââ»Ãá¡ÃÁ¹Õé¨ÐÁÕÃÙ»Ãèҧ˹éÒµÒ ´Ñ§áÊ´§ ã¹ÃÙ»µèÍ仹Õé ¤èÐ


àÁ×èÍàÃÒ¤ÅÔê¡àÅ×Í¡àÁ¹Ù Edit -> Input Phone Number ´Ñ§ã¹ÃÙ»


¡ç¨Ðä´é Dialog box ¢Öé¹ÁÒãËéàÃÒ »é͹ª×èÍ áÅÐ àºÍÃìâ·ÃÈѾ·ì¢Í§à¾×èÍ¹Å§ä» ´Ñ§ÃÙ»


àÁ×èͤÅÔê¡ »ØèÁ OK ¡ç¨Ð·ÓãËé ª×èÍ áÅÐ àºÍÃìâ·ÃÈѾ·ì ¶Ù¡¹Óä»áÊ´§º¹ Client area ¢Í§Ë¹éÒµèÒ§ÇÔ¹â´ÇÊì¢Í§àÃÒ («Ö觨ÃÔ§ æ áÅéÇ ¡ç¤×Í˹éÒµèÒ§¢Í§ CView ·ÕèÍÂÙèÀÒÂã¹ CFrameWnd ¹Ñè¹àͧ) ´Ñ§ÃÙ»


â´ÂàÃÒÊÒÁÒö ºÑ¹·Ö¡ ¢éÍÁÙŹÕéà¡çºäÇéä´é à¾×èÍÊÒÁÒö¹ÓÁÒà»Ô´´Ùä´é ã¹ÀÒÂËÅѧä´é¤èÐ

¤ÃÒǹÕéàÃÒ¨ÐàÃÔèÁà¢Õ¹â»Ãá¡ÃÁ¡Ñ¹áÅéǹФРâ´ÂÁÕ¢Ñ鹵͹ ´Ñ§¹Õé ¤èÐ
1. ÊÃéÒ§â»Ãਤ·ìãËÁè¢Öé¹ÁÒ â´Â¡Ó˹´ãËéà»ç¹áºº Win32 áÅéÇàÅ×Í¡àÁ¹Ù Project -> Setting ãËéãªé MFC ä´é´éǹФÐ
2. ÊÃéÒ§ä¿ÅìãËÁè¢Öé¹ÁÒ ·Ñé§ä¿Åì .h áÅÐ .cpp ´Ñ§µèÍ仹Õé¤èÐ
// file myframe.h
// »ÃСÒȤÅÒÊ CMyFrame «Öè§Ê׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CFrameWnd
class CMyFrame:public CFrameWnd
{
public:
	DECLARE_DYNCREATE(CMyFrame)  // »ÃСÒÈãËé¤ÅÒʹÕéà»ç¹áºº dynamic creation

	CMyFrame();                                                     // »ÃСÒÈ constructor

	DECLARE_MESSAGE_MAP()                   // »ÃСÒÈ¡Òà map message
};

// file myframe.cpp

#include <afxwin.h>
#include "myframe.h"

IMPLEMENT_DYNCREATE(CMyFrame,CFrameWnd) //à¾ÔèÁ¤Ø³ÊÁºÑµÔ dynamic creation

BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)     // ÃÒÂÅÐàÍÕ´¢Í§ message map

END_MESSAGE_MAP()

CMyFrame::CMyFrame()                                                          // ÃÒÂÅÐàÍÕ´¢Í§ constructor
{
}

// file mydoc.h
// »ÃСÒȤÅÒÊ CMyDoc «Öè§Ê׺·Í´ÁÒ¨Ò¡ CDocument

class CMyDoc:public CDocument // »ÃСÒȤÅÒÊ CMyDoc «Öè§Ê׺·Í´¨Ò¡ CDocument
{
public:
	DECLARE_DYNCREATE(CMyDoc) // »ÃСÒȤÅÒʹÕéãËéÁդسÊÁºÑµÔ dynamic creation

	int record_num;                            // »ÃСÒȵÑÇá»Ã·Õèãªéà¡çº¨Ó¹Ç¹ÃÒª×èͼÙéãªé
	CString name[30];                       // »ÃСÒȵÑÇá»ÃªØ´ ·Õèãªéà¡çºÃÒª×èÍ (ÊÙ§ÊØ´ 30 ÃÒª×èÍ)
	CString phone_number[30];    // »ÃСÒȵÑÇá»ÃªØ´ ãªéà¡çºàºÍÃìâ·ÃÈѾ·ì (ÊÙ§ÊØ´ 30 àºÍÃì)

	BOOL OnNewDocument();      // »ÃСÒȵé¹áºº¿Ñ§¡ìªÑè¹ (function prototype)
	void Serialize(CArchive& ar);

	afx_msg void InputPhone();

	DECLARE_MESSAGE_MAP() // »ÃСÒÈ ¡Òà map message
};

// file mydoc.cpp

#include <afxwin.h>
#include "mydoc.h"
#include "phonedlg.h"  // µéͧÁÕ¡Òà include file .h «Öè§»ÃСÒȤÅÒʢͧ dialog box ·ÕèÊÃéÒ§¢Öé¹ à¾×èÍãËé¼Ùéãªé »é͹ª×èÍ áÅÐàºÍÃìâ·ÃÏ
#include "resource.h"

IMPLEMENT_DYNCREATE(CMyDoc,CDocument) // à¾ÔèÁ¤Ø³ÊÁºÑµÔ Dynamic creation

BEGIN_MESSAGE_MAP(CMyDoc,CDocument)      // ÃÒÂÅÐàÍÕ´¢Í§¡Òà map message
    // ´Ñ¡¨Ñº WM_COMMAND ·ÕèÁÕ ID à»ç¹ ID_INPUT_PHONE áÅéÇàÃÕ¡ãªé¿Ñ§¡ìªÑè¹ InputPhone( )
   ON_COMMAND(ID_INPUT_PHONE, InputPhone)
END_MESSAGE_MAP()

// ÃÒÂÅÐàÍÕ´¢Í§¿Ñ§¡ìªÑè¹ OnNewDocument( ) «Ö觨ж١àÃÕ¡ãªé·Ø¡¤ÃÑé§ ·ÕèÁÕ¡ÒÃÊÃéÒ§àÍ¡ÊÒÃãËÁè
BOOL CMyDoc::OnNewDocument()
{
	if(!CDocument::OnNewDocument())return FALSE;

	record_num = 0;

	return TRUE;
}

// ÃÒÂÅÐàÍÕ´¢Í§¿Ñ§¡ìªÑè¹ Serialize «Ö觨ж١àÃÕ¡ãªé·Ø¡¤ÃÑé§ ·ÕèÁÕ¡Òà Save ËÃ×Í Open file â´Â frame work ¨ÐÊÃéÒ§Çѵ¶Øà»éÒËÁÒÂ
// ¢Í§¤ÅÒÊ CArchive «Öè§·Ó˹éÒ·Õèà»ç¹àËÁ×͹ µÑÇà¡çº¢éÍÁÙÅẺ¶ÒÇà (persistance data storage) «Ö觤×Í disk drive ¹Ñè¹àͧ
// áÅéÇÊ觤èÒáÍ´à´Ãʢͧ Çѵ¶Ø à»éÒËÁÒ¹Õé ÁÒãËé¿Ñ§¡ìªÑè¹ Serialize( ) ¹Õé´éÇÂ
void CMyDoc::Serialize(CArchive& ar)
{
	int i=0;
	if(ar.IsLoading()) // µÃǨÊͺÇèÒ¢³Ð¹Õé à»ç¹¡ÒÃÍèÒ¹¢éÍÁÙŨҡ Disk drive ËÃ×ÍäÁè?
	{
		ar>> record_num; // ¶éÒà»ç¹¡ÒÃÍèÒ¹¢éÍÁÙÅ ãËéÍèÒ¹¢éÍÁÙÅà¢éÒÁÒà¡çºã¹µÑÇá»Ã record_num
		for(i=0; i< record_num; i++) // ¨Ò¡¹Ñé¹ãËéǹÍèÒ¹¢éÍÁÙÅà¢éÒÁÒà¡çºã¹µÑÇá»ÃªØ´ name[ ] áÅÐ phone_number[ ]
		{
		  ar >> name[i] >> phone_number[i];
		}
	}
	else // äÁèàªè¹¹Ñé¹ áÊ´§ÇèÒà»ç¹¡ÒÃà¢Õ¹¢éÍÁÙÅ à¢éÒä»ã¹ Disk drive
	{
		ar<< record_num; // ãËé¹Ó¤èÒ¨Ò¡µÑÇá»Ã record_num à¢Õ¹ŧä»ã¹ Disk drive
		for(i=0; i< record_num; i++) // ¨Ò¡¹Ñé¹ãËéǹ¹Ó¤èÒ¨Ò¡µÑÇá»ÃªØ´ name[ ] áÅÐ phone_number[ ] à¢Õ¹ŧä»ã¹ Disk drive
		{
		  ar << name[i] << phone_number[i];
		}
	}
}

// ¿Ñ§¡ìªÑè¹¹Õé ¨Ð¶Ù¡àÃÕ¡àÁ×èͼÙéãªé¤ÅÔê¡àÅ×Í¡àÁ¹Ù Edit -> Input Phone Number «Öè§·ÓãËéÁÕ¡ÒÃÊè§áÁÊàʨ WM_COMMAND ·ÕèÁÕ ID à»ç¹
// ID_INPUT_PHONE ÍÍ¡ÁÒ áÅж١´Ñ¡¨ÑºäÇé´éÇ message map ¢Í§¤ÅÒÊ CMyDoc ¹Õé
afx_msg void CMyDoc::InputPhone()
{
	CPhoneDlg dlg; // ÊÃéÒ§Çѵ¶Øà»éÒËÁÒ¢ͧ¤ÅÒÊ CPhoneDlg ¢Öé¹ÁÒ
	if(dlg.DoModal() == IDOK) // áÊ´§ Dialog box º¹¨Í Ãͨ¹ Dialog box »Ô´Å§ µÃǨÊͺ¤èÒ·ÕèÊè§¡ÅѺÁÒÇèÒà»ç¹ IDOK ËÃ×ÍäÁè?
	{
      // ¹Ó¤èÒã¹µÑÇá»Ã Name ¢Í§ dialog ä»à¡çºã¹µÑÇá»ÃªØ´ name[ ] ·ÕèµÓá˹觷ÕèªÕéâ´ÂµÑÇá»Ã record_num
		name[record_num] = dlg.Name; 
     // ¹Ó¤èÒã¹µÑÇá»Ã Phone ¢Í§ dialog ä»à¡çºã¹µÑÇá»ÃªØ´ phone_number[ ] µÃ§µÓá˹觷ÕèªÕéâ´ÂµÑÇá»Ã record_num
		phone_number[record_num] = dlg.Phone;
      
		record_num++;  // à¾ÔèÁ¤èÒµÑÇá»Ã record_num
		UpdateAllViews(NULL); // ÊÑè§ãËé View ·Ø¡ View ·Ó¡ÒÃÇҴ˹éÒµèÒ§ãËÁè
	}
}

// file myview.h

class CMyView:public CView  // »ÃСÒȤÅÒÊ CMyView «Öè§Ê׺·Í´¨Ò¡ CView
{
public:
	DECLARE_DYNCREATE(CMyView)  // »ÃСÒȤÅÒʹÕéãËéÁդسÊÁºÑµÔ dynamic creation

	void OnDraw(CDC* pDC);            // »ÃСÒÈ µé¹áºº¿Ñ§¡ìªÑè¹

	DECLARE_MESSAGE_MAP( )    // »ÃСÒÈ¡Òà map message
};

// file myview.cpp

#include <afxwin.h>
#include "myview.h"
#include "mydoc.h"
#include "resource.h"

IMPLEMENT_DYNCREATE(CMyView,CView) // à¾ÔèÁ¤Ø³ÊÁºÑµÔ Dynamic creation

BEGIN_MESSAGE_MAP(CMyView,CView) // ÃÒÂÅÐàÍÕ´¡Òà map message
 
END_MESSAGE_MAP()

// ¿Ñ§¡ìªÑè¹¹Õé¨Ð¶Ù¡àÃÕ¡ãªé·Ø¡¤ÃÑé§ àÁ×èÍ CMyView µéͧ·Ó¡ÒÃÇҴ˹éÒ¨ÍãËÁè â´Â Frame work ¨ÐÊè§µÑÇá»Ã pDC 
// «Ö觪Õéä»Âѧ device context ¢Í§Ë¹éÒµèÒ§ CMyView ¹ÕéÁÒãËé¡Ñº¿Ñ§¡ìªÑè¹¹Õé´éÇ 
void CMyView::OnDraw(CDC* pDC)
{
	int line, char_width;
	CMyDoc* pDoc = (CMyDoc*)GetDocument(); // ÃѺ¤èÒµÑǪÕéä»Âѧ CMyDoc ÁÒà¡çºäÇéã¹µÑÇá»Ã pDoc
	
	TEXTMETRIC tm;  // ÊÃéÒ§µÑÇá»Ãâ¤Ã§ÊÃéÒ§·Õèà»ç¹ª¹Ô´ TEXTMETRIC
	pDC->GetTextMetrics(&tm); // ÃѺ¤èÒâ¤Ã§ÊÃéÒ§¢Í§  «Öè§à»ç¹¢éÍÁÙÅà¡ÕèÂǡѺ font ·ÕèãªéÍÂÙèã¹ device context
  //¤Ó¹Ç³¨Ó¹Ç¹ pixel µèÍ 1 ºÃ÷Ѵ = ¤ÇÒÁÊÙ§¢Í§µÑÇÍÑ¡ÉÃ+ÃÐÂТͺº¹¢Í§µÑÇÍÑ¡ÉÃ
	line = tm.tmHeight + tm.tmExternalLeading;
  // ¤Ó¹Ç³¨Ó¹Ç³ pixel µèͤÇÒÁ¡ÇéÒ§¢Í§ÍÑ¡Éà 1 µÑÇ = ¤ÇÒÁ¡ÇéÒ§¢Í§µÑÇÍÑ¡É÷Õè¡ÇéÒ§·ÕèÊØ´
	char_width = tm.tmMaxCharWidth;

	int record = pDoc->record_num; // ÃѺ¤èҨӹǹ ÃÒª×èÍÁÒà¡çºäÇéã¹µÑÇá»Ã record
  // áÅéÇǹà¢Õ¹µÑÇÍÑ¡Éà ª×èÍ áÅÐ àºÍÃìâ·ÃÈѾ·ìÍÍ¡º¹ View
	for(int i=0; i< record; i++)
	{
		pDC->TextOut(char_width, line*i,pDoc->name[i]);
		pDC->TextOut(char_width*15, line*i, pDoc->phone_number[i]);
	}
}

// file myapp.h

class CMyApp:public CWinApp  // »ÃСÒȤÅÒÊ CMyApp «Öè§Ê׺·Í´ÁÒ¨Ò¡¤ÅÒÊ CWinApp
{
public:
	BOOL InitInstance();    //   »ÃСÒȵé¹áºº¿Ñ§¡ìªÑè¹

	DECLARE_MESSAGE_MAP()    //  »ÃСÒÈ¡Òà  map message
};

// file myapp.cpp

#include <afxwin.h>
#include "myapp.h"
#include "myframe.h"
#include "mydoc.h"
#include "myview.h"
#include "resource.h"

CMyApp app;  // ÊÃéÒ§Çѵ¶Øà»éÒËÁÒ¢ͧ¤ÅÒÊ CMyApp à»ç¹¨Ø´àÃÔèÁµé¹¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ

// ÃÒÂÅÐàÍÕ´¡Òà map message
BEGIN_MESSAGE_MAP(CMyApp,CWinApp)
  //´Ñ¡¨Ñº WM_COMMAND ·ÕèÁÕ ID à»ç¹ ID_FILE_NEW áÅéÇàÃÕ¡ãªé§Ò¹¿Ñ§¡ìªÑè¹ OnFileNew ¢Í§ Base class
  ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  
  // ´Ñ¡¨Ñº WM_COMMAND ·ÕèÁÕ ID à»ç¹ ID_FILE_OPEN áÅéÇàÃÕ¡ãªé§Ò¹¿Ñ§¡ìªÕè¹ OnFileOpen ¢Í§ Base class
  ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)
END_MESSAGE_MAP()

BOOL CMyApp::InitInstance()
{
  // ÊÃéÒ§ µé¹áºº¢Í§ Class CSingleDocTemplate â´ÂÃÇÁàÍÒ¤ÅÒÊ CMyDoc, CMyFrame, CMyView áÅÐ
 // ÃÕ«ÍÃì·µèÒ§ æ à¢éÒÁÒäÇéã¹µé¹áººà´ÕÂǡѹ áÅéÇÊ觤èÒµÑǪÕéµé¹áºº¹Õé ä»à¡çºäÇé·ÕèµÑÇá»Ã pTemplate
	CSingleDocTemplate* pTemplate = new CSingleDocTemplate(
		                                IDR_MAINRESOURCE,
		                                RUNTIME_CLASS(CMyDoc),
		                                RUNTIME_CLASS(CMyFrame),
		                                RUNTIME_CLASS(CMyView));

  // à¾ÔèÁµé¹áºº·ÕèÊÃéÒ§¢éÒ§µé¹ à¢éÒä»ã¹ÃÒ¡Òâͧµé¹áººàÍ¡ÊÒ÷Õè â»Ãá¡ÃÁ¹ÕéÊÒÁÒöãªé§Ò¹ä´é
	AddDocTemplate(pTemplate);
  
  // àÃÕ¡¿Ñ§¡ìªÑè¹ ¹Õé à¾×èÍãËéÁÕ¡ÒÃÊÃéÒ§àÍ¡ÊÒÃãËÁè áÅÐáÊ´§Ë¹éÒµèÒ§â»Ãá¡ÃÁÍÍ¡·Ò§¨ÍÀÒ¾
	OnFileNew();

	return TRUE;
}

3. àÅ×Í¡àÁ¹Ù Project -> Add to Project -> New áÅéÇàÅ×Í¡ à¾ÔèÁä¿ÅìÃÕ«ÍÃì· Ê¤ÃÔ»µì Å§ä» â´ÂµÑ駪×èÍà»ç¹ resource.rc ´Ñ§ÃÙ»


4. µÍ¹¹ÕéàÃÒ¨Ðä´éä¿ÅìÃÕ«ÍÃì·Ê¤ÃÔ»µì ÁÒáÅéǹФРáÅéÇãËéà¾×è͹ æ à¾ÔèÁàÁ¹Ù à¢éÒä»ã¹ÃÕ«ÍÃìʤÃÔ»µì¹Õé â´ÂàÅ×Í¡àÁ¹Ù Insert -> Resource àÅ×Í¡ insert Menu áÅéÇ¡´»ØèÁ New


5. à»ÅÕ蹪×èÍàÁ¹Ù·ÕèÊÃéÒ§¢Öé¹ãËéà»ç¹ IDR_MAINRESOURCE ãËéµÃ§¡Ñºª×èͧ͢ ÃÕ«ÍÃì··ÕèàÃÒ¡Ó˹´ãËé¡Ñº CSingleDocTemplate à¾×èͨзÓãËéàÁ¹Ù¹Õé ¡ÅÒÂà»ç¹ÃÕ«ÍÃì··Õèâ»Ãá¡ÃÁàÃÒ¨ÐâËÅ´à¢éÒä» àÁ×èÍàÇÅÒãªé§Ò¹ ¨ÃÔ§ æ áÅéÇàÃÒÊÒÁÒö¡Ó˹´ÃÕ«ÍÃì·Í×è¹ æ ãËéÁÕª×èÍà´ÕÂǡѹ¹Õéä´é àªè¹ äͤ͹, µÒÃÒ§¤ÕÂìÅÑ´, ËÃ×Í String table «Öè§â»Ãá¡ÃÁ¢Í§àÃÒ¨ÐâËÅ´ä»ãªé§Ò¹àͧ áµè㹵͹¹Õé àÃҨоٴ¶Ö§àÁ¹Ùà¾Õ§ÍÂèÒ§à´ÕÂÇ¡è͹ ¹Ð¤Ð ¨Ò¡¹Ñé¹ãËéàÃÒà¾ÔèÁ àÁ¹Ùà¢éÒä» â´ÂµÑ駪×èÍàÁ¹ÙäÍà·çÁáµèÅеÑǴѧã¹ÃÙ»


ã¹àÁ¹Ù File ¹ÕéàÃҨеÑ駪×èÍ àÁ¹ÙäÍà·çÁ áÅСÓ˹´¤èÒ ID ãËé¡ÑºáµèÅÐäÍà·çÁ ´Ñ§áÊ´§ã¹µÒÃÒ§¢éÒ§ÅèÒ§
ª×èÍ Menu Item
ËÁÒÂàÅ¢ ID
New
ID_FILE_NEW
Open
ID_FILE_OPEN
Save
ID_FILE_SAVE
Save As
ID_FILE_SAVE
Exit
ID_APP_EXIT

¨ÐàËç¹ÇèÒ ËÁÒÂàÅ¢ ID àËÅèÒ¹Õé ¡ç¤×ÍËÁÒÂàÅ¢ ID Áҵðҹ¢Í§â»Ãá¡ÃÁẺ Doc/View ·ÕèàÃÒ¡ÅèÒǶ֧ä»ã¹µÍ¹áá¹Ñè¹àͧ «Öè§àÁ×èÍã´ ·ÕèÁÕ¡ÒäÅÔê¡àÅ×Í¡ËÑÇ¢éÍ ã¹àÁ¹ÙàËÅèÒ¹Õé ¡ç¨Ð·ÓãËéâ»Ãá¡ÃÁ ä»àÃÕ¡ãªé¿Ñ§¡ìªÑ蹢ͧ Dov/View ·ÕèàËÁÒÐÊÁãËéâ´ÂÍѵâ¹ÁÑµÔ â´ÂàÃÒäÁèµéͧà¢Õ¹ â¤é´à¾×èͤǺ¤ØÁ¡Ò÷ӧҹàËÅèÒ¹Ñé¹àÅÂ

¨Ò¡¹Ñ鹡çà¾ÔèÁàÁ¹Ù Edit ŧä»â´Âà¾ÔèÁàÁ¹ÙäÍà·çÁŧä»ã¹àÁ¹Ù Edit ´Ñ§ã¹ÃÙ»

áÅéÇ¡Ó˹´ËÁÒÂàÅ¢ ID ãËé¡ÑºàÁ¹ÙäÍà·çÁ ã¹àÁ¹Ù Edit ´Ñ§µÒÃÒ§´éÒ¹ÅèÒ§
ª×èÍ Menu Item
ËÁÒÂàÅ¢ ID
Input Phone Number ID_INPUT_PHONE
Erase Phone Number ID_ERASE_PHONE

6. ¢Ñé¹µÍ¹ÊØ´·éÒ ¡ç¤×Í¡ÒÃÊÃéÒ§ Dialog box ·Õè¨Ð·Ó˹éÒ·ÕèÃѺ¢éÍÁÙÅ ·Õè¼Ùéãªé»é͹à¢éÒä» à¾×èͨйÓä»áÊ´§ã¹ CView µèÍä» â´ÂãËéà¾×è͹ æ àÅ×Í¡àÁ¹Ù Insert -> Resource àÅ×Í¡à¾ÔèÁ Dialog box áÅéÇ¡´»ØèÁ New ¨Ðä´é Dialog box ¢Öé¹ÁÒ ãËéà¾×è͹µÑ駪×èÍà»ç¹ IDD_INPUT_DIALOG áÅéÇ¹Ó control µèÒ§ æ ŧä»ÇÒ§ ã¹ Dialog box ´Ñ§áÊ´§ã¹ÃÙ»

áÅéÇ¡Ó˹´ ËÁÒÂàÅ¢ ID ãËé¡Ñº¤Í¹â·ÃÅáµèÅеÑÇ ´Ñ§áÊ´§ã¹µÒÃÒ§´éÒ¹ÅèÒ§
ª¹Ô´ Control
ª×èÍ Caption
ËÁÒÂàÅ¢ ID
Edit box Name IDC_EDIT_NAME
Edit box Phone Number IDC_EDIT_PHONE

¨Ò¡¹Ñé¹ÊÃéÒ§¤ÅÒʪ×èÍ CPhoneDlg ·ÕèÊ׺·Í´ÁÒ¨Ò¡ CDialog à¾×èÍÁҤǺ¤ØÁ Dialog box ·ÕèÊÃéÒ§¢Öé¹¹Õé â´ÂãËéà¾×è͹à¾ÔèÁä¿Åì 2 ä¿Åì µèÍ仹Õé ŧã¹â»Ãਤ·ì â´ÂàÅ×Í¡àÁ¹Ù File -> New áÅéÇàÅ×Í¡à¾ÔèÁ C++ header file áÅÐ C++ source file «Öè§â¤é´â»Ãá¡ÃÁ ã¹ä¿Åì·Ñé§Êͧ áÊ´§äÇé´Ñ§µèÍ仹Õé
// file phonedlg.h

class CPhoneDlg:public CDialog
{
public:
	CString Name;
	CString Phone;

	CPhoneDlg();

	void DoDataExchange(CDataExchange* pDX);
	DECLARE_MESSAGE_MAP()
};

// file phonedlg.cpp

#include <afxwin.h>
#include "phonedlg.h"
#include "resource.h"

BEGIN_MESSAGE_MAP(CPhoneDlg,CDialog)

END_MESSAGE_MAP()

CPhoneDlg::CPhoneDlg():CDialog(IDD_INPUT_DIALOG)
{
}

void CPhoneDlg::DoDataExchange(CDataExchange* pDX)
{
	DDX_Text(pDX,IDC_EDIT_NAME,Name);
	DDX_Text(pDX,IDC_EDIT_PHONE, Phone);

	CDialog::DoDataExchange(pDX);
}

ä¿Åì·Ñé§Êͧ¹Õé ÁÕµÑÇá»Ãª¹Ô´ CString 2 µÑǤ×Í Name áÅÐ Phone áÅÐãªé¡Åä¡ DDX ·Õèä´é͸ԺÒÂä»áÅéÇ㹺··Õè 12 áÅÐ 13 ´Ñ§¹Ñé¹Ë¹Ùá¨ëÇ ¢Í͹حҵäÁè¡ÅèÒǶ֧ÍÕ¡¹Ð¤Ð

7. ¤ÃÒǹÕéà¾×è͹ æ Åͧ Save áÅéÇ Build â»Ãá¡ÃÁ¡Ñ¹´Ù¹Ð¤Ð ¡ç¨Ðä´éâ»Ãá¡ÃÁ˹éÒµÒ ´Ñ§áÊ´§ã¹ÃÙ»¢éÒ§µé¹ àÁ×èÍà¾×è͹ æ ¨Ðà¾ÔèÁàµÔÁ¢éÍÁÙÅà¢éÒä» ¡çÊÒÁÒöàÅ×Í¡àÁ¹Ù Edit -> Input Phone Dialog áÅéÇà¾ÔèÁàµÔÁ¢éÍÁÙÅà¢éÒä» ä´éµÒÁµéͧ¡ÒäèÐ (áµèä´éäÁèà¡Ô¹ 30 ¤¹ ¹Ð¤Ð à¾ÃÒÐàÃҨͧÍÒàÃÂìäÇéà¾Õ§ 30 ªØ´à·èÒ¹Ñé¹ ã¹¤ÅÒÊ CMyDoc áµèà¾×è͹ æ ÊÒÁÒöá¡éä¢ãËé à¡çº¤èÒà¾ÔèÁàµÔÁä´éµÒÁµéͧ¡ÒäèÐ)
àÁ×èÍà¾ÔèÁàµÔÁ¢éÍÁÙÅàÊÃç¨áÅéÇ ãËéà¾×è͹ æ Save ¢éÍÁÙÅà¡çºäÇéà¾×èͨСÅѺÁÒà»Ô´´Ùä´éã¹ÀÒÂËÅѧ â´ÂàÅ×Í¡·ÕèàÁ¹Ù File -> Save áÅéǵÑ駪×èÍä¿ÅìµÒÁµéͧ¡Òà ´Ñ§áÊ´§ã¹ÃÙ»¤èÐ


àÇÅÒ ¨ÐàÃÕ¡ä¿Åì·Õè Save äÇéÁÒáÊ´§º¹ â»Ãá¡ÃÁàÃÒ ¡çãËéàÅ×Í¡ File -> Open áÅéÇàÅ×Í¡ä¿ÅìÁÒ´Ùä´é¤èÐ

µÍ¹¹Õé´ÙàËÁ×͹·Ø¡ÊÔè§·Ø¡ÍÂèÒ§ ¨Ð·Ó§Ò¹ä´éàÃÕºÃéÍ´ÕãèªèäÁê¤Ð? ¨ÃÔ§ æ áÅéÇâ»Ãá¡ÃÁ¹ÕéÂѧÁÕ¢éͺ¡¾ÃèͧÍÂÙèÁÒ¡·Õà´ÕÂÇ áµèà¹×èͧ¨Ò¡Ë¹Ùá¨ëÇ µéͧ¡ÒÃãËéµÑÇâ»Ãá¡ÃÁ §èÒ·ÕèÊØ´ à·èÒ·Õè¨Ðà»ç¹ä»ä´é ¨Ö§µÑ´Êèǹ·ÕèäÁè¨Óà»ç¹ÍÍ¡ä»àÂÍÐÁÒ¡ àËÅ×ÍäÇé੾ÒÐÊèǹ·Õè·ÓãËéâ»Ãá¡ÃÁ·Ó§Ò¹ä´é à·èÒ¹Ñé¹ Â¡µÑÇÍÂèÒ§§èÒÂ æ ¡çãËéà¾×è͹Åͧ»é͹¢éÍÁÙÅ ª×èÍáÅÐàºÍÃìâ·ÃÈѾ·ìà¾×è͹ æ Å§ä» áÅéǤÅÔê¡»Ô´â»Ãá¡ÃÁàÅ ¨ÐàËç¹ÇèÒâ»Ãá¡ÃÁ»Ô´ä»àÅ â´ÂäÁèä´éàµ×͹ÇèÒÂѧÁÕ¢éÍÁÙÅ·ÕèäÁèä´é Save ÍÂÙ躹â»Ãá¡ÃÁ «Ö觨зÓãËé¢éÍÁÙÅÊÙ­ËÒÂä» «Ö觻ѭËÒ¹ÕéàÃÒÊÒÁÒö á¡éä´é§èÒ æ â´Âà¾ÔèÁºÃ÷Ѵ¤ÓÊÑè§ SetModifiedFlag( ) ŧä»ã¹¿Ñ§¡ìªÑè¹·Õè·Ó˹éÒ·Õè ÃѺ¢éÍÁÙŨҡ Dialog box ŧÁÒà¡çºã¹ CMyDoc ´Ñ§áÊ´§µèÍ仹Õé
// ¿Ñ§¡ìªÑè¹¹ÕéÍÂÙèã¹ä¿Åì CMyDoc.cpp
afx_msg void CMyDoc::InputPhone() { CPhoneDlg dlg; if(dlg.DoModal() == IDOK) { name[record_num] = dlg.Name; phone_number[record_num] = dlg.Phone; record_num++; UpdateAllViews(NULL); SetModifiedFlag( ); // ãªé¿Ñ§¡ìªÑè¹¹Õéà¾×èÍàµ×͹ÇèÒ ä¿Åì Document ¶Ù¡à»ÅÕè¹á»Å§á¡éä¢ } }

¤ÃÒǹÕéàÁ×èÍà¾×è͹ æ à¾ÔèÁàµÔÁ¢éÍÁÙÅà¢éÒä»ã¹â»Ãá¡ÃÁ áÅéǻԴâ»Ãá¡ÃÁâ´ÂäÁèä´é Save ¢éÍÁÙÅ¡è͹ â»Ãá¡ÃÁ¡ç¨Ð¢Öé¹¢éͤÇÒÁàµ×͹ÇèÒ ÁÕàÍ¡ÊÒ÷ÕèÂѧäÁèä´é Save äÇé ¨Ð Save ËÃ×ÍäÁè? «Ö觪èÇ»éͧ¡Ñ¹»Ñ­ËÒ¢éÒ§µé¹ä´éáÅéǤèÐ

»Ñ­ËÒÍÕ¡ÍÂèÒ§¢Í§â»Ãá¡ÃÁ¹Õé¡ç¤×Í ¶éÒ¢éÍÁÙÅÁÕÁÒ¡à¡Ô¹¡ÇèÒ ·Õè¨ÐáÊ´§ã¹ã¹Ë¹éÒµèÒ§ View à´ÕÂÇä´é àÃÒ¡çäÁèÊÒÁÒö·Õè¨ÐàÅ×è͹仴ÙàÍ¡ÊÒà ·ÕèÍÂÙè¹Í¡¢Íºà¢µ¢Í§ View ä´é à¾ÃÒÐäÁèÁÕ Scroll bar ÊÓËÃѺàÅ×è͹ ´Ñ§áÊ´§ã¹ÃÙ»

«Ö觻ѭËÒ¹Õé ÊÒÁÒöá¡éä¢ä´é â´Âà»ÅÕ蹤ÅÒÊ View ¨Ò¡ CView ¸ÃÃÁ´Ò ä»à»ç¹ CScrollView «Ö觨Ðä´é¡ÅèÒǶ֧㹺·µèÍ仹ФÐ

º·¹Õéà¹×éÍËÒÂÒÇÁÒ¡ ¨¹Ë¹Ùá¨ëÇäÁèá¹èã¨ÇèÒä´é¾Ù´¤Ãͺ¤ÅØÁ ¾×é¹°Ò¹¢Í§Ê¶Ò»ÑµÂ¡ÃÃÁ Doc/View äÇéËÁ´ËÃ×ÍÂѧ áÅÐãªéàÇÅÒà¢Õ¹¹Ò¹ÁÒ¡àÅ ¤èÐ ·Ñé§ æ ·ÕèÊÑ»´ÒËì·ÕèáÅéÇ Ë¹Ùá¨ëÇÇèÒ§µÅÍ´ à¾ÃÒоÍàÃÔèÁà¢ÕÂ¹ä» ¡çàÃÔèÁÃÙéÊÖ¡ÇèÒ ÁÕà¹×éÍËÒÁÒ¡¢Öé¹àÃ×èÍÂ æ ¨¹äÁèÊÒÁÒö·Õè¨Ð¨ºÅ§ä´é§èÒ æ à¹×éÍËÒ¡çàÅ Â×´ÂÒÇÍÂèÒ§¹ÕéÅèФèÐ áÅéǵéͧÁÕµèÍÀÒ¤ 2 - 3 µèÍä»ÍÕ¡àÃ×èÍ æ ËÇѧÇèÒà¾×è͹ æ ¤§·¹ÍèÒ¹¡Ñ¹äËǹФÐ

áÅéǾº¡Ñ¹ãËÁè¤ÃÒÇ˹éÒ¤èÐ

˹Ùá¨ëÇ

Hosted by www.Geocities.ws

1