我这样作了一个文档对应显示两个不同的视图的程序,可以分别显示出两个视图了,
CMultiDocTemplate* m_pDocTempMain;
CMultiDocTemplate* m_pDocTempOther; 在InitInstance()中
m_pDocTempMain = new CMultiDocTemplate(IDR_DEMOTYPE,
RUNTIME_CLASS(CCommeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMainView));
AddDocTemplate(m_pDocTempMain); pDocTempOther = new CMultiDocTemplate(IDR_FAULTTYPE,
RUNTIME_CLASS(CCommeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(COtherView));
AddDocTemplate(pDocTempOther); CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
}
if (!ProcessShellCommand(cmdInfo))
return FALSE; // 主窗口已初始化,因此显示它并对其进行更新
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
pMainFrame->UpdateWindow();
return TRUE;
请问,我这么实现这两个不同试图之间的切换显示,比如选择菜单的某一项显示
CMainView对应的视图,而选择另外一项则显示COtherView对应的视图?
CMultiDocTemplate* m_pDocTempMain;
CMultiDocTemplate* m_pDocTempOther; 在InitInstance()中
m_pDocTempMain = new CMultiDocTemplate(IDR_DEMOTYPE,
RUNTIME_CLASS(CCommeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMainView));
AddDocTemplate(m_pDocTempMain); pDocTempOther = new CMultiDocTemplate(IDR_FAULTTYPE,
RUNTIME_CLASS(CCommeDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(COtherView));
AddDocTemplate(pDocTempOther); CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
{
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
}
if (!ProcessShellCommand(cmdInfo))
return FALSE; // 主窗口已初始化,因此显示它并对其进行更新
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
pMainFrame->UpdateWindow();
return TRUE;
请问,我这么实现这两个不同试图之间的切换显示,比如选择菜单的某一项显示
CMainView对应的视图,而选择另外一项则显示COtherView对应的视图?
解决方案 »
- 大家有没有什么图像自适应增强的算法?
- MFC 多文档 源码
- 关于高性能服务器的问题
- 用向导生成的CHtmlView类,不写一句代码,编译通过,为何在运行的时候还会报错?
- vc2003debug下可以正确编译,release下面却出现error C2099: 初始值设定项不是常数的错误!
- flexgrid 换行 , 设置行宽
- 我写的程序为什么在Debug状态下Compile,Build,Run均没什么问题,在Release下Compile,Build没问题,但Run时,出现了“内存读”的消息提示
- 为什么编译出错,找不到AfxLoadLibrary()?
- 什么是内存泄漏?具个简单的例子来看看~~!谢谢
- 在com返回另一个com的接口
- 用mfc发现的实在时奇怪的东西,解决不了
- 程序在运行过程中出现内存存取错误!
CMyApp::OnViewMainView()
{
m_pDocTempMain->OpenDocumentFile(NULL);//显示CMainView对应的视图
}CMyApp::OnViewOtherView()
{
m_pDocTempOther->OpenDocumentFile(NULL);//显示COtherView对应的视图
}
m_pDocTempMain->OpenDocumentFile(NULL);//显示CMainView对应的视图
m_pDocTempOther->OpenDocumentFile(NULL);//显示COtherView对应的视图
之后,比如当前显示的是CMainView视图,如何切换到COtherView视图显示,
而不是再创建一个新的视图显示。也就是实现一般的文档/试图中的“窗口”
菜单中的窗口选择功能。
我创建了一个带有静态分隔区的sdi应用程序,左边显示工作区,右过显示左边选取
的东西.我想达到的是如果在分隔区之间进行切换,而不覆盖或破坏原来的CView对象.
A:以下代码是你所想要的:
class CExSplitterWnd : public CSplitterWnd
{
// Construction
public:
CExSplitterWnd();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CExSplitterWnd)
//}}AFX_VIRTUAL
// Implementation
virtual ~CExSplitterWnd();
BOOL AttachView(CWnd* pView, int row, int col);
BOOL DetachView(int row, int col);
// Generated message map functions
//{{AFX_MSG(CExSplitterWnd)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};CExSplitterWnd::CExSplitterWnd()
{
}CExSplitterWnd::~CExSplitterWnd()
{
}BOOL CExSplitterWnd::AttachView(CWnd* pView, int row, int col)
{
//Make sure the splitter window was created
if (!IsWindow(m_hWnd))
{
ASSERT(0);
TRACE(_T("Create the splitter window before attaching windows to panes"));
return (FALSE);
} //Make sure the row and col indices are within bounds
if (row >= GetRowCount() || col >= GetColumnCount())
{
ASSERT(0);
return FALSE;
} //Is the window to be attached a valid one
if (pView == NULL || (!IsWindow(pView->m_hWnd)))
{
ASSERT(0);
return FALSE;
} pView->SetDlgCtrlID(IdFromRowCol(row, col));
pView->SetParent(this);
pView->ShowWindow(SW_SHOW);
pView->UpdateWindow();
return (TRUE);
}BOOL CExSplitterWnd::DetachView(int row, int col)
{
//Make sure the splitter window was created
if (!IsWindow(m_hWnd))
{
ASSERT(0);
TRACE(_T("Create the splitter window before attaching windows to panes"));
return (FALSE);
} //Make sure the row and col indices are
//within bounds
if (row >= GetRowCount() || col >= GetColumnCount())
{
ASSERT(0);
return FALSE;
} CWnd* pWnd = GetPane(row, col);
if (pWnd == NULL || (!IsWindow(pWnd->m_hWnd)))
{
ASSERT(0);
return FALSE;
}
pWnd->ShowWindow(SW_HIDE);
pWnd->UpdateWindow(); //Set the parent window handle to NULL so that this child window is not
//destroyed when the parent (splitter) is destroyed
pWnd->SetParent(NULL);
return (TRUE);
}
void CXXXView::SwitchToForm(int nForm)
{
CView* pOldView = GetActiveView();
CView* pNewView = (CView*)GetDlgItem(nForm);
if(pNewView ==NULL)
{
switch(nForm)
{
case IDD_YOURVIEW1:
pNewView = (CView*) new CXXXView;
break;
case IDD_YOURVIEW2:
pNewView = (CView*) new CXXXView;
break;
..........
}
CCreateContext context;
context.m_pCurrentDoc = pOldView->GetDocument();
pNewView = pOldView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,nForm,&context);
pNewView->OnInitialUpdate();
}
SetActiveView(pNewView);
pNewView->ShowWindow(SW_SHOW);
pOldView->ShowWindow(SW_HIDE);
::SetWindowWord(pNewView->m_hWnd,GWL_ID,AFX_IDW_PANE_FIRST);
RecalcLayout();
delete pOldView;
}