如何自己控制拆分窗口的显示

时间:2022-08-12 21:29:53
我拆分窗口后,我想默认先显示上边的窗口。然后,根据需要,如点击工具栏按牛后再显示下边的窗口。并且还可以再不显示下边的窗口。我改如何写啊?帮忙啊。
我拆分窗口的代码如下:

RECT rc;
int FrmW,FrmH;

GetClientRect(&rc);
FrmW = rc.right - rc.left + 1;
FrmH = rc.bottom - rc.top + 1;
  
//VERIFY
m_Splitter.CreateStatic(this, 2, 1);

m_Splitter.CreateView(0, 0, RUNTIME_CLASS(CMyView1),
CSize(FrmW,FrmH/2), pContext);
m_Splitter.CreateView(1, 0, RUNTIME_CLASS(CMyView2),
         CSize(FrmW,FrmH/2), pContext);

12 个解决方案

#1


不是很清楚,不过从逻辑上说,只要先判定子窗口的顶点,比较那个再上面,就显示那个(使用hWnd)

#2


Now Try...
wait

#3


Step 1
在CreateStatic中加入
m_wndSplitter.CreateStatic(this, 2, 1);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSppConView), CSize(0, 400), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView), CSize(0, 0), pContext);

Step 2
在工具栏添加一个按钮为其添加消息映射,在其函数中加入
HWND hWnd = m_wndSplitter.GetSafeHwnd();
if( hWnd == NULL || !::IsWindow(hWnd) )
{
return;
}

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );
if(cyCur == 400)
{
m_wndSplitter.SetRowInfo( 0, 800, 10 );
}
else
{
m_wndSplitter.SetRowInfo( 0, 400, 10 );
}

m_wndSplitter.RecalcLayout();

这样就应该可以了
不过发现一个问题是:
如果SetRowInfo(1 ,...)对界面是没有反应的
一定要改上面那个
呵呵
不过这样应该就可以满足你的要求了

-----------------------
           May you succeed!
                   ---------------------

#4


如果你做个循环或是加一个Timer之类的应该还可以产生很不错的动态效果

#5


to: nonocast(如果你信仰光明,那是因为到处都是黑暗!)

你的代码我测试了。总体上还可以。但是有两个问题。

1,我做的是MDI程序。如果程序运行后,(主窗口默认不是最大化)创建了拆分窗口。然后将拆分窗口最大化,然后再最大化主窗口,我发现下边的拆分窗口已经高度了。也就是显示了
2,在下边的窗口不显示的时候。能否把拆分窗口那个splitter 也隐藏?

#6


你可以重载OnSize
在OnSize的时候加入一些判断

让splitter紧贴ChildFrame的底部
换句话说
如果在只显示上面View的时候
你让上面那个View的大小永远等于ChildFrame的大小就可以了
我再试试MDI

#7


添加两个BOOL类型的控制变量
BOOL m_IsSplitter;
BOOL m_bToggle;

在构造函数中进行初始化
m_bToggle = TRUE;
m_IsSplitter = FALSE;

创建Splitter
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
RECT rc;
int FrmW,FrmH;

GetClientRect(&rc);
FrmW = rc.right - rc.left + 1;
FrmH = rc.bottom - rc.top + 1;

//VERIFY
m_wndSplitter.CreateStatic(this, 2, 1);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSppMuView),
CSize(FrmW,FrmH/2), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView),
CSize(0,0), pContext);

m_IsSplitter = TRUE;          //注意一下,呵呵
return TRUE;
}

在工具栏添加一个按钮为其添加消息映射,其函数如下
void CChildFrame::OnExchange() 
{
// TODO: Add your command handler code here
HWND hWnd = m_wndSplitter.GetSafeHwnd();
if( hWnd == NULL || !::IsWindow(hWnd) )
{
return;
}

m_bToggle = !m_bToggle;

CRect rc;
this->GetClientRect(&rc);

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );

if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}


在ChildFrame中重载OnSize
void CChildFrame::OnSize(UINT nType, int cx, int cy) 
{
CMDIChildWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if(!m_IsSplitter)
return;

CRect rc;
this->GetClientRect(&rc);

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );

if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}

#8


to  nonocast(如果你信仰光明,那是因为到处都是黑暗!) :

太感谢你了。你的代码我看了。很好,第一个问题解决了。

可是第2个问题还是不行。 那个 Splitter 还是显示啊。

#9


Reusable base class for SplitterWnd
By Daniel Zuppinger 

A class derived from CSplitterWnd which makes splitting and switching of views simple

http://www.codeproject.com/splitter/st_splitterwnd.asp 
http://www.codeproject.com/splitter/st_splitterwnd/st_splitterwnd_demo.zip

#10


把rc.Height() / 2改成rc.Height() / 2 - 10应该就不显示了吧

#11


up

#12


应该是
m_wndSplitter.SetRowInfo( 0, rc.Height()+10, cyMin );

你可以多试一下

#1


不是很清楚,不过从逻辑上说,只要先判定子窗口的顶点,比较那个再上面,就显示那个(使用hWnd)

#2


Now Try...
wait

#3


Step 1
在CreateStatic中加入
m_wndSplitter.CreateStatic(this, 2, 1);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSppConView), CSize(0, 400), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView), CSize(0, 0), pContext);

Step 2
在工具栏添加一个按钮为其添加消息映射,在其函数中加入
HWND hWnd = m_wndSplitter.GetSafeHwnd();
if( hWnd == NULL || !::IsWindow(hWnd) )
{
return;
}

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );
if(cyCur == 400)
{
m_wndSplitter.SetRowInfo( 0, 800, 10 );
}
else
{
m_wndSplitter.SetRowInfo( 0, 400, 10 );
}

m_wndSplitter.RecalcLayout();

这样就应该可以了
不过发现一个问题是:
如果SetRowInfo(1 ,...)对界面是没有反应的
一定要改上面那个
呵呵
不过这样应该就可以满足你的要求了

-----------------------
           May you succeed!
                   ---------------------

#4


如果你做个循环或是加一个Timer之类的应该还可以产生很不错的动态效果

#5


to: nonocast(如果你信仰光明,那是因为到处都是黑暗!)

你的代码我测试了。总体上还可以。但是有两个问题。

1,我做的是MDI程序。如果程序运行后,(主窗口默认不是最大化)创建了拆分窗口。然后将拆分窗口最大化,然后再最大化主窗口,我发现下边的拆分窗口已经高度了。也就是显示了
2,在下边的窗口不显示的时候。能否把拆分窗口那个splitter 也隐藏?

#6


你可以重载OnSize
在OnSize的时候加入一些判断

让splitter紧贴ChildFrame的底部
换句话说
如果在只显示上面View的时候
你让上面那个View的大小永远等于ChildFrame的大小就可以了
我再试试MDI

#7


添加两个BOOL类型的控制变量
BOOL m_IsSplitter;
BOOL m_bToggle;

在构造函数中进行初始化
m_bToggle = TRUE;
m_IsSplitter = FALSE;

创建Splitter
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
RECT rc;
int FrmW,FrmH;

GetClientRect(&rc);
FrmW = rc.right - rc.left + 1;
FrmH = rc.bottom - rc.top + 1;

//VERIFY
m_wndSplitter.CreateStatic(this, 2, 1);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CSppMuView),
CSize(FrmW,FrmH/2), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CBottomView),
CSize(0,0), pContext);

m_IsSplitter = TRUE;          //注意一下,呵呵
return TRUE;
}

在工具栏添加一个按钮为其添加消息映射,其函数如下
void CChildFrame::OnExchange() 
{
// TODO: Add your command handler code here
HWND hWnd = m_wndSplitter.GetSafeHwnd();
if( hWnd == NULL || !::IsWindow(hWnd) )
{
return;
}

m_bToggle = !m_bToggle;

CRect rc;
this->GetClientRect(&rc);

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );

if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}


在ChildFrame中重载OnSize
void CChildFrame::OnSize(UINT nType, int cx, int cy) 
{
CMDIChildWnd::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if(!m_IsSplitter)
return;

CRect rc;
this->GetClientRect(&rc);

int cyCur, cyMin;
m_wndSplitter.GetRowInfo( 0, cyCur, cyMin );

if(m_bToggle)
{
//two view
m_wndSplitter.SetRowInfo( 0, rc.Height() / 2, cyMin );
}
else
{
//one view
m_wndSplitter.SetRowInfo( 0, rc.Height(), cyMin );
}
m_wndSplitter.RecalcLayout();
}

#8


to  nonocast(如果你信仰光明,那是因为到处都是黑暗!) :

太感谢你了。你的代码我看了。很好,第一个问题解决了。

可是第2个问题还是不行。 那个 Splitter 还是显示啊。

#9


Reusable base class for SplitterWnd
By Daniel Zuppinger 

A class derived from CSplitterWnd which makes splitting and switching of views simple

http://www.codeproject.com/splitter/st_splitterwnd.asp 
http://www.codeproject.com/splitter/st_splitterwnd/st_splitterwnd_demo.zip

#10


把rc.Height() / 2改成rc.Height() / 2 - 10应该就不显示了吧

#11


up

#12


应该是
m_wndSplitter.SetRowInfo( 0, rc.Height()+10, cyMin );

你可以多试一下