您的位置:逆风者 VC++ 正文
 添加时间:2007-11-25 原文发表:2007-11-25 人气:109 来源:vckbase.com

作者:杨志军

下载源代码
逆@风@者

关键字:对话框控件、动态布局

一、前言

对话框是使用VC编程时最常用的形式之一,然而VC 6.0对程序运行时控件布局的支持力度不够,当对话框改变大小时,要想对话框上的控件的行为相应的发生变化需要添加代码来控制, 最可恨的是每次为支持这个必须写类似的"无意义"的代码。

一次见到有人用一套宏实现了对话框控件大小和位置随对话框大小改变而改变,但不能产生类似单文档程序的分割条效果。
于是我想写自己的布局管理器,依照功能定名为DynamicLayout(动态布局)。

二、效果
也许说了半天大家不明白是怎么回事,那先贴几张程序同一次运行时的截图吧,请留意图片之间的区别:


图1 VC6.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. 对话框头文件 
#include "DynamicLayoutExport.h"//包含DynamicLayout头文件 
///////////////////////////////////////////////////////////////////////////// 
// CDynamicLayoutTestDlg dialog 
class CDynamicLayoutTestDlg : public CDialog 

...... 
private: 
DynamicLayout::CDynamicLayout m_DLayout;//声明动态布局对象 
}; 
2.对话框CPP文件
BOOL CDynamicLayoutTestDlg::OnInitDialog() 

...... 
// TODO: Add extra initialization here 
m_DLayout.InitLayout( this ); 
m_DLayout.SetDialogMaxSize( 800,600 );//限制对话框最大800*600 
m_DLayout.SetDialogMinSize( 200,100 );//限制最小200*100 
m_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("上");  //设置分割条A 
m_DLayout.SetSplit("下" ); //设置分割条C 
////////////////////////////////////////////////////////////////////////// 

return TRUE;  // return TRUE  unless you set the focus to a control 

LRESULT CDynamicLayoutTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 

// TODO: Add your specialized code here and/or call the base class 
m_DLayout.FilterDynamicLayoutMessage(message,wParam,lParam);//让CDynamicLayout对象参与对话框消息处理 
return CDialog::WindowProc(message, wParam, lParam); 
四、结束语

程序构思仿制了微软.net平台的布局方案,特别是Panel的概念,用过.net的朋友一定很熟悉。不过我只实现了几个简单的功能,文章名取得有点大,请勿见笑。
DynamicLayout工程和测试工程都是在VC6.0下调试通过的,如有问题欢迎指正。
相关文章

用命令模式实现对象存储——对象与关系数据
探讨性能测试中的计时问题
对OpenCV中的平面划分相关函数使用探索
让你的软件界面更漂亮(六)-- 仿QQ主界面之L
软件框架的利器、TangramMini组件应用教程六
利用IJG JPEG Library压缩图像为jpg格式
用递归的方法画分形图
MFC中基于对话框程序快捷键的实现
让你的软件界面更漂亮(五)
BMP图象解析
文件过滤系统驱动开发Filemon学习笔记
I2C通信
简单录、放音并保存为wav文件程序
动态创建控件支持事件响应并可保存与读取
如何实现由列表控件控制的属性表
多线程管理类
浅谈输入法编程
MFC 通用控件的初始化
基于GDI+的数字图像处理
运动搜索算法之钻石搜索(Ver1.0)

相关评论


本文章所属分类:首页 VC++

  热门关键字: