MFC中包含了幾個Windows通用對話框設計的封裝類。比如,在CFileDialog里可以利用常用的CDialog成員函數DoModal()函數操縱通用文件對話框。
為了從CFileDialog這樣的公共對話框類派生出程序員自己的子類,傳統方法需要創建一個“子對話框模板”,然后將模板關聯于派生出來的CFileDialog類。這個模板只能包括可增加到對話框中的控件。
但是,由于系統將這個派生的對話框模板的消息優先權隱含置于正常對話框順序之前,MFC消息路徑就不會到達這個新的控件類,因此在自己的派生CFileDialog
類里沒有辦法通過映射消息的方式編寫消息處理代碼。
在Visual C++ 6.0里這個問題得到了部分解決: MFC
消息路由可以起作用,但程序員還是不能使用 ClassWizard來增加消息處理器和成員變量。而且,如果試圖用
ClassWizard 從CFileDialog 派生一個類,它不會使能“Dialog ID”框,沒有辦法為自己的對話框分配ID號,ClassWizard也不會為對話框增加對應的關聯代碼。
可以使用下列方法解決這個問題:
使用ClassWizard從CDialog (而不是CFileDialog)
派生新類,然后修改基類和所生成新類的構造函數。結果,新類將會從CFileDialog類派生,
ClassWizard就能夠處理新增加的控件了。
步驟如下
1. 創建自己的模板。
2. 將該模板關聯于一個由CDialog派生出的類,使用ClassWizard (比如命名為CNewFileDialog)即可。
3. 在頭文件里,CNewFileDialog.h的定義處,插入如下代碼:
DECLARE—DYNAMIC(CNewFileDialog)
并修改構造函數的聲明:
CNewFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN—HIDEREADONLY | OFN—OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL, CWnd? pParentWnd = NULL);
4. 在新派生類的實現文件(.cpp)里,插入如下代碼:
IMPLEMENT—DYNAMIC(CNewFileDialog, CFileDialog)
然后修改構造函數定義:
CnewFileDialog::CNewFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
DWORD dwFlags, LPCTSTR lpszFilter, CWnd? pParentWnd) :
CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
m_ofn.Flags |= OFN—ENABLETEMPLATE | OFN—PATHMUSTEXIST |
OFN—FILEMUSTEXIST | OFN—SHAREAWARE | OFN—ALLOWMULTISELECT;
m—ofn.lpTemplateName = MAKEINTRESOURCE(IDD—ABOUTBOX1);}
最后,在所有頭文件和實現文件中用CFileDialog取代CDialog?!?/p>