SDI切分窗口后,子窗口的大小设置有问题

liuqingshan1005 2009-04-15 07:40:25
用SetRowInfo()和SetColumnInfo()函数设置切分后的行和列的信息,用CreatView()设置各个窗口的视图类。但是不管怎么调参数,CBMView也就是最下面的那个窗口和最右边的那个窗口CStateView不变,都太大了

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
CRect rtWnd;
GetClientRect(&rtWnd);

int Width=rtWnd.Width();
int Height=rtWnd.Height();

DWORD dstyle = WS_CHILD | WS_VISIBLE;
dstyle &= ~WS_HSCROLL;
dstyle &= ~WS_VSCROLL;

if(m_wndSplitter1.CreateStatic(this,3,1,dstyle)==NULL)
{
return FALSE;
}

if(m_wndSplitter2.CreateStatic(&m_wndSplitter1,1,3,dstyle,
m_wndSplitter1.IdFromRowCol(1, 0)) == NULL)
{
return FALSE;
}

if(m_wndSplitter3.CreateStatic(&m_wndSplitter2,2,1,dstyle,
m_wndSplitter2.IdFromRowCol(0, 1)) == NULL)
{
return FALSE;
}

m_wndSplitter1.SetRowInfo( 0, 4*Height/20, Height/20 );
m_wndSplitter1.SetRowInfo( 1, 12*Height/20, Height/20 );
m_wndSplitter1.SetRowInfo( 2, 4*Height/20, Height/20 );

m_wndSplitter2.SetColumnInfo( 0, 4*Width/20, Width/20 );
m_wndSplitter2.SetColumnInfo( 1, 12*Width/20, Width/20 );
m_wndSplitter2.SetColumnInfo( 2, 4*Width/20, Width/20 );

m_wndSplitter3.SetRowInfo( 0, 8*Height/20, Height/20 );
m_wndSplitter3.SetRowInfo( 1, 4*Height/20, Height/20 );



if(NULL == m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CTPView),
CSize(Width,4*Height/20), pContext))
return FALSE;

if(NULL == m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CBMView),
CSize(Width,4*Height/20), pContext))
return FALSE;

if(NULL == m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CCoorView),
CSize(4*Width/20,12*Height/20), pContext))
return FALSE;

if(NULL == m_wndSplitter2.CreateView(0,2,RUNTIME_CLASS(CStateView),
CSize(4*Width/20,12*Height/20), pContext))
return FALSE;

if(NULL == m_wndSplitter3.CreateView(0,0,RUNTIME_CLASS(CNCView),
CSize(12*Width/20,10*Height/20), pContext))
return FALSE;

if(NULL == m_wndSplitter3.CreateView(1,0,RUNTIME_CLASS(CTEXTView),
CSize(12*Width/20,2*Height/20), pContext))
return FALSE;

/*
int cur;
int min;
m_wndSplitter1.GetRowInfo(0,cur,min);
CString str;
str.Format("cur=%d",cur);
MessageBox(str);
str.Format("min=%d",min);
MessageBox(str);
*/

return TRUE;
}

注释的代码测试了GetRowInfo的结果,结果显示cur=-1,这是什么原因?求助啊
...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubuweiright 2009-04-16
  • 打赏
  • 举报
回复
很长,帮顶
liuqingshan1005 2009-04-16
  • 打赏
  • 举报
回复
我知道问题之所在了,我在CApp中使窗口显示最大化
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
但是这一函数是在OnCreateClient()之后才调用的,也就是说OnCreateClient()中GetClientRect()得到的是没有最大化之前的窗口客户区大小,在最大化后显示当然不正常
liuqingshan1005 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ky310 的回复:]
CSplitterWnd 划分窗口设置窗口大小是会出现这样的问题的,因为你调用GetClientRect()后得到的是整个窗体大小,包含了标题栏、菜单栏、快捷按钮栏、任务栏等,所以在划分前必须将这部分高度减去

还要注意的问题是,如果本身的FormView界面就比窗口大小大的话,划分后会出现滚动条。

我的解决方法是:直接减掉某个数值,高度、长度均适合。
[/Quote]
我不想要滚动条,在OnSize()中添加了ShowScrollBar(SB_BOTH,FALSE);这样就去掉了滚动条。菜单栏,状态栏,工具栏都已经去掉了。
我也调高度,长度好多次了,感觉没有效果,修改SetRowInfo()对窗口大小没有影响,修改最上边和最左边的视图的CSize()
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CTPView), CSize(Width,4*Height/20), pContext)
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CCoorView),CSize(4*Width/20,12*Height/20), pContext)
只有这两句有用。
另外,为什么GetRowInfo(0,cur,min); 得到的理想cur=-1?



asssasharp 2009-04-16
  • 打赏
  • 举报
回复
同意楼上的。用getwindowrect可以得到当前的窗口和其父窗口的位置。然后一减,得到相对的位置。这样你得到的位置就是正确的了。如果用getclientrect得到的是相对于你当前的窗口的位置。得到的大小是错误的。需要自己计算正确的位置。然后剪裁。而且最好在movewindow的时候一直计算。否则也会出错的。这个没办法。
ky310 2009-04-16
  • 打赏
  • 举报
回复
CSplitterWnd 划分窗口设置窗口大小是会出现这样的问题的,因为你调用GetClientRect()后得到的是整个窗体大小,包含了标题栏、菜单栏、快捷按钮栏、任务栏等,所以在划分前必须将这部分高度减去

还要注意的问题是,如果本身的FormView界面就比窗口大小大的话,划分后会出现滚动条。

我的解决方法是:直接减掉某个数值,高度、长度均适合。
liuqingshan1005 2009-04-15
  • 打赏
  • 举报
回复
自己up

15,979

社区成员

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

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