如何动态创建和销毁Pane以及Pane中的View?

VRswan 2000-06-04 04:13:00
加精
我的SDI程序切分了两个窗口,在运行的时候有时需要不切分窗口,有什么办法可以把原来
切分了的窗口去掉,在需要的时候再次切分呢?
...全文
208 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjp 2000-06-05
  • 打赏
  • 举报
回复
也可按以下方法增加代码:
void CMainFrame::Delete_SplitterWnd()
{
if(m_SplitterWnd.GetSafeHwnd() == NULL)
return ;
...
}

void CMainFrame::Create_SplitterWnd()
{
if(m_SplitterWnd.GetSafeHwnd() != NULL)
return ;
...
}
fjp 2000-06-05
  • 打赏
  • 举报
回复
注意是两个菜单,一个切分,另一个删除。
这里的关键是要处理好菜单之间的关系。当窗口切分后不能再切分,反之,删除
之后不能再删第二次。可以这样处理:
如有两个menu项Splitter和UnSplitter分别代表切分和删除,可在CMainFrame
中设一成员变量BOOL bSliptter, 其初始值设为TRUE,表示窗口已切分,在两个函
数CMainFrame::Delete_SplitterWnd()和CMainFrame::Create_SplitterWnd()
中最后分别加上 bSplitter = !bSplitter ;
在ClassWizard找到Splitter和UnSplitter两菜单的ID,在CMainFrame中增加
UPDATE_COMMAND_UI处理函数,并加入以下代码:
void CMainFrame::OnUpdateSplitter(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!bSplitter) ;

}

void CMainFrame::OnUpdateUnsplitter(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(bSplitter) ;
}
这样当窗口切分后菜单Splitter变灰,反之UnSplitter变灰.

VRswan 2000-06-05
  • 打赏
  • 举报
回复
这个样子的话是可以删掉Splitter窗口并创建新的View,但是菜单就不能访问了,只要一点菜单就出错,是在CWnd::GetDlgItem()里出错,不知道为什么,现在我用了一个替代方法,是把原来的Splitter窗口隐藏,然后创建新的View,需要分割的时候就把新建的View删除,让原来的Splitter窗口恢复显示。这样可以工作,暂时看起来也没什么问题,但是为什么删除原来的分割窗口以后就不能访问菜单呢?
fjp 2000-06-05
  • 打赏
  • 举报
回复
//在CMainFrame中定义:
CSplitterWnd m_SplitterWnd ;

//重载OnCreateClient将主窗口切分为2行1列窗格
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_SplitterWnd.CreateStatic(this,2,1)) ;
VERIFY(m_SplitterWnd.CreateView(0,0,RUNTIME_CLASS(CEx16View),CSize(100,100), pContext)) ;
VERIFY(m_SplitterWnd.CreateView(1,0,RUNTIME_CLASS(CEx16View),CSize(0,0), pContext)) ;
return TRUE ;
}

//以下为删除切分窗口,重新生成新视的代码
void CMainFrame::Delete_SplitterWnd()
{
CCreateContext Context ;
CEx16View *pNewView, *pOldView ;

pOldView = (CEx16View *)GetActiveView() ;
ASSERT(pOldView != NULL) ;
Context.m_pCurrentDoc = pOldView->GetDocument() ;
ASSERT(Context.m_pCurrentDoc != NULL) ;
Context.m_pNewViewClass = RUNTIME_CLASS(CEx16View) ;
ASSERT(Context.m_pNewViewClass != NULL) ;
pNewView = STATIC_DOWNCAST(CEx16View, CreateView(&Context)) ;
ASSERT(pNewView != NULL) ;
pNewView->ShowWindow(SW_SHOW) ;
SetActiveView(pNewView) ;
pNewView->OnInitialUpdate() ;
VERIFY(m_SplitterWnd.DestroyWindow()) ;
RecalcLayout() ;
}

//以下为重新切分窗口的代码

void CMainFrame::Create_SplitterWnd()
{
CCreateContext Context ;
CView *pOldView = GetActiveView() ;
CSplitterWnd m_SpliWnd ;

Context.m_pCurrentDoc = pOldView->GetDocument() ;
ASSERT(Context.m_pCurrentDoc != NULL) ;
Context.m_pNewViewClass = RUNTIME_CLASS(CEx16View) ;
ASSERT(Context.m_pNewViewClass != NULL) ;
VERIFY(m_SpliWnd.CreateStatic(this,2,1)) ;
VERIFY(m_SpliWnd.CreateView(0,0,RUNTIME_CLASS(CEx16View),CSize(100,100), &Context)) ;
VERIFY(m_SpliWnd.CreateView(1,0,RUNTIME_CLASS(CEx16View),CSize(0,0), &Context)) ;
SetActiveView((CView *)m_SpliWnd.GetPane(0,0)) ;
m_SplitterWnd.Attach(m_SpliWnd.Detach()) ;
pOldView->DestroyWindow() ;
InitialUpdateFrame(Context.m_pCurrentDoc,TRUE) ;
RecalcLayout() ;
}

//你可在主菜单中生成两项菜单来分别调用以上代码.
sutao 2000-06-04
  • 打赏
  • 举报
回复
关注。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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