请问如何实现同一个界面的多视图间切换?

snow_xmas 2011-01-03 12:31:51
  我现在需要在一个SDI当中切分成左右两个视图界面,左面用CTreeView作为菜单选择区,右面的功能区需要根据左面菜单区的选项不同而在3种视图类型(CTreeView、CFormView、CListView)当中来回切换。
  我之前写过一个与上面类似但比上面简单的程序,右面的功能区由N个不同的对话框资源共享一个CFormView显示在右面的功能区。仅仅是对话框的切换,现在需要在不同的子视图间切换。研究了老半天SDI的代码,始终找不到办法,麻烦哪位高手能指点一下。
...全文
205 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dianhui 2011-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ilysony 的回复:]

这个就是MFC的 MDI吧。
[/Quote]
看他描述,好象还需要做多文档模板类哦,每个模板类用不同的视图才能实现需要的效果。
Sou2012 2011-01-04
  • 打赏
  • 举报
回复
这个就是MFC的 MDI吧。
icessl 2011-01-03
  • 打赏
  • 举报
回复
下面是主要代码:
MySupHideSplitWnd.h:

class CMySupHideSplitWnd : public CSplitterWnd
{
public:
BOOL CreateHideView(int SeqNumber,CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext);
int ShowThisView(int SeqNumber,int row,int col);
static int GetIDFromRowAndCol(int row,int col);
protected:
CWnd * m_pViews[64];
........... // 其它部分
}

-----------------------------------------------------------------
MySupHideSplitWnd.cpp:

CMySupHideSplitWnd::CMySupHideSplitWnd()
{
memset(m_pViews,0,sizeof(m_pViews));
}

CMySupHideSplitWnd::~CMySupHideSplitWnd()
{
}

int CMySupHideSplitWnd::GetIDFromRowAndCol(int row,int col)
{
return AFX_IDW_PANE_FIRST + row * 16 + col;
}


BOOL CMySupHideSplitWnd::CreateHideView(int SeqNumber,CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext)
{
CreateView(0,0,pViewClass, sizeInit,pContext);

m_pViews[SeqNumber]=GetDlgItem(IdFromRowCol(0,0));
m_pViews[SeqNumber]->SetDlgCtrlID(GetIDFromRowAndCol(2,SeqNumber));
return TRUE;
}

int CMySupHideSplitWnd::ShowThisView(int SeqNumber,int row,int col)
{
int i,x=IdFromRowCol(row,col);
CWnd * p=GetDlgItem(x);

if (p)
{
p->ShowWindow(SW_HIDE);
for (i=0;i<64;i++)
if (m_pViews[i]==p)
{
p->SetDlgCtrlID(GetIDFromRowAndCol(2,i));
break;
}
}
m_pViews[SeqNumber]->ShowWindow(SW_SHOW);
m_pViews[SeqNumber]->SetDlgCtrlID(x);
return 0;
}
------------------------------------------------------
在 MainFrame.h 里加上
CMySupHideSplitWnd m_wndSplitter;

MainFrame 初始化时:

m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateHideView(0,RUNTIME_CLASS(左边的View的类名),z,pContext);
m_wndSplitter.CreateHideView(1,RUNTIME_CLASS(右边第一个View的类名),z,pContext);
m_wndSplitter.CreateHideView(2,RUNTIME_CLASS(右边第二个View的类名),z,pContext);
m_wndSplitter.CreateHideView(3,RUNTIME_CLASS(右边第三个View的类名),z,pContext);

m_wndSplitter.ShowThisView(0,0,0);
m_wndSplitter.ShowThisView(1,0,1);
RecalcLayout(); // 开始时,只显示左边的右边第一个View
..................
-----------------------------------------
需要切换时,执行
m_wndSplitter.ShowThisView(右边View的编号,0,1); // 把指定的View显示到(0,1)格中
RecalcLayout(); // 刷新屏幕
icessl 2011-01-03
  • 打赏
  • 举报
回复
自己定义一个 CMySplitterWnd 类,支持视隐藏即可
schlafenhamster 2011-01-03
  • 打赏
  • 举报
回复
CWnd * m_pViews[64];//资源耗费很多吧?

15,979

社区成员

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

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