我拆分窗口的代码如下:
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
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!
---------------------
在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 也隐藏?
你的代码我测试了。总体上还可以。但是有两个问题。
1,我做的是MDI程序。如果程序运行后,(主窗口默认不是最大化)创建了拆分窗口。然后将拆分窗口最大化,然后再最大化主窗口,我发现下边的拆分窗口已经高度了。也就是显示了
2,在下边的窗口不显示的时候。能否把拆分窗口那个splitter 也隐藏?
#6
你可以重载OnSize
在OnSize的时候加入一些判断
让splitter紧贴ChildFrame的底部
换句话说
如果在只显示上面View的时候
你让上面那个View的大小永远等于ChildFrame的大小就可以了
我再试试MDI
在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();
}
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 还是显示啊。
太感谢你了。你的代码我看了。很好,第一个问题解决了。
可是第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
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 );
你可以多试一下
m_wndSplitter.SetRowInfo( 0, rc.Height()+10, cyMin );
你可以多试一下
#1
不是很清楚,不过从逻辑上说,只要先判定子窗口的顶点,比较那个再上面,就显示那个(使用hWnd)
#2
Now Try...
wait
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!
---------------------
在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 也隐藏?
你的代码我测试了。总体上还可以。但是有两个问题。
1,我做的是MDI程序。如果程序运行后,(主窗口默认不是最大化)创建了拆分窗口。然后将拆分窗口最大化,然后再最大化主窗口,我发现下边的拆分窗口已经高度了。也就是显示了
2,在下边的窗口不显示的时候。能否把拆分窗口那个splitter 也隐藏?
#6
你可以重载OnSize
在OnSize的时候加入一些判断
让splitter紧贴ChildFrame的底部
换句话说
如果在只显示上面View的时候
你让上面那个View的大小永远等于ChildFrame的大小就可以了
我再试试MDI
在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();
}
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 还是显示啊。
太感谢你了。你的代码我看了。很好,第一个问题解决了。
可是第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
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 );
你可以多试一下
m_wndSplitter.SetRowInfo( 0, rc.Height()+10, cyMin );
你可以多试一下