怎么制作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.但是结果是什么反应都没有出现.
...全文
514 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
那样的话,也太难了!
1,pic_open.zip带位图预览的打开文件对话框(4KB)2,bmpdlg.zip一个位图对话框类 (11KB)3,folder.zip只显示文件夹信息的文件对话框(2KB)4,dir_pic.zip文件目录搜集工具对话框(42KB)5,splash.zip通过自己的线程在Splash对话框中显示文字(136KB)6,res_dlg.zip大小可调的对话框(21KB)7,splitter.zip可变的分割视图(58KB)8,anicon1.zip在窗口的标题条上显示动画图标演示程序(47KB)9,anicon2.zip在窗口的标题条上显示动画图标(2KB)10,simple.zip一般用途的分隔器类(43KB)11,outlook.zipOutLook风格的分隔条(59KB)12,appbar1.zip实现桌面的工具条(AppBar)(12KB)13,appbar2.zip实现桌面的工具条演示程序(AppBar)(88KB)14,trayicon1.zip屏幕保护托盘图标(SDK版本)(27KB)15,trayicon2.zip屏幕保护托盘图标(MFC版本)(30KB)16,cj60lib.zipMFC扩展界面库(VC6升级版)(936KB)17,devstudio.zipVisual Studio风格的用户界面(132KB)18,explorer.zipVisual Studio风格的用户界面(213KB)19,outlook1.zipOutLook风格的用户界面(134KB)20,Ccaption.zip一组用于定制窗口标题的类(36KB)21,Ccaption2.zip一组用于定制窗口标题的类演示程序(79KB)22,treectrl1.zipDirTreeCtrl--显示文件夹和文件演示程序(56KB)23,treectrl2.zipDirTreeCtrl--显示文件夹和文件(6KB)24,menutip.zip实现菜单的工具提示(33KB)25,menubar1.zipDevStudio样式的泊位菜单条演示程序(不用MSIE)(58KB)26,menubar2.zipDevStudio样式的泊位菜单条(不用MSIE)(27KB)27,propbox1.zip实用的属性列表框(5KB)28,propbox2.zip实用的属性列表框演示程序(25KB)29,cchecklist.zip一个多层次的CCheckListBox(18KB)30,popchild.zip 在Popup和Child窗口之间转化(43KB)31,multitop.zip 一个SDI(单文档界面)的应用,通过File菜单中的Create New Frame命令能够创建一个位于顶层的SDI应用,但关闭主应用后其它的窗口也将关闭,程序由Visual C++ 5.0开发(30KB)32,picknew.zip 演示如何注册多文档模板且避免MFC自动产生的"New File Type"对话框,程序由Visual C++ 5.0开发,调用了CDocTemplate::OpenDocumentFile()(49KB)33,listbox1.zip一个类似VisualStudio样式的列表框类(17KB)34,listbox2.zip一个类似VisualStudio样式的列表框类演示程序(50KB)35,custfile.zip 这个例子能够在CFileDialog中增加一对按纽,需要使用Visual C++ 6.0(23KB)36,icondlg.zip 这是一个从资源DLL中选取图标的对话框(12KB)37,Modal.zip 创建一个模式的窗口(38KB)38,dock_menu.zip 演示如何实现DevStdio中的菜单风格,值得研究 COOL(157KB)39,tooltip.zip 可以多行显示的提示条,且颜色可变(32KB)40,ntray.zip 你想知道拨号网络连通后的动态小图标(Tray Icons)是怎么实现的吗?这个例子可以告诉你一切 COOL(17KB)41,w95tray.zip Windows95 Tray Icon的例子(9KB)42,startmenu.exe 修改Start菜单(27KB)43,splits.zip 这个由Visual C++ 5.0开发的程序演示如何管理View中的切分窗口,用到了CSplitterWnd::DeleteView()和CSplitterWnd::CreateView()等成员函数(35KB)44,swt.zipDOS下仿WIN95界面及图标编辑器源程序(498k C&ASM 作者:添翼虎)(499KB)45,menutest.zip定制WIN95图形菜单演示程序(12KB)46,toolbar1.zip在ToolBar中嵌入CListBox(39KB)47,fromto.zip从一图退到另一图(54KB)48,cj60libsrc.zip界面开发库Cj60Lib的源程序(268KB)49,password.zip 拖动放大镜到密码输入框能得到密码的内容 COOL(15KB)50,ProperWnd.zip 属性页放置在窗口的指定位置(58KB)51,pushpin.zip在属性页的左边加入一个图钉按纽,熟悉Microsoft Developer Stdio的朋友一定很熟悉(16KB)52,apibrow.zip这个例子使用公用控制回调在一个CListView中管理CListCtrl控制,这个例子用于分析了一些以逗号为分割符的文本文件,例如在你的\MSDEV\LIB(VC5.0在DevStudio\VC\Lib)目录下的Win32Api.CSV就是这样的文件(16KB)53,scrl.zip这是一个由Visual C++ 5.0开发的基于对话框的应用,它演示如何使用CListCtrl::Scroll()函数,它是CListView的report方式的一个子集(14KB)54,treelist1.zip显示资源管理器风格的目录树结构的例子(64KB)55,list_menu.zip 在ToolBar中嵌入CListBox,看起来像图形菜单(39KB)dialog.zip等待对话框(22KB)66,coolmenu.zipOffice 97风格菜单实现(298KB)67,dirpk.exe目录选择对话(78KB)68,docktest.zip演示Docking Window(220kb)69,drivevie.zip查看系统安装的驱动器(34kb)70,enhstbar.zip在状态条上显示按钮和进度指示条(88kb)71,fully.zip全屏幕显示窗口例子程序(42kb)72,icondial.zip在对话框内显示图标列表(12kb)73,mfccmd.zip多重Undo/Redo实现(90kb)74,mfcdde.zipDDE实例(53kb)75,splasher.zip启动屏幕程序(47kb)76,toolbar.zip一个工具条的例子(174kb)77,vwrplc32.exe文档视图结构实例(42KB)78,ModalWin.zip一个多文档的例子(1880kb)79,HTMViewer.ziphtml文件浏览器(1870kb)80,picwin.zip给任意窗口添加背景(2KB)81,DynCon.zip动态改变对话框的大小, 对话框中的控件相应改变(166KB)82,tabstatus.zip在多文档应用程序的状态条中加入子窗口的列表, 使程序的状态条有点像Windows 95的任务条(62KB)83,jpeg.zip操作JPEG的库和源程序(390KB)84,dibimage.zip这个例子功能强大,能够以多种方式处理位图文件,强烈推荐 COOL(112KB)85,voicecmd.zip在你的软件中增加语音控制功能COOL(31KB)86,pathDlg.zip能够选择和创建文件夹的对话框(22KB)87,AniDlg.zip想作动态对话框吗?下载一个回去看看吧!(18KB)88,dlgtbar.zip想在对话框中实现浮动工具栏吗?这个代码是你的最佳选择。(19KB)89,DlgMenu.zip教你在对话框中加入菜单,一学就会。(26KB)90,fold.zip使用相当简单,实现文件夹浏览,里面附带英文说明。(4KB)91,CoolAbout.zip支持滚动文字图象,并可用鼠标操作方向。(26KB)92,FullDlg.zip用这类你可以实现全屏对话框,并且你用它可以切换到运行的其它应用程序中。(3KB)93,Colorsrc.zip一个很漂亮的颜色选择类。(157KB)94,TabDialog.zip能将对话框“钉”在屏幕上。(36KB)95,tip_ocx.zip你有没有觉得VC提供的那个Tip of the day控件很简陋?现在好了,Michael Walz带给我们一个Visual Studio那样的界面漂亮的Tip of the day。(26KB)96,PathPic.zip这个类库提供了选择目录的功能,比通用的CFileDialog好多了。(20KB)97,twopanes.zip你有没有想过把通用对话框作为你的窗口的一个View是什么样子的?看看这个例子吧。(9KB)98,bcmenu21.zip可以利用工具条资源,绘制图标菜单。(56KB)99,MENU4_MDI.ZIP可以利用工具条资源,自动绘制图标菜单,MDI版本。(62KB)100,MENU4_SDI.ZIP可以利用工具条资源,自动绘制图标菜单,SDI版本。(61KB)101,toolbar2.zip这个程序演示了如何利用工具栏的新特性,在工具栏中的某个按钮加入下拉式的列表。(28KB)102,avi_bar.zip可以在状态栏里加入一个AVI动画。(34KB)103,outlook.zip这个类库使你可以创建象OutLook那样的切分窗口。(59KB)104,cxysplit.zip这是一个可以在DialogBox中使用的切分类库。(21KB)105,AutoWnd.zip自动切分一个视图,并且高亮显示具有输入焦点的视图。(31KB)106,MyWnd.zip高亮显示具有输入焦点的视图。(2KB)107,bhagat.zip使用一个简单的函数调用就可以在切分视图中动态创建任何类型的新视图。(64KB)108,MSDNWnd.zip这是一个MSDN中的切分窗口的例子,虽不怎么样但已经完整展示了切分操作。对于初学者是一个很好的参考。(37KB)109,rulers.zip使用固定大小的切分窗口(上面、左边部分)在视图中加入标尺。(就象Photoshop中的标尺那样)酷极了。(5KB)110,VisualFx.zip使用固定大小的切分窗口(上面、左边部分)在视图中加入标尺。(就象Photoshop中的标尺那样)酷极了。(88KB)111,infobar.zip定制了一个与outlook,outlook express相同的信息条。(16KB)112,BCGB.zipBCGControlBar的AppWizard,编译运行之后你在new的时候就可以选择使用BCGControlBar界面风格了。你最好与BCGControlBar一起下载使用。(215KB)113,sizecbar.zip支持浮动窗体的类库,使用它你可以轻松的做出象Visual Studio那样的界面来。(65KB)114,Coolocx.zip所有你能想到的控件一个都不能少,全都是浮动的效果乃至连Windows通用对话框都浮动。(62KB)115,fullscreen.zip让你轻松实现全屏显示的代码,很简单轻易更可上手,告诉你,全屏时你还可以保留工具条。(22KB)116,sys_tray.zip完全封装windows任务栏,使用此类可以轻松操作任务栏图标及其菜单功能。(51KB)117,regester.zip封装有关注册表操作的函数,使你可以轻松添加、删除、修改主键或键值。(2KB)118,bmpdraw.zip可以用bmp文件构造该类,不须在设计时将bmp文件加入到资源中去。其它功能多多。(5KB)119,split.zip从中可以学习CFile类的使用方法。(39KB)120,strange.zip用VC++实现异形窗口(234KB)121,csh.zip在对话框中实现提示条风格的上下文敏感帮助(75KB)122,whfname.zip从窗口句柄中得到文件名(6KB)

15,978

社区成员

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

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