可能大家用AppWizard向导后会有一个疑惑,AppWizard向导产生的菜单,比如“文件”菜单,我们没写一行代码,但却自动实现了相应的功能,它是怎么实现的?我们只能知道一个常识:一定是MFC框架在幕后做了一些事情,所以才会实现这些功能,这些功能自己是不会从天上掉下来的。
你应该知道,AppWizard向导产生的“文件”菜单下的各个菜单项如:新建、打开、保存、另存为等等实际上是对应以下ID:ID_FILE_NEW, ID_FILE_OPEN,ID_FILE_SAVE,ID_FILE_SAVE_AS.....
这些菜单项ID是MFC系统内置的,如果你想使用MFC框架提供的默认实现,就要用上面的这些ID值,不可更改。要是你改了ID,你就要自己去实现。
①在AppWizard产生的应用程序类(继承自CWinApp)中处理:
ID_FILE_NEW, ID_FILE_OPEN,ID_APP_ABOUT:
// CTestApp.cpp
BEGIN_MESSAGE_MAP(CTestApp, CWinApp)
//{{AFX_MSG_MAP(CTestApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
END_MESSAGE_MAP
②在CDocument类中处理(在DOCCORE.CPP中实现):
ID_FILE_CLOSE,ID_FILE_SAVE,ID_FILE_SAVE_AS:
// CDocument()
BEGIN_MESSAGE_MAP(CDocument, CCmdTarget)
//{{AFX_MSG_MAP(CDocument)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
上面是“文件”菜单的主要缺省处理,算是做为一个抛砖引玉吧。如果你在框架中使用了其它视类,比如CEditView,哪么就要在相应的cpp实现文件中查找对应的消息处理。
BEGIN_MESSAGE_MAP(CEditView, CCtrlView)
//{{AFX_MSG_MAP(CEditView)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateNeedSel)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateNeedClip)
ON_UPDATE_COMMAND_UI(ID_EDIT_SELECT_ALL, OnUpdateNeedText)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_FIND, OnUpdateNeedText)
ON_UPDATE_COMMAND_UI(ID_EDIT_REPLACE, OnUpdateNeedText)
ON_UPDATE_COMMAND_UI(ID_EDIT_REPEAT, OnUpdateNeedFind)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateNeedSel)
ON_UPDATE_COMMAND_UI(ID_EDIT_CLEAR, OnUpdateNeedSel)
ON_CONTROL_REFLECT_EX(EN_CHANGE, OnEditChange)
ON_WM_CREATE()
ON_MESSAGE(WM_SETFONT, OnSetFont)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll)
ON_COMMAND(ID_EDIT_FIND, OnEditFind)
ON_COMMAND(ID_EDIT_REPLACE, OnEditReplace)
ON_COMMAND(ID_EDIT_REPEAT, OnEditRepeat)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
// Special registered message for Find and Replace
ON_REGISTERED_MESSAGE(_afxMsgFindReplace, OnFindReplaceCmd)
// Standard Print commands (print only - not preview)
ON_COMMAND(ID_FILE_PRINT, CCtrlView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CCtrlView::OnFilePrint)
END_MESSAGE_MAP()
上面是CEditView类实现的IDS,这些ID你就不用费心去实现,CEditView类已经为你实现好了。有了上面的CEditView类实现,你基本上就可以实现一个比较完善的文本编辑器了,还不快动手实践一下!!