DynamicLayout-VC 6.0对话框动态布局解决方案
http://tech.ddvip.com 2007年11月26日 社区交流
内容摘要:对话框是使用VC编程时最常用的形式之一,然而VC 6.0对程序运行时控件布局的支持力度不够,当对话框改变大小时,要想对话框上的控件的行为相应的发生变化需要添加代码来控制, 最可恨的是每次为支持这个必须写类似的"无意义"的代码。
图5正在移动中的分隔条C(截图时光标被隐藏)

图6程序运行时的一种布局
三、使用
要实现普通对话框的DynamicLayout支持很简单,首先在对话框类里声明一个CDynamicLayout类对象做成员变量;然后在对话框的OnInitDialog()函数里调用接口将对话框控件注册到CDynamicLayout对象;再重载对话框类的虚函数WindowProc(...),在该函数里调用CDynamicLayout接口FilterDynamicLayoutMessage(...)即可。当然如果用动态库的方式使用DynamicLayout,还须对VC工程做一些设置。 如上图1所示对话框,实现图2、3、4、5、6效果需要添加如下代码:
1.对话框头文件
#include"DynamicLayoutExport.h"//包含DynamicLayout头文件2.对话框CPP文件
/////////////////////////////////////////////////////////////////////////////
//CDynamicLayoutTestDlgdialog
classCDynamicLayoutTestDlg:publicCDialog
{
......
private:
DynamicLayout::CDynamicLayoutm_DLayout;//声明动态布局对象
};
BOOLCDynamicLayoutTestDlg::OnInitDialog()四、结束语
{
......
//TODO:Addextrainitializationhere
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
//////////////////////////////////////////////////////////////////////////
returnTRUE; //returnTRUE unlessyousetthefocustoacontrol
}
LRESULTCDynamicLayoutTestDlg::WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
m_DLayout.FilterDynamicLayoutMessage(message,wParam,lParam);//让CDynamicLayout对象参与对话框消息处理
returnCDialog::WindowProc(message,wParam,lParam);
}
程序构思仿制了微软.net平台的布局方案,特别是Panel的概念,用过.net的朋友一定很熟悉。不过我只实现了几个简单的功能,文章名取得有点大,请勿见笑。
DynamicLayout工程和测试工程都是在VC6.0下调试通过的,如有问题欢迎指正。
责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……