您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > VC 6.0对话框动态布局解决方案
DynamicLayout-VC6.0对话框动态布局解决方案作者:杨志军下载源代码关键字:对话框控件、动态布局一、前言对话框是使用VC编程时最常用的形式之一,然而VC6.0对程序运行时控件布局的支持力度不够,当对话框改变大小时,要想对话框上的控件的行为相应的发生变化需要添加代码来控制,最可恨的是每次为支持这个必须写类似的无意义的代码。一次见到有人用一套宏实现了对话框控件大小和位置随对话框大小改变而改变,但不能产生类似单文档程序的分割条效果。于是我想写自己的布局管理器,依照功能定名为DynamicLayout(动态布局)。二、效果也许说了半天大家不明白是怎么回事,那先贴几张程序同一次运行时的截图吧,请留意图片之间的区别:图1VC6.0对话框程序原始运行效果图2在1的基础上加入DynamicLayout管理图3在2的基础上改变对话框大小图4在3基础上将分割条A移动到最左图5正在移动中的分隔条C(截图时光标被隐藏)图6程序运行时的一种布局三、使用要实现普通对话框的DynamicLayout支持很简单,首先在对话框类里声明一个CDynamicLayout类对象做成员变量;然后在对话框的OnInitDialog()函数里调用接口将对话框控件注册到CDynamicLayout对象;再重载对话框类的虚函数WindowProc(...),在该函数里调用CDynamicLayout接口FilterDynamicLayoutMessage(...)即可。当然如果用动态库的方式使用DynamicLayout,还须对VC工程做一些设置。如上图1所示对话框,实现图2、3、4、5、6效果需要添加如下代码:1.对话框头文件#includeDynamicLayoutExport.h//包含DynamicLayout头文件///////////////////////////////////////////////////////////////////////////////CDynamicLayoutTestDlgdialogclassCDynamicLayoutTestDlg:publicCDialog{......private:DynamicLayout::CDynamicLayoutm_DLayout;//声明动态布局对象};2.对话框CPP文件BOOLCDynamicLayoutTestDlg::OnInitDialog(){......//TODO:Addextrainitializationherem_DLayout.InitLayout(this);m_DLayout.SetDialogMaxSize(800,600);//限制对话框最大800*600m_DLayout.SetDialogMinSize(200,100);//限制最小200*100m_DLayout.AddPanel(上,,1,1,1,1);//添加一个Panel到对话框,参数1、1、1、1表示控件边框上下左右分别与父布局对应边框锁定m_DLayout.AddPanel(下,,0,1,1,1);m_DLayout.AddPanel(上右,上,1,1,1,1);//添加Panel到Panel(上)内m_DLayout.AddControl(IDC_LIST_LIST,上右,1,1,1,1);m_DLayout.AddPanel(上右下,上右,0,1,1,0);m_DLayout.AddControl(IDC_BTN_MODAL,上右下,1,1,1,0);m_DLayout.AddControl(IDC_BTN_MODALNESS,上右下,1,1,1,0);m_DLayout.AddControl(IDOK,上右下,1,1,1,0);m_DLayout.AddPanel(上左,上,1,1,1,0);m_DLayout.AddControl(IDC_TREE1,上左,1,1,1,1);m_DLayout.AddPanel(下左,下,1,1,1,0);m_DLayout.AddControl(IDC_LIST2,下左,1,1,1,1);m_DLayout.AddPanel(下右,下,1,1,1,1);m_DLayout.AddControl(IDC_EDIT1,下右,1,1,1,1);m_DLayout.AddControl(IDC_STATIC_COMMAND,下右,1,0,1,0);m_DLayout.AddControl(IDC_EDIT2,下右,1,0,1,1);m_DLayout.SetBkColor(上,RGB(160,160,255));//指定Panel的背景颜色m_DLayout.SetBkColor(上右,RGB(128,128,255));m_DLayout.SetBkColor(上右下,RGB(128,255,128));m_DLayout.ShowPanel(,TRUE);//显示Panel(见图2)m_DLayout.SetSplit();//设置分割条B(参看图4)m_DLayout.SetSplit(上);//设置分割条Am_DLayout.SetSplit(下);//设置分割条C//////////////////////////////////////////////////////////////////////////returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}LRESULTCDynamicLayoutTestDlg::WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam){//TODO:Addyourspecializedcodehereand/orcallthebaseclassm_DLayout.FilterDynamicLayoutMessage(message,wParam,lParam);//让CDynamicLayout对象参与对话框消息处理returnCDialog::WindowProc(message,wParam,lParam);}四、结束语程序构思仿制了微软.net平台的布局方案,特别是Panel的概念,用过.net的朋友一定很熟悉。不过我只实现了几个简单的功能,文章名取得有点大,请勿见笑。DynamicLayout工程和测试工程都是在VC6.0下调试通过的,如有问题欢迎指正。最新评论[发表评论][文章投稿]查看所有评论推荐给好友打印好了,使用起来,0,1,1,1的还得好好捉摸捉摸呢(JamesBond发表于2008-4-1711:40:00)谢谢这么好的例子,我下载后,将界面修改为:左右右边分两行:右上,右下右上再分两行:右上上,右上下这种格式,基本上就是左边一个控件右边上下三个控件但是拖动的时候控件的大小不改变,光背景改变,怎么回事呢?(JamesBond发表于2008-4-1711:15:00)本程序有两个项目,其中一个项目(DynamicLayout.dsw)是用来生成,DynamicLayout.lib另一个项目(DynamicLayoutTest.dsw)调用上面的DynamicLayout.lib。由于没有生成DynamicLayout.lib所以提示错误啊。评价一下:代码是写的不错的。(lyd_253261362发表于2008-3-1817:45:00)我解压后编译出现了个问题想请教:--------------------Configuration:DynamicLayoutTest-Win32Debug--------------------Linking...LINK:fatalerrorLNK1104:cannotopenfile..\lib\DynamicLayout.libErrorexecutinglink.exe.DynamicLayoutTest.exe-1error(s),0warning(s)(rbagglo发表于2008-3-623:51:00)有点被弄晕了,居然同意了“内存泄漏”的观点。请大家仔细看代码里的CLayoutPanel::~CLayoutPanel().(yangzhi070发表于2007-12-3011:46:00)非常不错(boxman发表于2007-12-2116:30:00)应该在CLayoutPanelFrame::~CLayoutPanelFrame()内调用Clear();多谢大家提醒(yangzhi070发表于2007-12-2112:47:00)谢谢大家的支持动态分配的CLayoutSplit应该是释放了的。内存分配是在CLayoutPanel::GetSplit()里,析构过程在CLayoutPanel::~CLayoutPanel()里最终调用了CLayoutPanel::ClearSplit(),释放内存。(yangzhi070发表于2007-12-2112:38:00)代码写得很好啊,学习中。下面写的是内存泄漏解决,调用CLayoutSplit析构即可。(tiandongdong001发表于2007-12-1922:40:00)foryangzhi070,usingVisualLeakDetector,modifyitasbelow:CDynamicLayout::~CDynamicLayout(){if(m_pMainPanel!=NULL)deletem_pMainPanel;//belowisadded,CLayoutSplit*pLSmustbe~()ed.POSITIONpos;void*pLP;void*pLS;for(pos=m_mapSplit.GetStartPosition();pos!=NULL;){m_mapSplit.GetNextAssoc(pos,pLP,pLS);deletepLS;}//CLayoutSplit*pLSisdel.}(tiandongdong001发表于2007-12-1922:36:00).......................................................More...
本文标题:VC 6.0对话框动态布局解决方案
链接地址:https://www.777doc.com/doc-5936642 .html