动态分割窗口,
我做动态分割窗口的单文档程序,很不如意
能动态横向竖向分割,能删除任何一个窗格
能把布局保存到文件中
哪位高手做个示范。
删除活动窗口怎么做?
最好有个例子
谢了
问题点数:100、回复次数:6Top
1 楼whoo(谁)回复于 2004-07-04 23:51:26 得分 10
MFC CSplitterWnd 本身 不能完成删除的功能, 不过可以从他继承下来,自己完成该功能,不过比较繁琐。
可以在网上找一些CSplitterWnd 的现成改进类,很多都新增了这个功能。Top
2 楼pomelowu(羽战士)回复于 2004-07-04 23:58:51 得分 10
删除比较复杂,但是隐藏还是比较容易的Top
3 楼yintongshun(左岸思雨)回复于 2004-07-05 00:01:46 得分 40
bool CChildFrame::DeleteView()
{
CDocument * pDoc= NULL;
CCreateContext context;
pDoc=this->GetActiveDocument();
ASSERT(pDoc);
context.m_pNewViewClass=RUNTIME_CLASS(CNetObserverView);
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
if(m_pSplt==NULL)
{
TRACE("delete View is error!\n");
return false;
}
pDoc->m_bAutoDelete=FALSE;
if (m_pSplt->m_hWnd)
{
m_pSplt->DestroyWindow();
}
delete m_pSplt;
m_pSplt=NULL;
pDoc->m_bAutoDelete=TRUE;
//下面要创建父窗口的右侧视图
m_wndSplitter.CreateView(0,1,context.m_pNewViewClass,CSize(100, 100), &context);
CView * pNewView= (CView *)m_wndSplitter.GetPane(0,1);
pNewView->OnInitialUpdate();
SetActiveView(pNewView);
m_wndSplitter.RecalcLayout();
TRACE("delete View is good!\n");
return true;
}
bool CChildFrame::AddView(CRuntimeClass *pNewViewClass)
{
//if(m_pSplt!=NULL) return ;
//添加View,用于服务列表视图
CDocument * pDoc= NULL;
CCreateContext context;
pDoc=this->GetActiveDocument();
ASSERT(pDoc);
ASSERT(m_pSplt==NULL);
//设备上下文
// if(m_pSplt!=NULL) return false;
context.m_pNewViewClass=pNewViewClass;
context.m_pCurrentDoc=pDoc;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
pDoc->m_bAutoDelete=FALSE;
CView* pV = (CView *)m_wndSplitter.GetPane(0,1);
ASSERT(pV);
pV->DestroyWindow();
pDoc->m_bAutoDelete=TRUE;
m_pSplt = new CSplitterWnd;
if (!m_pSplt->CreateStatic (&m_wndSplitter, 2,1,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1)))
{
TRACE("Add View is error!\n");
return false;
}
CView * pNewView;
context.m_pNewViewClass=RUNTIME_CLASS(CNetObserverView);
m_pSplt->CreateView(0,0,context.m_pNewViewClass,CSize(100, 100), &context);
pNewView= (CView *)m_pSplt->GetPane(0,0);
pNewView->OnInitialUpdate();
context.m_pNewViewClass=pNewViewClass;
m_pSplt->CreateView(1,0,pNewViewClass,CSize(100, 100), &context);
pNewView= (CView *)m_pSplt->GetPane(1,0);
pNewView->OnInitialUpdate();
SetActiveView(pNewView);
m_pSplt->RecalcLayout();
m_wndSplitter.RecalcLayout();
RecalcLayout();
TRACE("Add View is good!\n");
return true;
}
使用方法:
DeleteView();然后AddView(RUNTIME_CLASS(CYourView));Top
4 楼enoloo(在水一方)回复于 2004-07-05 00:50:28 得分 30
基本的撤消视图和分割条,可以到网上找资料。
在设计上,可以写一个结构来管理这些分割条对象。比如:
class CSplitterInfo
{
public:
int m_MaxRow, m_MaxCol;
CSplitterWnd m_wndSplitter;
CSplitterInfo::CSplitInfo();
CSplitterInfo &operator=(const CSplitInfo &SplitInfo);
};
在主窗口可以通过编号维护一组splitter的映射表,
CMap <int, int, CSplitterInfo, CSplitterInfo&> m_SplitterInfo;
对于不同的视图,可以指定依靠的splitter id.移动视图或者显示视图的时候,可以根据这些信息定位和通信。Top
5 楼changlele(梦幻水晶)回复于 2004-07-05 15:41:43 得分 10
楼主,邮箱地址?
我发个例子给你看看。
Top
6 楼wang_bluebird(bluebird)回复于 2005-03-10 17:34:06 得分 0
能不能给各例子???Top




