DynamicLayout-VC 6.0对话框动态布局解决方案

2016-02-19 21:44 94 1 收藏

今天图老师小编要向大家分享个DynamicLayout-VC 6.0对话框动态布局解决方案教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

  一、前言

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

  一次见到有人用一套宏实现了对话框控件大小和位置随对话框大小改变而改变,但不能产生类似单文档程序的分割条效果。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  于是我想写自己的布局管理器,依照功能定名为DynamicLayout(动态布局)。

  二、效果

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

图1VC6.0对话框程序原始运行效果

图2在1的基础上加入DynamicLayout管理

图3在2的基础上改变对话框大小

图4 在3基础上将分割条A移动到最左

图5正在移动中的分隔条C(截图时光标被隐藏)

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

图6程序运行时的一种布局

  三、使用

  要实现普通对话框的DynamicLayout支持很简单,首先在对话框类里声明一个CDynamicLayout类对象做成员变量;然后在对话框的OnInitDialog()函数里调用接口将对话框控件注册到CDynamicLayout对象;再重载对话框类的虚函数WindowProc(...),在该函数里调用CDynamicLayout接口FilterDynamicLayoutMessage(...)即可。当然如果用动态库的方式使用DynamicLayout,还须对VC工程做一些设置。 如上图1所示对话框,实现图2、3、4、5、6效果需要添加如下代码:

  1.对话框头文件

#include"DynamicLayoutExport.h"//包含DynamicLayout头文件
/////////////////////////////////////////////////////////////////////////////
//CDynamicLayoutTestDlgdialog
classCDynamicLayoutTestDlg:publicCDialog
{
......
private:
DynamicLayout::CDynamicLayoutm_DLayout;//声明动态布局对象
};2.对话框CPP文件

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下调试通过的,如有问题欢迎指正。

来源:http://www.tulaoshi.com/n/20160219/1626984.html

延伸阅读
在Windows通用对话框中,查找/替换对话框是比较特殊的一个,它是一个非模态对话框,所以它的使用与其它通用对话框有所不同。 一、注册 注册的目的有两个,一是说明在程序中要使用查找/替换对话框,二是让窗口能响应查找/替换消息,提供相应的消息函数。 注册位置应该在查找/替换对话框的父窗口,比如主框架窗口CMainFrame、...
标签: Web开发
    1.将下面一段代码插入head与/head之间: script function rusure() {  question = confirm("确实要去进入吗?")  if (question !="0") { window.open("","测试公告窗口","width=340,height=163,toolbar=0,status=0,menubar=0,resize=0"); } } /script     2.在链接标签内加入onclick()语句...
无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用 BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下: void CYo...
基于对话框的程序中,每当用户按下回车键时,程序都会退出,其效果和按下对话框中的默认"OK"按钮是一样的,即使去掉"OK"按钮的 BS_DEFPUSHBUTTON 属性也没用。那么如何定制回车键的行为呢?这个问题在Windows的开发中由来已久,对于初学者来说,这是个恼人的问题,幸运的是,人们找到了很多种解决这个问题的方案。本实例将告诉你实现定制回...
一、新建一个基于对话框的程序 二、删除static 将确定改为颜色。 三、在dlg头文件里用class wizard添加以下消息映射 afx_msg void OnExitButton(); afx_msg void OnDestroy(); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDrawButton(); 四、在头文件声明如下两个变量 int m_Radius; int m_direction; ...

经验教程

603

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部