CMultiDocTemplate多文档框架窗口下建子窗口的问题

zxy9213 2006-07-21 11:52:34
希望能通过菜单点“子窗口1”,弹出一个唯一的“子窗口1”;点“子窗口2”,弹出一个唯一的“子窗口2”;.....
我自己尝试用多文档模版建,但老弹出叫我选择文档模版小窗口;用子窗口的方法去建,主框架窗口和子窗口又只能有一个框架兰色(=一个焦点),难看,不知道问题出在哪里,希望各位大侠比吝赐教,帮帮我这个菜鸟,谢谢!100分及时呈上
...全文
350 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cleverwyq 2006-07-23
  • 打赏
  • 举报
回复
ls的方法和我一样,不过我的多了一些判断而已,哈哈,原来程序的一部分,懒的改了,直接贴上来的
cleverwyq 2006-07-22
  • 打赏
  • 举报
回复
给你一个子类的代码
#if !defined(AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_)
#define AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ShowPicFrmWnd.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CShowPicFrmWnd frame

class CShowPicFrmWnd : public CMDIChildWnd
{
DECLARE_DYNCREATE(CShowPicFrmWnd)
public:
CShowPicFrmWnd(); // protected constructor used by dynamic creation

// Attributes
public:

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CShowPicFrmWnd)
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CShowPicFrmWnd();

// Generated message map functions
//{{AFX_MSG(CShowPicFrmWnd)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SHOWPICFRMWND_H__F24D853C_0B18_42AA_8AAD_CDE230418C29__INCLUDED_)
cleverwyq 2006-07-22
  • 打赏
  • 举报
回复
说明 首先要把 app里面对 CMultiDocTemplate *pDocTemplate1 = new CMultiDocTemplate(
IDI_ICON1,
RUNTIME_CLASS(CPicViewDoc),
RUNTIME_CLASS(CShowPicFrmWnd), // custom MDI child frame
RUNTIME_CLASS(CShowPicView));
AddDocTemplate(pDocTemplate1);

的声名去掉

我的程序中的几个class CShowPicFrmWnd;

class CShowChartWnd;
class CResultViewFrmWnd;
都是从CMDIChildWnd派生的子类,
void CTabDlg::OnPanechart() 等函数就是生成相应窗口的函数

cleverwyq 2006-07-22
  • 打赏
  • 举报
回复
#if !defined(AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_)
#define AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_
我以前的MDI

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TabDlg.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CTabDlg form view

#ifndef __AFXEXT_H__
#include <afxext.h>
#endif


class CShowPicFrmWnd;
class CPicViewDoc;
class CShowChartWnd;
class CResultViewFrmWnd;
class CTabDlg : public CFormView
{
protected:
CTabDlg(); // protected constructor used by dynamic creation
DECLARE_DYNCREATE(CTabDlg)
private:

// Form Data
public:
//{{AFX_DATA(CTabDlg)
enum { IDD = IDD_TABDLG };
//}}AFX_DATA

// Attributes
public:
BOOL b_ChartOpened,b_mainpicOpened,b_ResultOpened;

CShowPicFrmWnd *p_FrameShowPic;
CShowChartWnd *p_ShowChartWnd;
CResultViewFrmWnd *p_ResultWnd;
CCreateContext context_showpic,resultview_context;
// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabDlg)
public:
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
virtual ~CTabDlg();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif

// Generated message map functions
//{{AFX_MSG(CTabDlg)
afx_msg void OnMainpic();
afx_msg void OnPanechart();
afx_msg void OnPaneresult();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TABDLG_H__7F15FD4D_C850_4306_8EB8_4791CA7604C5__INCLUDED_)


//////////////////////实现

// TabDlg.cpp : implementation file
//

#include "stdafx.h"
#include "lab.h"
#include "TabDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
#include "ShowPicFrmWnd.h"
#include "ShowPicView.h"
#include "PicViewDoc.h"
#include "ShowChartWnd.h"

#include "ResultViewFrmWnd.h"
#include "ResultListView.h"

IMPLEMENT_DYNCREATE(CTabDlg, CFormView)
CPicViewDoc *p_Doc=NULL;
CTabDlg::CTabDlg()
: CFormView(CTabDlg::IDD)
{
//{{AFX_DATA_INIT(CTabDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
b_ChartOpened=FALSE;
b_mainpicOpened=FALSE;
b_ResultOpened=FALSE;
p_ShowChartWnd=NULL;
p_FrameShowPic=NULL;
p_ResultWnd=NULL;

p_Doc=new CPicViewDoc;
}

CTabDlg::~CTabDlg()
{
delete p_FrameShowPic;
delete p_ShowChartWnd;
delete p_ResultWnd;
}

void CTabDlg::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTabDlg)
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CTabDlg, CFormView)
//{{AFX_MSG_MAP(CTabDlg)
ON_BN_CLICKED(IDC_MAINPIC, OnMainpic)
ON_BN_CLICKED(IDC_PANECHART, OnPanechart)
ON_BN_CLICKED(IDC_PANERESULT, OnPaneresult)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTabDlg diagnostics

#ifdef _DEBUG
void CTabDlg::AssertValid() const
{
CFormView::AssertValid();
}

void CTabDlg::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTabDlg message handlers
//extern CPicViewDoc *g_picviewDoc;
void CTabDlg::OnMainpic()
{
// TODO: Add your control notification handler code here
if(!b_mainpicOpened)
{
p_FrameShowPic=new CShowPicFrmWnd();
context_showpic.m_pNewViewClass=RUNTIME_CLASS(CShowPicView);
context_showpic.m_pCurrentDoc=p_Doc;//new CPicViewDoc;//g_picviewDoc;
p_FrameShowPic->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD ,NULL,&context_showpic);
p_FrameShowPic->ShowWindow(SW_SHOW);

CRect rect;
AfxGetMainWnd()->GetClientRect(rect);
CRect DlgRect;
GetClientRect(DlgRect);

int width=rect.Width()-DlgRect.Width();
p_FrameShowPic->MoveWindow(CRect(0,rect.top,width*3/5,rect.bottom/2));
p_FrameShowPic->SetFocus();
b_mainpicOpened=TRUE;
}
else
{
if(p_FrameShowPic->IsWindowVisible())
{
p_FrameShowPic->ShowWindow(SW_HIDE);
}
else
{
p_FrameShowPic->ShowWindow(SW_SHOW);
p_FrameShowPic->SetFocus();
}
}
}

void CTabDlg::OnPanechart()
{
// TODO: Add your control notification handler code here
if(!b_ChartOpened)
{
p_ShowChartWnd=new CShowChartWnd;
p_ShowChartWnd->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD,NULL);
p_ShowChartWnd->ShowWindow(SW_SHOW);

CRect rect;
AfxGetMainWnd()->GetClientRect(rect);
CRect DlgRect;
GetClientRect(DlgRect);

int width=rect.Width()-DlgRect.Width();

p_ShowChartWnd->MoveWindow(CRect(width*3/5,rect.top,width,rect.bottom/2));

p_ShowChartWnd->SetFocus();
b_ChartOpened=TRUE;
}
else
{
if(p_ShowChartWnd->IsWindowVisible())
{
p_ShowChartWnd->ShowWindow(SW_HIDE);
}
else
{
p_ShowChartWnd->ShowWindow(SW_SHOW);
p_ShowChartWnd->SetFocus();
}
}
}

void CTabDlg::OnPaneresult()
{
// TODO: Add your control notification handler code here
if(!b_ResultOpened)
{
p_ResultWnd=new CResultViewFrmWnd();
resultview_context.m_pNewViewClass=RUNTIME_CLASS(CResultListView);
resultview_context.m_pCurrentDoc=p_Doc;//new CPicViewDoc;//g_picviewDoc;

if(p_Doc==NULL)
{
AfxMessageBox("Doc is null");
return;
}
p_ResultWnd->LoadFrame(IDI_ICON1,WS_OVERLAPPEDWINDOW|WS_CHILD ,NULL,&resultview_context);
p_ResultWnd->ShowWindow(SW_SHOW);

CRect rect;
AfxGetMainWnd()->GetClientRect(rect);
CRect DlgRect;
GetClientRect(DlgRect);

int width=rect.Width()-DlgRect.Width();
p_ResultWnd->MoveWindow(CRect(0,rect.bottom/2,width,rect.bottom));
p_ResultWnd->SetFocus();
b_ResultOpened=TRUE;
}
else
{
if(p_ResultWnd->IsWindowVisible())
{
p_ResultWnd->ShowWindow(SW_HIDE);
}
else
{
p_ResultWnd->ShowWindow(SW_SHOW);
p_ResultWnd->SetFocus();
}
}
}
zxy9213 2006-07-22
  • 打赏
  • 举报
回复
该如何实现呢?
gdsdyl 2006-07-22
  • 打赏
  • 举报
回复
如果楼主想做到这样的话,建议使用单文档多视好了,功能一样/实现简单.
Juchiyufei 2006-07-22
  • 打赏
  • 举报
回复
这样就可以了.你只需要写好你自己的视图类,框架若需要的话也可以自己写,否则就CChildFrame.
Juchiyufei 2006-07-22
  • 打赏
  • 举报
回复
我这种方法就不需要文档模板了.

CMainFrame::On子窗口1()
{
CCreateContext context;

CChildFrame *pFrmae = new CChildFrame;
context.m_pNewViewClass = RUNTIME_CLASS(CMyView);

context.的其它参数你可以根据需要再设置了.

// show
pFrame ->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW, this, &context);
pFrame ->InitialUpdateFrame(NULL, TRUE);
}
Juchiyufei 2006-07-22
  • 打赏
  • 举报
回复
楼主呀,你不用它们上面那样复杂,麻烦.

我这里有更好的方法给你.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧