1.当窗口大小调整的时候要实时调整拆分窗口大小维持原有比例,应该在那里响应什么消息,作什么操作?
2.同上,我在MainFrame里响应WM_SIZE,窗口大小改变的时候调用:
m_wndSplitter.SetRowInfo( 0, i, 0 );
m_wndSplitter.SetColumnInfo( 0, j, 0 );
RecalcLayout( );
拖动改变窗口大小的时候能够完成所要求的操作。但是点击最大化按钮的时候(无论最大化还是还原)没有反应,根据调试结果来看,响应了WM_SIZE消息(进入OnSize函数体),但窗口大小还是没有改变,为什么,怎么做?
3.为了精确计算拆分窗口的大小,能否计算除去菜单,工具栏,状态栏后的客户区大小以及拆分窗口之间间隔的大小?
8 个解决方案
#1
1. 2 .
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);//将这句放在最前
.....
}
3.
除去菜单,工具栏,状态栏后的客户区大小
CRect rect;
GetClientRect(Rect);
拆分窗口的大小大概是:
CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
pWnd->GetClientRect(Rect);
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);//将这句放在最前
.....
}
3.
除去菜单,工具栏,状态栏后的客户区大小
CRect rect;
GetClientRect(Rect);
拆分窗口的大小大概是:
CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
pWnd->GetClientRect(Rect);
#2
1.我是将CFrameWnd::OnSize写在最前面的。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。
#3
事实上使用鼠标拖动改变窗口大小的时候工作的很好,但按下最大化按钮的时候问题就出来了,以前写OpenGL程序的时候也有类似的问题。
#4
是的,上次有点草率,没看仔细
1
m_wndSplitter.SetRowInfo( 0, i, 0 );
m_wndSplitter.SetColumnInfo( 0, j, 0 );
m_wndSplitter.RecalcLayout( );//前有m_wndSplitter.
1
m_wndSplitter.SetRowInfo( 0, i, 0 );
m_wndSplitter.SetColumnInfo( 0, j, 0 );
m_wndSplitter.RecalcLayout( );//前有m_wndSplitter.
#5
拆分窗口之间间隔的大小,如果你没有派生CSplitterWnd的话,那么它的大小下由下面一些值决定,这是vc.net的
CSplitterWnd::CSplitterWnd()
{
AFX_ZERO_INIT_OBJECT(CWnd);
// default splitter box/bar sizes (includes borders)
m_cxSplitter = m_cySplitter = 3 + 2 + 2;
m_cxBorderShare = m_cyBorderShare = 0;
m_cxSplitterGap = m_cySplitterGap = 3 + 2 + 2;
m_cxBorder = m_cyBorder = 2;
#ifdef _DEBUG
if (GetSystemMetrics(SM_CXBORDER) != 1 ||
GetSystemMetrics(SM_CYBORDER) != 1)
{
TRACE(traceAppMsg, 0, "Warning: CSplitterWnd assumes 1 pixel border.\n");
// will look ugly if borders are not 1 pixel wide and 1 pixel high
}
#endif
}
#6
http://expert.csdn.net/Expert/topic/1404/1404676.xml?temp=.6574518
兄弟不妨也帮帮我?
兄弟不妨也帮帮我?
#7
mark
#8
thinks,一个低级错误。
#1
1. 2 .
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);//将这句放在最前
.....
}
3.
除去菜单,工具栏,状态栏后的客户区大小
CRect rect;
GetClientRect(Rect);
拆分窗口的大小大概是:
CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
pWnd->GetClientRect(Rect);
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);//将这句放在最前
.....
}
3.
除去菜单,工具栏,状态栏后的客户区大小
CRect rect;
GetClientRect(Rect);
拆分窗口的大小大概是:
CWnd* pWnd = m_wndSplitter.GetPane(0, 0);
pWnd->GetClientRect(Rect);
#2
1.我是将CFrameWnd::OnSize写在最前面的。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。
#3
事实上使用鼠标拖动改变窗口大小的时候工作的很好,但按下最大化按钮的时候问题就出来了,以前写OpenGL程序的时候也有类似的问题。
#4
是的,上次有点草率,没看仔细
1
m_wndSplitter.SetRowInfo( 0, i, 0 );
m_wndSplitter.SetColumnInfo( 0, j, 0 );
m_wndSplitter.RecalcLayout( );//前有m_wndSplitter.
1
m_wndSplitter.SetRowInfo( 0, i, 0 );
m_wndSplitter.SetColumnInfo( 0, j, 0 );
m_wndSplitter.RecalcLayout( );//前有m_wndSplitter.
#5
拆分窗口之间间隔的大小,如果你没有派生CSplitterWnd的话,那么它的大小下由下面一些值决定,这是vc.net的
CSplitterWnd::CSplitterWnd()
{
AFX_ZERO_INIT_OBJECT(CWnd);
// default splitter box/bar sizes (includes borders)
m_cxSplitter = m_cySplitter = 3 + 2 + 2;
m_cxBorderShare = m_cyBorderShare = 0;
m_cxSplitterGap = m_cySplitterGap = 3 + 2 + 2;
m_cxBorder = m_cyBorder = 2;
#ifdef _DEBUG
if (GetSystemMetrics(SM_CXBORDER) != 1 ||
GetSystemMetrics(SM_CYBORDER) != 1)
{
TRACE(traceAppMsg, 0, "Warning: CSplitterWnd assumes 1 pixel border.\n");
// will look ugly if borders are not 1 pixel wide and 1 pixel high
}
#endif
}
#6
http://expert.csdn.net/Expert/topic/1404/1404676.xml?temp=.6574518
兄弟不妨也帮帮我?
兄弟不妨也帮帮我?
#7
mark
#8
thinks,一个低级错误。