MFC多文档问题:我有两个文档模板,我想实现在其中一个文档模板的视图里画绘制某个图行形,保存为.l

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC多文档问题:我有两个文档模板,我想实现在其中一个文档模板的视图里画绘制某个图行形,保存为.l相关的知识,希望对你有一定的参考价值。

MFC多文档问题:我有两个文档模板,我想实现在其中一个文档模板的视图里画绘制某个图行形,保存为.lib文件,然后在另一个文档中加载.lib文件后可以直接把之前画的那个图形当成物件放到该视图里,哪位大神知道怎么样可以办到

    //*.lib所用的模版保存到pDocTemplate
    CString csFileName;
    if(!theApp.DoPromptFileName(csFileName,    AFX_IDS_OPENFILE,
        OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, TRUE, pDocTemplate)
        )return;//打开文件,按pDocTemplate填充打开对话框
    CDocument* pNewDoc = pDocTemplate->CreateNewDocument();//建立新的pDocTemplate的文档
    if(!pNewDoc->OnOpenDocument(csFileName))return;//读入数据
    
    //然后就可以把pNewDoc文档的数据复制到另一个文档里,或者直接把pNewDoc当令一个文档的数据
    //如果另一个文档是pthisDoc
    pthisDoc->UpdatAllViews(NULL);//更新文档的所有视图
    //视图在OnUpdate里更新,比如处理需要更新的数据范围,调用invalidate等
    //然后视图按照文档数据绘图就行

追问

阁下可以加我Q吗?7-5-2-3-9-9-7-4-6详细问下!

追答

加了,是潮水的诺言没错吧?

参考技术A 暖贴。

mfc中MDI模式下实现单文档多视图多窗口

mfc在mdi模式下可以很方便的实现多文档多视图,但是如何实现单文档多视图呢?例如对于一堆数据,我们既想以文本的方式显示,同时也想支持表格或者图形的展示方式,这就是单文档多视图的主要应用场景。参考侯俊杰的《深入浅出mfc》,主要的实现思路总结如下。

1、编写视图类
编写继承自CView的MyView,类型个数没有限制,例如可以添加一个图形的MyDrawView,一个图表的MyTableView。

2、注册视图模板
在当前程序唯一对象类(继承自CWinApp)的InitInstance函数添加如下代码:
m_newDocTemp = new CMultiDocTemplate(IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMyView));

通常可以写在默认的AddDocTemplate(pDocTemplate)的后面,注意m_newDocTemp 不要调用AddDocTemplate,后面我们会手动调用相应的文档模板。CMyView就是在第1步中编写的视图类。

3、打开视图
参考《深入浅出mfc》541页的说明,mfc在内部实现了OnWindowNew函数,所以我们可以打开mfc的源码,找到OnWindowNew的实现,然后拷贝到我们自己的打开函数中。

CMDIChildWnd *pActiveChild = MDIGetActive();
CDocument *pDocument;
if (pActiveChild == NULL ||
(pDocument = pActiveChild->GetActiveDocument()) == NULL)
{
TRACE(traceAppMsg, 0, "Warning: No active document for WindowNew command. ");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
return nullptr; // command failed
}

// otherwise we have a new frame !
//CDocTemplate *pTemplate = pDocument->GetDocTemplate();
CDocTemplate *pTemplate = dynamic_cast<CMyCApp *>(AfxGetApp())->m_myDocTemp;
ASSERT_VALID(pTemplate);
CFrameWnd *pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
if (pFrame == NULL)
{
TRACE(traceAppMsg, 0, "Warning: failed to create new frame. ");
return nullptr; // command failed
}

pTemplate->InitialUpdateFrame(pFrame, pDocument);

其中的m_myDocTemp就是我们在第一步声明的。

4、如何定义多视图窗口标签的标题
在CChildFrame::PreCreateWindow函数中添加如下语句
cs.style &= ~(LONG)FWS_ADDTOTlTLE;
然后第3步创建完视图之后,可以通过 pFrame->SetWindowText(name.c_str())设置窗口标题

5、如何遍历多视图
POSITION pos = tabGroups.GetHeadPosition();
while (pos)
{
CMFCTabCtrl *pTabCtrl = (CMFCTabCtrl*)tabGroups.GetNext(pos);
for (int i = 0; i < pTabCtrl->GetTabsNum(); i++)
{
CMDIChildWndEx *pChildWnd = dynamic_cast <CMDIChildWndEx *>(pTabCtrl->GetTabWnd(i));
}
}

 

以上是关于MFC多文档问题:我有两个文档模板,我想实现在其中一个文档模板的视图里画绘制某个图行形,保存为.l的主要内容,如果未能解决你的问题,请参考以下文章

mfc 单文档 多文档 对话框 区别

mfc中MDI模式下实现单文档多视图多窗口

MFC单文档 添加 多视图

MultiThread(VS2013 MFC多线程-含源码-含个人逐步实现文档)

mfc 多文档中怎样动态添加菜单项?

MFC应用程序类型