高分求解决方法!是关于窗口分割(splitter)的!高手来,灌水无分!
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CSize size1;
CRect rect(0, 0, 0, 0);
this ->GetWindowRect(&rect);
size1.cx = (rect.right - rect.left) / 2;
size1.cy = (rect.bottom - rect.top) / 4;
if(!m_wndSplitter.CreateStatic(this, 2, 1))
{
TRACE0("Failed to CreateStaticSpitter\n");
return FALSE;
}
if(!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CResultView), size1, pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
if(!m_wndSplitter2.CreateStatic(
&m_wndSplitter,
1, 2,
WS_CHILD | WS_VISIBLE | WS_BORDER,
m_wndSplitter.IdFromRowCol(1, 0)
))
{
TRACE0("Failed to create nested splitter\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CUserView), size1, pContext))
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CUserView2), CSize(0, 0), pContext))
{
TRACE0("Failed to create third pane\n");
return FALSE;
}
((CResultView*)(m_wndSplitter.GetPane(0, 0))) -> SetReadOnly(true);
SetActiveView((CView*)m_wndSplitter2.GetPane(0, 0));
return TRUE;
}
以上函数实现如下分割窗口:
|-----------------|
| |
|-----------------|
| | |
| | |
|-----------------|
现通过修改以上函数实现如下窗口形式:
|-----------------|
| | |
| | |
|-----------------|
| |
|-----------------|
并说明CreateView()函数的第4个参数即SIZE的具体用法
不能用SetRowInfo,即不能用
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=182284 中的类似方法
问题点数:0、回复次数:20Top
1 楼EnochShen(小疯子:真的好菜—知耻而后勇!)回复于 2004-12-03 22:41:14 得分 0
EnochShen@qq.com来问我拿吧Top
2 楼neverdead(大浪淘沙)回复于 2004-12-03 22:47:18 得分 0
那留个QQ吧!我下了~~接下来的明天早上回复!Top
3 楼whs1980(知秋一叶)回复于 2004-12-04 11:43:06 得分 0
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CSize size1;
CRect rect(0, 0, 0, 0);
this ->GetWindowRect(&rect);
size1.cx = (rect.right - rect.left) / 2;
size1.cy = (rect.bottom - rect.top) / 4;
if(!m_wndSplitter.CreateStatic(this, 2, 1))
{
TRACE0("Failed to CreateStaticSpitter\n");
return FALSE;
}
if(!m_wndSplitter2.CreateStatic(
&m_wndSplitter,
1, 2,
WS_CHILD | WS_VISIBLE | WS_BORDER,
m_wndSplitter.IdFromRowCol(0, 0)
))
{
TRACE0("Failed to create nested splitter\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CUserView), size1, pContext))
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CUserView2), CSize(0, 0), pContext))
{
TRACE0("Failed to create third pane\n");
return FALSE;
}
if(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CResultView), size1, pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
((CResultView*)(m_wndSplitter.GetPane(0, 0))) -> SetReadOnly(true);
SetActiveView((CView*)m_wndSplitter2.GetPane(0, 0));
return TRUE;
}
哈哈哈.......
Top
4 楼bobob(静思)回复于 2004-12-04 12:13:31 得分 0
以下代码已经实现,自己把尺寸调整一下就可以了
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
CSize size1;
CRect rect(0, 0, 0, 0);
this ->GetWindowRect(&rect);
size1.cx = (rect.right - rect.left) / 2;
size1.cy = (rect.bottom - rect.top) / 4;
if(!m_wndSplitter.CreateStatic(this, 2, 1))
{
TRACE0("Failed to CreateStaticSpitter\n");
return FALSE;
}
if(!m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CResultView), size1, pContext))
{
TRACE0("Failed to create first pane\n");
return FALSE;
}
if(!m_wndSplitter2.CreateStatic(
&m_wndSplitter,
1, 2,
WS_CHILD | WS_VISIBLE | WS_BORDER,
m_wndSplitter.IdFromRowCol(0, 0)
))
{
TRACE0("Failed to create nested splitter\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CUserView), size1, pContext))
{
TRACE0("Failed to create second pane\n");
return FALSE;
}
if(!m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CUserView2), CSize(0, 0), pContext))
{
TRACE0("Failed to create third pane\n");
return FALSE;
}
//((CResultView*)(m_wndSplitter.GetPane(0, 0))) -> SetReadOnly(true);
SetActiveView((CView*)m_wndSplitter2.GetPane(0, 0));
return TRUE;
}
Top
5 楼bobob(静思)回复于 2004-12-04 12:15:29 得分 0
size的用发:就是指定create出来的view的初始大小Top
6 楼neverdead(大浪淘沙)回复于 2004-12-04 16:20:23 得分 0
错~~都错了~~~
whs1980(知秋一叶)和bobob(bobob)(★★★★★★)
给出的代码运行的结果都是
|--------|--------|
|-----------------| <------
| |
| |
| |
|-----------------|
也就是显示了不正常的结果~即下面的窗口覆盖了上面的窗口~箭头指的分割线已经贴到窗口的上边缘了
to: bobob(bobob)(★★★★★★)
我正是搞不出这个尺寸才发这个贴的!
不然我也不会发这个贴,不会来问size的用法及其具体的实现过程
继续在线等答案
有兴趣去解决的朋友也可以与我联系:
QQ : 214200729(验证窗写 “窗口分割”即可,不写验证消息不通过! )
我提供源码!
Top
7 楼medie(苦丁茶)回复于 2004-12-04 20:11:51 得分 0
看来只能在创建之后设置位置信息了
因为上面的View最后才创建Top
8 楼I_Love_CPP(Never stop!)回复于 2004-12-04 20:41:32 得分 0
我已经99.99%地解决了这个问题了。
呵呵,好高兴哦。
唯一的缺点是关闭时会报个错。Top
9 楼neverdead(大浪淘沙)回复于 2004-12-05 09:01:10 得分 0
to:I_Love_CPP(我爱C++)
那贴出来呀,我好给分!
这个问题可以用SetRowInfo解决的!而且非常的简单!
但是,我主要是想知道CreateView的第四个参数是怎么实现的,所以
就在这里钻牛角了~~Top
10 楼I_Love_CPP(Never stop!)回复于 2004-12-05 13:05:42 得分 0
一?
不是在QQ上已经给你讲明白了吗?Top
11 楼neverdead(大浪淘沙)回复于 2004-12-05 19:00:58 得分 0
to:I_Love_CPP(我爱C++)
代码呢?我不是和你说来坛子里贴的嘛~~
QQ那里你只是说了一下你的原理~~
但是,我不知道你那种方法管不管用!
Top
12 楼neverdead(大浪淘沙)回复于 2004-12-05 22:29:02 得分 0
沉的好快啊!Top
13 楼crystal521(【云淡风轻】)回复于 2004-12-06 10:48:12 得分 0
不用不能用SetRowInfo好像不行吧?Top
14 楼neverdead(大浪淘沙)回复于 2004-12-06 13:12:18 得分 0
to:crystal521(水晶泪)
为什么不行?
我第一帖贴出来的代码就没有SetRowInfo!
Top
15 楼chuanke((C ) 2005【空间代数】. All rights reserved .)回复于 2004-12-06 14:22:43 得分 0
路过Top
16 楼crystal521(【云淡风轻】)回复于 2004-12-06 16:58:28 得分 0
你这两种显示是不一样的,第一种可以而第二种嘛,反正我试过是不行的Top
17 楼neverdead(大浪淘沙)回复于 2004-12-18 19:55:26 得分 0
知道为什么不行吗?
难道CSDN真的没有高手?
或是高手都喜欢潜水?Top
18 楼crystal521(【云淡风轻】)回复于 2004-12-19 12:00:54 得分 0
具体你可以研究一下CSplitter类Top
19 楼neverdead(大浪淘沙)回复于 2004-12-25 20:11:35 得分 0
如果有时间的话,这倒是个不错的建议!Top
20 楼ericzhangali(另一个空间)回复于 2005-03-16 10:01:12 得分 0
接分Top




