怎么制作VC-MFC(Dialog)的分割(切分)视图,网上全是用于view类型的.

abxialiang 2011-03-24 08:59:22
我需要做一个MFC基于对话框的分割视图,单文档模式下很容易,我也实现了,但是在dialog下弄了好久还是不行.通过"百度""google"找遍了网络,9成以上都是针对view模式的,好容易找了个"CxSplitterWnd"类,它又不说怎么用(demo也没有),试了好久都没有效果.只有向大家求助了.

界面是这么计划的:
A窗口(主窗口),1窗口(子窗口),2窗口(子),3窗口(子).
希望实现:
把A窗口分割成三个部分,放置123三个子窗口,并且A窗口是可以调整大小的,所以窗口内的控件要能跟着变化大小.

我使用CxSplitterWnd的部分代码OnInitDialog():
CCreateContext context1;
context1.m_pNewViewClass = RUNTIME_CLASS(CMyDialog1);
context1.m_pCurrentDoc = NULL;
context1.m_pNewDocTemplate = NULL;
context1.m_pLastView = NULL;
context1.m_pCurrentFrame = NULL;

CCreateContext context2;
context2.m_pNewViewClass = RUNTIME_CLASS(CMyDialog2);
context2.m_pCurrentDoc = NULL;
context2.m_pNewDocTemplate = NULL;
context2.m_pLastView = NULL;
context2.m_pCurrentFrame = NULL;

CCreateContext context3;
context3.m_pNewViewClass = RUNTIME_CLASS(CMyDialog3);
context3.m_pCurrentDoc = NULL;
context3.m_pNewDocTemplate = NULL;
context3.m_pLastView = NULL;
context3.m_pCurrentFrame = NULL;

CWnd * pWnd = NULL;
pWnd = this;
CRect rect;
pWnd->GetClientRect(&rect);

m_splitter.CreateStatic(pWnd,2,1);
m_splitter.CreateView( 0, 0, RUNTIME_CLASS( CMyDialog1 ), CSize( 0, rect.Height()/2 ), &context1 );
m_splitter.CreateView( 1, 0, RUNTIME_CLASS( CMyDialog2 ), CSize( 0, rect.Height()/2 ), &context2 );
//m_splitter.MoveWindow(&rect);//出错


目的是先分两栏,子窗口的属性我也设置了child和None.但是结果是什么反应都没有出现.
...全文
462 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
abxialiang 2011-03-25
  • 打赏
  • 举报
回复
TO: yao050421103
多个子窗口随主窗口变化已经做好了.剩下的问题是:子窗口与子窗口之间的大小调整(即相邻的B,C子窗口,B变大时C会变小,反之).
不过我有个思路:
用picture控件作为分割线(每条分割线管理有且仅有两个子窗口),子窗口的边缘吸附在这条线上,用鼠标拖动分割线,然后重新让两边子窗口吸附到分割线上.
yao050421103 2011-03-25
  • 打赏
  • 举报
回复
如果要保证子窗体能随主对话框动态改变大小的话,那么子窗体的大小就必须支持动态定义。
要做到这一点,各个窗体的区域(left, top, right, bottom)就只能按照相对比例来定义。比如,把主对话框的Rect设置为逻辑标准值ParentLogRect(100, 100, 100, 100),子窗体的Rect就可以定义为ChildLogRect(10, 10, 20, 20)。这样在当主对话框的大小和位置改变的时候,子窗体的大小和位置就可以用等比例的方式计算出来。

例如:定义更改区域后的主对话框ParentPhyRect(l, t, r, b),假设子窗体ChildPhyRect(x1, x2, x3, x4),
那么ParentLogRect / ChildLogRect = ParentPhyRect / ChildPhyRect,根据这个等式可以计算出x1, x2, x3, x4,从而动态获得子窗体的位置。

将主对话框以及下面所有的子窗体的区域信息全部用这个方式定义下来(以主窗体的大小为逻辑标准值),就可以实现你所要的效果。

当然,条件允许的话,还是建议用View做最方便。
abxialiang 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qjgdftxmu 的回复:]
这个手动做了也行,用CWnd或者别的类作边界线。。。。然后就可以得到你的视图需要铺得大小。

然后拖动这个作为边界线的控件就行了
[/Quote]
我觉得这方法可以,我真想做一个全面的VC界面网站,让每个VC程序员都不用为界面烦恼.
abxialiang 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gordon3000 的回复:]
建议你还是用View来做,自己做太费劲了。
为什么非不用CView呢,去掉菜单工具条和状态条,控制窗口的大小,外观上和Dialog也没什么本质差异了。
[/Quote]
View现在方便一些,以后写逻辑代码的时候就不方便了.我现在已经实现的这样的效果:
主窗口上有三个子窗口,主窗口变化时子窗口也会跟着调整(onsize),还有一个功能就是主窗口不变时,用户调整子窗口大小.
schlafenhamster 2011-03-25
  • 打赏
  • 举报
回复
参考我的“vcUsbView.rar”(0分),其中的dlg非常像分割窗口。
一名程序员 2011-03-24
  • 打赏
  • 举报
回复
用MFC的splitter肯定是不行的。因为它只能在文档视图框架下使用。
按楼主的意思,最彻底的解决办法就是仿照mFC中splitter的源代码实现原理,自己去实现。
qjgdftxmu 2011-03-24
  • 打赏
  • 举报
回复
这个手动做了也行,用CWnd或者别的类作边界线。。。。然后就可以得到你的视图需要铺得大小。

然后拖动这个作为边界线的控件就行了
syq13 2011-03-24
  • 打赏
  • 举报
回复
在对话框上不好做,以前我也尝试过,可自己太菜没做出来。
副组长 2011-03-24
  • 打赏
  • 举报
回复
建议你还是用View来做,自己做太费劲了。
为什么非不用CView呢,去掉菜单工具条和状态条,控制窗口的大小,外观上和Dialog也没什么本质差异了。
changjiesun 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abxialiang 的回复:]
引用 3 楼 hbxstone99 的回复:
如果是静态分割的话可以试下先放置静态控件,然后将1、2、3各子窗口放在合适的位置。。

在调节大小的时候计算好位置同时调整子窗口就可以了。。

你的思路是可以的,我也能做到,这样在改变主窗口大小的时候就能让几个子窗口跟着变化,但是调整子窗口间的边界时不会控制.
[/Quote]


可以处理鼠标事件 来重绘空间大小吧
向立天 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 abxialiang 的回复:]

引用 3 楼 hbxstone99 的回复:
如果是静态分割的话可以试下先放置静态控件,然后将1、2、3各子窗口放在合适的位置。。

在调节大小的时候计算好位置同时调整子窗口就可以了。。

你的思路是可以的,我也能做到,这样在改变主窗口大小的时候就能让几个子窗口跟着变化,但是调整子窗口间的边界时不会控制.
[/Quote]
就是处理一下OnMouseMove吧
我用自定义控件做过分割条实现dialog下的分割布局
abxialiang 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hbxstone99 的回复:]
如果是静态分割的话可以试下先放置静态控件,然后将1、2、3各子窗口放在合适的位置。。

在调节大小的时候计算好位置同时调整子窗口就可以了。。
[/Quote]
你的思路是可以的,我也能做到,这样在改变主窗口大小的时候就能让几个子窗口跟着变化,但是调整子窗口间的边界时不会控制.
寒冰雪 2011-03-24
  • 打赏
  • 举报
回复
如果是静态分割的话可以试下先放置静态控件,然后将1、2、3各子窗口放在合适的位置。。

在调节大小的时候计算好位置同时调整子窗口就可以了。。
abxialiang 2011-03-24
  • 打赏
  • 举报
回复
那样的话,也太难了!

15,979

社区成员

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

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