|
¤ÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡
|
˹éÒ·Õè
|
| CDocument | à¡çº¢éÍÁÙÅáÅШѴ¡ÒáѺ¢éÍÁÙŢͧâ»Ãá¡ÃÁ |
| CView | à»ç¹Ë¹éÒµèÒ§áÊ´§¼Å·ÕèÇÒ§·ÑºÍÂÙ躹 client area ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ ·Ó˹éÒ·ÕèáÊ´§¼Å áÅÐÃѺ message ·Õèà¡Ô´¢Öé¹ÀÒÂ㹺ÃÔàdz client area ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ |
| CFrameWnd | à»ç¹Êèǹ¢Í§Ë¹éÒµèÒ§â»Ãá¡ÃÁ·ÕèºÃÃ¨Ø Ë¹éÒµèÒ§¢Í§ CView äÇéÀÒÂã¹ ¹Í¡¨Ò¡¹ÕéÂѧ ¨Ñ´¡ÒÃà¡ÕèÂǡѺ Tool bar áÅÐ Status bar ´éÇ |
| CWinApp | ¤Çº¤ØÁ¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ à»ç¹¨Ø´àÃÔèÁµé¹¢Í§¡Ò÷ӧҹ¢Í§â»Ãá¡ÃÁ |
|
DECLARE_DYNCREATE(ClassName)
|
|
| â´Â·Õè ClassName ¤×Í | ª×èͧ͢¤ÅÒÊ·Õèµéͧ¡ÒÃãËéÁդسÊÁºÑµÔ Dynamic creation |
|
IMPLEMENT_DYNCREATE(ClassName,BaseClassName)
|
|
| â´Â·Õè ClassName | ¤×ͪ×èͧ͢¤ÅÒÊ·Õèµéͧ¡ÒÃãËéÁդسÊÁºÑµÔ Dynamic creation |
| BaseClassName | ¤×ͪ×èͤÅÒÊáÁè¢Í§¤ÅÒÊ ClassName |
|
void Serialize(CArchive&
ar);
|
|
| â´Â·Õè ar ¤×Í | µÓá˹è§ã¹Ë¹èǤÇÒÁ¨Ó ·Õèãªéà¡çºÇѵ¶Øà»éÒËÁÒ¢ͧ¤ÅÒÊ CArchive äÇé |
void CMyDocument::Serialize(CArchive& ar)
{
if(ar.IsStoring( )) // ¶éÒà»ç¹¡Òúѹ·Ö¡¢éÍÁÙÅŧ´Ôʤì
{
ar<< yourdata; // ãªéâÍà»ÍÃìàÃàµÍÃì << 㹡ÒÃà¡çº¢éÍÁÙÅà¢éÒÇѵ¶Øà»éÒËÁÒ ar
}
else
{
ar>>yourdata; // äÁèàªè¹¹Ñé¹ ãËéãªé >> 㹡ÒÃÍèÒ¹¢éÍÁÙŨҡÇѵ¶Øà»éÒËÁÒ ar ÁÒà¡çºäÇéã¹µÑÇá»Ã yourdata
}
}
|
|
BOOL OnNewDocument(
);
|
|
| â´Â¿Ñ§¡ìªÑè¹¹Õé ¨Ð¤×¹¤èÒµÑÇá»ÃẺ Boolean ¡ÅѺÁÒ â´Â¤èÒ¹Õé¨ÐäÁèà»ç¹ 0 ¶éҿѧ¡ìªÑè¹·Ó§Ò¹ÊÓàÃç¨ áµè¨Ð¤×¹¤èÒ 0 ¡ÅѺÁÒ ¶éҿѧ¡ìªÑè¹·Ó§Ò¹äÁèÊÓàÃç¨ |
BOOL CMyDocument :: OnNewDocument( )
{
if( ! CDocument::OnNewDocument( ) ) // ¶éÒ ¿Ñ§¡ìªÑè¹ OnNewDocument ¢Í§ base class ¤×¹¤èÒ 0 ¡ÅѺÁÒ
return FALSE; // ãËéÍÍ¡¨Ò¡¿Ñ§¡ìªÑè¹¹Õé áÅФ׹¤èÒ 0 ¡ÅѺ仴éÇÂ
|
// ¿Ñ§¡ìªÑè¹ÊÁÁµÔ ª×èÍ EditMyDocument ( )
void CMyDocument :: EditMyDocument(int data1, int data2 )
{
my_data1 = data1; // à»ÅÕè¹á»Å§¢éÍÁÙÅã¹ CDocument
my_data2 = data2;
UpdateAllViews( ); // ºÍ¡ãËé CView à¢Õ¹˹éÒ¨Í View àÊÕÂãËÁè
}
|
|
void
OnDraw( CDC* pDC
)
|
|
| â´Â·Õè pDC | ¤×Í µÑǪÕéä»Âѧ Device context ·ÕèãªéÊÓËÃѺÇÒ´ÀÒ¾ËÃ×Í¢éͤÇÒÁŧº¹ CView |
|
CDocument*
GetDocument( );
|
|
| â´Â¿Ñ§¡ìªÑè¹¹Õé ¨Ð¤×¹¤èÒ µÑǪÕéä»Âѧ CDocument ·Õèàª×èÍÁµè͡Ѻ¤ÅÒÊ CView ¹Õé áµè¶éÒäÁèÁÕ¤ÅÒÊ CDocument àª×èÍÁµè͡Ѻ¤ÅÒÊ CView ¹ÕéàÅ ¿Ñ§¡ìªÑè¹¹Õé¨Ð¤×¹¤èÒ NULL ¡ÅѺÁÒ |
BOOL CMyApp::InitInstance()
{
CSingleDocTemplate* pTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMyFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pTemplate);
OnFileNew();
return TRUE;
}
|
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 ¢Í§â»Ãá¡ÃÁ |
| void AddDocTemplate( CDocTemplate* pTemplate ); | |
| â´Â·Õè pTemplate ¤×Í | µÑǪÕéä»Âѧµé¹áººàÍ¡ÊÒà (Document Template) ·Õèµéͧ¡Òà à¾ÔèÁà¢éÒä» ã¹ÃÒ¡Òõé¹áººàÍ¡ÊÒà ·Õèâ»Ãá¡ÃÁ¹Õé ÊÒÁÒöãªé§Ò¹ä´é |
|
afx_msg void
OnFileNew( );
|
|
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
|
// áÁÊàʨáÁ» ¢Í§¤ÅÒÊ·ÕèÊ׺·Í´ÁÒ¨Ò¡¤ÅÒÊ 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( ) |




// 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;
}
|



|
ª×èÍ Menu Item
|
ËÁÒÂàÅ¢ ID
|
| New |
ID_FILE_NEW
|
| Open |
ID_FILE_OPEN
|
| Save |
ID_FILE_SAVE
|
| Save As |
ID_FILE_SAVE
|
| Exit |
ID_APP_EXIT
|

|
ª×èÍ Menu Item
|
ËÁÒÂàÅ¢ ID
|
| Input Phone Number | ID_INPUT_PHONE |
| Erase Phone Number | ID_ERASE_PHONE |

|
ª¹Ô´ Control
|
ª×èÍ Caption
|
ËÁÒÂàÅ¢ ID
|
| Edit box | Name | IDC_EDIT_NAME |
| Edit box | Phone Number | IDC_EDIT_PHONE |
// 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);
}
|

// ¿Ñ§¡ìªÑè¹¹ÕéÍÂÙèã¹ä¿Åì CMyDoc.cpp |

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