加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

mfc如何实现某个窗口的显示与隐藏功能——解决分割栏消失的问题

(2012-08-21 11:18:51)
标签:

mfc

分割栏

显示

隐藏

it

分类: mfc初学

    此功能网上也有不少人在说,可是都没有说到细节,使得点击显示按钮后,本来该有的分割线总是会消失。最后这个功能让我弄了一天才搞定,于是和大家分享下我的心得。

    第一步:在CMainFrame类中添加虚函数OnCreateClient,并且如下编写函数:

//其中m_wndspider在类中定义: CSplitterWnd m_wndspider;

//CCMemDBBrowseView以及CInformationView是两个view类的类名。

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
 // TODO: Add your specialized code here and/or call the base class

//1 分割窗口为1行2列
 if(m_wndspider.CreateStatic(this,1,2) == NULL)
 {
  TRACE0("窗口分割失败!");
  return FALSE;
 }

 CRect rect;
 GetClientRect(&rect);//得到整个窗口大小
 if(!m_wndspider.CreateView(0,0,RUNTIME_CLASS(CCMemDBBrowseView),CSize(rect.Width()/4*3,rect.Height()-40),pContext))//左窗口
 {
  TRACE0("左框架窗口创建失败!");
  return FALSE;
 }
 m_Memview=(CCMemDBBrowseView*)m_wndspider.GetPane(0,0);
 if(!m_wndspider.CreateView(0,1,RUNTIME_CLASS(CInformationView),CSize(rect.Width()/4,rect.Height()-40),pContext))//右窗口
 {
  TRACE0("右框架窗口创建失败!");
  return FALSE;
 }
 m_infView=(CInformationView*)m_wndspider.GetPane(0,1);
 return TRUE;

}

如此窗口就被分成了左右两个,并且得到两个分别指向两个窗口的指针m_Memview和m_infView。

    第二步:在按钮显示/隐藏上右击选择classwizard,添加单击函数以及update函数,创建两个基于CMainFrame类的函数。

1 update函数简单:初始状态有两个窗口,当m_nView为正,则隐藏第二个窗口,为0则显示。

void CMainFrame::OnUpdateFrame(CCmdUI* pCmdUI)
{
 // TODO: Add your command update UI handler code here
 pCmdUI->SetCheck(m_nView);
}

2 然后定义单击函数:这里就是我想说的重点。由于我们随时都可能拖动分割栏,造成了左右窗口并不是我们开始定义的窗口大小了,所以我们不能每次仅仅隐藏右窗口以及显示右窗口。我们要在隐藏右窗口的时候得到左边窗口的大小,记录下来;然后在我们需要显示的时候将这个大小赋值给左窗口,这样才不会出现分割栏总是莫名其妙的消失的现象。m_rect是类中定义的CRect变量。

void CMainFrame::OnFrame()
{
 // TODO: Add your command handler code here
 m_nView = !m_nView;
 CRect rect;
 GetClientRect(&rect);
 if(m_nView == 1)//隐藏,即将左窗口位置调整成最大值
 {

  m_Memview->GetWindowRect(m_rect);//注意这条语句的位置!!!放在第一句才能取得隐藏前的窗口大小
  m_Memview->MoveWindow(0,0,rect.Width(),rect.Height()-40);  

  m_Memview->ShowWindow(SW_SHOW);

  m_infView->ShowWindow(SW_HIDE);
   }
 else if(m_nView == 0)//显示
 {
  m_Memview->MoveWindow(0,0,m_rect.Width(),rect.Height()-40);

  m_Memview->ShowWindow(SW_SHOW);
  m_infView->ShowWindow(SW_SHOW);
 }
}

总结:保存下隐藏前的各个窗口状态,显示的时候调用那时的状态就不会出现分割栏消失的问题了。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有