关于窗口静态拆分的几个问题。

时间:2022-12-15 21:30:27
我在Frame里使用一个四拆分的窗口,几点疑问:
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);


#2


1.我是将CFrameWnd::OnSize写在最前面的。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。

#3


事实上使用鼠标拖动改变窗口大小的时候工作的很好,但按下最大化按钮的时候问题就出来了,以前写OpenGL程序的时候也有类似的问题。

#4


是的,上次有点草率,没看仔细

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);


#2


1.我是将CFrameWnd::OnSize写在最前面的。
2.Client区包括工具栏和状态栏!所以GetClientRect的结构包括工具栏和状态栏的大小。

#3


事实上使用鼠标拖动改变窗口大小的时候工作的很好,但按下最大化按钮的时候问题就出来了,以前写OpenGL程序的时候也有类似的问题。

#4


是的,上次有点草率,没看仔细

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,一个低级错误。