程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++環境下多文檔模板應用程序開發(帶源碼)

VC++環境下多文檔模板應用程序開發(帶源碼)

編輯:C++入門知識

我們以前見到的關於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< for (int i = 0;i {
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;im_nBubbleCount;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




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved