我們以前見到的關於VC++環境下利用APP Wizard 自動生成的MDI的應用程序只支持打開同一文檔類型的多個文件,但是不能夠同時打開不同種類型的文檔。網上的這種公開資料比較少,我在知網上查閱了相關的資料。下面我根據這些資料做一下總結(辛辛苦苦一個一個字碼出來的)。
下面設計一個能夠處理兩種文檔類型的應用程序:第一種文檔類型:TXT文檔,第二種文檔類型:Bub的文檔類型。
第一種的文檔類型TXT,是利用APP Wizard自動生成的,只不過是在設置的時候將文檔類型設置為TXT類型,並且使生成的視圖派生類繼承與CEditView類。
第二種文檔類型Bub,這個類型是在生成的MDI程序中添加的自定義文檔類型(下面會有相應的介紹).
應用程序建立過程(最後會將相應的源碼上傳以供大家下載)注意下面的介紹是VC6.0為開發工具:
1.首先使用APP Wizard建立一個MDI程序,注意在建立的過程中需要在第4步的Advanced Options對話框中設置文件的擴展名為txt;在第6步中將視圖類的基類設置為CEditView.編譯完成後,該應用程序就可以對文本文件進行相應的編輯了。
2. 下面通過Insert/New Class 菜單選項為項目添加3個MFC派生類CBubDoc ,CBubView和CBubFrame類分別派生於CDocument ,CView和CMDIChildWnd.
為CBubDoc類添加兩個數據成員:
CRect m_rectBubble[MAX_BUBLLE];
int m_nBubbleCount;
其中MAX_BUBLLE被定義為200;
使用Class Wizard 為CBubDoc類添加DeleteContents()函數,並為其添加代碼:
m_nBubbleCount = 0;
修改CBubDoc類的Serialize()函數並使之可以存取泡泡圖形數據。
if (ar.IsStoring())
{
ar<
ar<
}
else
{
ar>>m_nBubbleCount;
for (int i = 0;i
ar>>m_rectBubble[i];
}
}
在CBubView類頭文件首部添加#include “BubDoc.h”並為CBubView類添加一個成員函數
public:
CBubDoc * GetDocument();
在類聲明的結束處添加以下代碼:
#ifndef _DEBUG
inline CBubDoc * CBubView::GetDocument()
{
return (CBubDoc *) m_pDocument;
}
#endif
在相應的類實現文件中添加以下代碼:
CBubDoc * CBubView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBubDoc)));
return (CBubDoc *) m_pDocument;
}
修改CBubView類的OnDraw函數,使其可以顯示泡泡圖形。
代碼如下:
void CBubView::OnDraw(CDC* pDC)
{
CBubDoc* pDoc = GetDocument();
pDC->SelectStockObject(LTGRAY_BRUSH);
for (int i =0;i
{
pDC->Ellipse(pDoc->m_rectBubble[i]);
}
}
使用Class Wizard為CBubView類添加鼠標左鍵按下的消息處理函數,並編輯代碼如下:
void CBubView::OnLButtonDown(UINT nFlags, CPoint point)
{
CBubDoc * pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (pDoc->m_nBubbleCount
int r = rand()%50 + 10;
pDoc->m_rectBubble[pDoc->m_nBubbleCount] =
CRect(point.x-r,point.y-r,point.x+r,point.y+r);
InvalidateRect(pDoc->m_rectBubble[pDoc->m_nBubbleCount]);
pDoc->m_nBubbleCount++;
}
CView::OnLButtonDown(nFlags, point);
}
3.為新文檔類型定義資源標識符IDR_BUBTYPE,該標識符用於新文檔類型的所有資源,包括字符串資源,子框架窗口菜單和圖標。
4.在字符串資源中為新的文檔類型添加新的字符串資源(標識符為IDR_BUBTYPE)
如下:
Bub程序界面\nBub\nBub\nBub文件(*.bub)\n.bub\nBub.Document\nBub Document
相應的解釋如下:
\n 為分隔符:
以下的字符按照上面的順序依次介紹,大家可以一一對應的看:
Bub程序界面 :應用程序窗口標題(僅對單文檔界面有效)
\nBub :文檔類型
\nBub :文檔名稱(出現在選擇文件對話框中的)
\nBub文件(*.bub) :文件名過濾器(出現在選擇文件對話框中的)
\n.bub :文檔擴展名
\nBub.Document :存儲在系統注冊表中的文檔類型標識符
\nBub Document :存儲在系統注冊表中的文檔類型
5.編輯主框架窗口菜單資源。
在文件子菜單中添加新類型文檔的新建和打開選項。這兩個菜單選項的標識符設置為ID_FILE_NEW_BUB和ID_FILE_OPEN_BUB,並且將原來的新建菜單選項的標識符改為ID_FILE_NEW_TXT.
6.編輯主框架窗口的工具條資源。可以自行設置,不過標識符小一樣哦。
7.利用Insert/Resource為新的文檔類型的子框架窗口添加菜單資源(標識符為IDR_BUBTYPE)。
其中文件子菜單下的選項包括新建圖形文檔(ID_FILE_NEW_BUB),打開圖形文檔(ID_FILE_OPEN_BUB)和新建文本文檔(ID_FILE_NEW_TXT),打開文本文檔(ID_FILE_OPEN),關閉文檔,保存文檔,另存為和退出。
其他的未列出來的標識符按照主框架的菜單設置,剩余的其他的菜單項按照主框架的菜單設置。
8.為新建的文檔類型添加圖標資源(標識符IDR_BUBTYPE)
9.在應用程序派生類中找到相應的InitInstance()函數,添加以下代碼設置新的文檔模板;
CMultiDocTemplate* pBubTemplate;
pBubTemplate = new CMultiDocTemplate(
IDR_BUBTYPE,
RUNTIME_CLASS(CBubDoc),
RUNTIME_CLASS(CBubFrame),
RUNTIME_CLASS(CBubView));
AddDocTemplate(pBubTemplate);
並在調用ProcessShellCommand(cmdInfo)之前添加如下代碼:
//主要是在應用程序的建立的時候不建立任何類型的文檔。
cmdInfo.m_nShellCommand = CCommandLineInfo.FileNothing;
在應用程序的派生類的頭部添加以下代碼:
#include "BubDoc.h"
#include "BubFrame.h"
#include "BubView.h"
並使用Class Wizard 創建ID_FILE_NEW_BUB ,ID_FILE_OPEN_BUB和ID_FILE_NEW_TXT的消息響應函數。
響應函數的代碼如下:
void CMultiDoctempApp::OnFileNewTxt()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Txt"))
{
curTemplate->OpenDocumentFile(NULL);
return;
}
}
AfxMessageBox("NO TXTTEMPALTE!");
}
void CMultiDoctempApp::OnFileNewBub()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Bub"))
{
curTemplate->OpenDocumentFile(NULL);
return;
}
}
AfxMessageBox("NO BUBTEMPALTE!");
}
void CMultiDoctempApp::OnFileOpenBub()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Bub"))
{
CFileDialog dlg(true);
if (dlg.DoModal() == IDOK)
{
CString path = dlg.GetPathName();
curTemplate->OpenDocumentFile(path);
}
return;
}
}
AfxMessageBox("NO TXTTEMPALTE!");
}
以上的介紹就是VC++環境下多文檔模板應用程序開發的一個小例子。希望能夠幫助到大家。
該篇文章參考知網上的論文資料本人總結所得。
源碼的下載地址:http://download.csdn.net/my