CSplitterWnd中隐藏分割条的问题

universes 2005-05-26 11:16:31
我参考了网上很多人的代码,都是写了一个HideSplitter函数来实现的:
void CMySplitterWnd::HideSplitter()
{
m_cx=m_cxSplitterGap;//save previous cx
m_cy=m_cxSplitterGap;//save previous cy
m_cxSplitterGap=0;
m_cySplitterGap=0;
}

现在我使用这个函数隐约能看见隐藏分割条的功能了,但是遇到了一些莫名的问题。

我用了两个CMySplitterWnd,一个为out,一个为in
out是2行1列:上面一行是个CFormView,下面一行是in
in是1行2列:左右都是CFormView

在BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)里,我用了一下语句:
out.HideSplitter();
in.HideSplitter();

出来后in的分割条看不见了,out的分割条还在:(

还有一个问题,当我点击in中左边CFormView中的某个按钮,对右边的视图进行切换时,in的分割条也出现了!即使在切换视图后调用了HideSplitter()也不行。

然而更奇怪的是调用out上面的CFormView中的某个按钮对in中的两个视图进行切换,并调用in.HideSplitter()时,可以将下面的分割条去掉,但是调用out.HideSplitter()去不能将out的分割条去掉:(

我刚刚开始学vc,遇到这么奇怪的问题,很是不解,望高手赐教!不甚感激!
...全文
665 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
universes 2005-05-30
  • 打赏
  • 举报
回复
^_^ 问题终于搞定了!多谢allenhiman,你给了我很好的提示,后来请同学帮忙,修改了你的代码后功能就实现了。
多谢各位的参与!
allenhiman 2005-05-27
  • 打赏
  • 举报
回复
请您注意 如果你改变了分割条的宽度,或者去掉了它的边框, 就必须手动重画它的边框和填充
//do like this
void YourSplitterWnd::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg)
{
if (pDC == NULL)
{
RedrawWindow(rectArg, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
return;
}
ASSERT_VALID(pDC);

// otherwise, actually draw
CRect rect = rectArg;
if(nType == splitBorder)
{
pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNFACE), GetSysColor(COLOR_BTNFACE));
rect.InflateRect(-1, -1);
pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNSHADOW));
return;
}

// fill the middle
else{
COLORREF clr = GetSysColor(COLOR_3DHILIGHT);
pDC->FillSolidRect(rect, clr);
}
}
//如果还有疑问 给我油箱
koko1998 2005-05-27
  • 打赏
  • 举报
回复
mark
universes 2005-05-27
  • 打赏
  • 举报
回复
上面就是我提到的问题的代码,我觉得有困难是分割条隐藏了,出来的那些像分割条的东西可能是边框之类的。但我将那些dialog的border都选为none了,而且下面in中的分割条在OnBtnUP()里是可以隐藏的,但是到了OnButton1()中又出来了。

而且我发现是某个CMySplitterWnd中的一个窗格中的按钮不能隐藏这个CMySplitterWnd的分割条,只能隐藏在它的某个窗格中的内嵌CMySplitter的分割条。像out中的OnBtnUP就能隐藏in的分割条,而in中的OnButton1就干脆谁的分割条都不能隐藏:(

请高手给出指点,不甚感激!
cosmoses 2005-05-27
  • 打赏
  • 举报
回复
隐藏分割条,将m_cxSplitterCap设为0
universes 2005-05-27
  • 打赏
  • 举报
回复
allenhiman(YadWe):多谢!

我添加了你的代码,但还是和原来一样:(

是不是要显式的调用这个函数?我只在CMySplitterWnd里添加了这个函数,其余时候并没有显式调用
universes 2005-05-26
  • 打赏
  • 举报
回复
下面这也是个按钮事件,在in中的左边一个CFormView中。

void CViewL2::OnButton1()
{
// TODO: Add your control notification handler code here
CMainFrame *pmf;
pmf = (CMainFrame *)this->GetParentFrame();
pmf->SwitchR(1);
pmf->m_wndSplitter1.HideSplitter();////现在居然连in的分割条也不能隐藏了
pmf->m_wndSplitterOut.HideSplitter();/////不能隐藏分割条
pmf->m_wndSplitter1.RecalcLayout();
}
universes 2005-05-26
  • 打赏
  • 举报
回复
下面是我某个按钮事件的代码。其中m_wndSplitterOut即我上面说的out,m_wndSplitter1即in。
这个按钮在out的上面那行中的CFormView中。

void CFormViewMain::OnBtnUP()
{
// TODO: Add your control notification handler code here
CMainFrame * mainFrm;
mainFrm = (CMainFrame*)AfxGetMainWnd();
mainFrm->SwitchL(1);
mainFrm->SwitchR(1);
mainFrm->SwitchUP(2);
mainFrm->m_wndSplitterOut.SetRowInfo(0,200,0);
mainFrm->m_wndSplitterOut.SetRowInfo(1,300,0);
// mainFrm->m_wndSplitterOut.ShowSplitter();
CView *pView = (CView *)mainFrm->m_wndSplitterOut.GetPane(1,0);
pView->ShowWindow(SW_SHOW);
mainFrm->m_wndSplitter1.HideSplitter();///这个能隐藏in中分割条
mainFrm->m_wndSplitterOut.HideSplitter();////这个不能隐藏out中的分割条
mainFrm->m_wndSplitter1.RecalcLayout();
mainFrm->m_wndSplitterOut.RecalcLayout();
}
universes 2005-05-26
  • 打赏
  • 举报
回复
lj1006(流) :谢谢你的解答!

我的问题的开始部分提出的那个HideSplitter()函数,和你说的是一样的,只是我为了简便,就只写出了这个函数。

主要是我后面遇到的奇怪的问题,有些可以隐藏分割条,有些不可以:(
lj1006 2005-05-26
  • 打赏
  • 举报
回复
扩展CSplitterWnd——实现隐藏分割条的功能
--------------------------------------------------------------------------------

CSplitterWnd可以很方便地创建分割器窗口。
要隐藏分割器窗口中的某个视图,只需调用:
GetPane函数得到视图指针,然后调用ShowWindow函数隐藏窗口。
但是这样做只隐藏了视图窗口,没有隐藏分割条;
当程序框架尺寸变化后,程序会自动调用RecalcLayout函数,从而使得显示效果不正常。
CSplitterWnd没有提供设置分割条尺寸的public函数,通过分析CSplitterWnd的源码得知:
它里面有几个没有公开的受保护的成员变量:
m_cxSplitter,
m_cySplitter,
m_cxBorderShare,
m_cyBorderShare,
m_cxSplitterGap,
m_cySplitterGap,
m_cxBorlder,
m_cyBorlder
通过重新构造m_cxSplitterGap,m_cySplitterGap变量的值,就可以实现改变分割条尺寸的功能。
------------------------------------解决方案---------------------------------------------------------
1.从CSplitterWnd派生一个新类CMySplitterWnd;
2.在.h文件中添加成员变量和函数如下:
int m_cx;
int m_cy;
void HideSplitter();
void ShowSplitter();
3.在cpp文件中添加实现代码如下:
void CMySplitterWnd::HideSplitter()
{
m_cx=m_cxSplitterGap;//save previous cx
m_cy=m_cxSplitterGap;//save previous cy
m_cxSplitterGap=0;
m_cySplitterGap=0;
}
void CMySplitterWnd::ShowSplitter()
{
m_cxSplitterGap=m_cx;
m_cySplitterGap=m_cy;
}
4.使用新类CMySplitterWnd生成分割器窗口,在需要的时候调用HideSplitter、ShowSplitter函数即可

15,976

社区成员

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

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