对话框内部控件自动缩放类

ref : http://www.vcfans.com/2009/03/automatic-scaling-of-internal-control-dialog-box-type.html

 

作者: Lonkil

博客:www.vcfans.com

邮箱:lonkil_AT_Gmail.com

当对话框中控件数量过多,且需要进行缩放的时,需要手工在Onsize中为每个控件位置和大小的计算,实现繁琐。本文的主要思想来自网上的一篇资料,但由于转载已造成数据的不完整,我根据该文章的思想重新实现,且补充完整了该类。效果如下图:

null

null

通过上面两幅图,第一幅图是缩放前的,第二幅图是缩放后的。上面的编辑框以及Button1是按对框等比例缩放,”确定”按钮是水平居中对齐,”取消”按钮是垂直居中对齐。”我是静态文本框”是水平等比例平移的。

这个缩放类,主要思想在对话框Onsize进行拦截,统一处理。关于CAutoCtrlSize中的AS_OnSize具体实现可以参看代码。

下面我简述一下类的使用步骤:

1. 在对话框初始化时,将本对话框中所有需要自动调整位置及大小的控件加到类中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//如果不想用全局的话,这里用static解决变量过期问题
	static AS_CTRLDATA aryCtrls[]=
	{
		{IDC_EDIT1, AS_SIZEXY, 100, AS_A_LEFT, false, CSize(0,0)}
		,{IDC_BUTTON1,(AS_MOVEX| AS_SIZEX),100, AS_A_LEFT, true, CSize(0,0)}
		,{IDC_STATIC_1,AS_MOVEX,100, AS_A_LEFT, false, CSize(0,0)}
		,{IDOK,AS_MOVEXY,100, AS_A_H_CENTER, false, CSize(0,0)}
		,{IDCANCEL,AS_MOVEXY,100, AS_A_V_CENTER, false, CSize(0,0)}
	};
	m_pAutoSize = new CAutoCtrlSize();
	if( m_pAutoSize )
	{
		m_pAutoSize->AS_InitData((PAS_CTRLDATA )aryCtrls, sizeof(aryCtrls)/sizeof(AS_CTRLDATA), m_hWnd );
	}

AS_CTRLDATA这个结构体需要详细描述一下。

1
2
3
4
5
6
7
8
9
typedef struct
{
	DWORD dwCtrlID;/*控件ID*/
	UINT asType;/*缩放或移动类型*/
	int  nScale;/*缩放或移动比例*/
	AS_Align_Type alignType;
	bool isMiniSize;//是否限定最小尺寸
	CSize szMiniSize;//最小尺寸
}AS_CTRLDATA,* PAS_CTRLDATA;

dwCtrlID:需要进行变化的控件ID

asType:该控件移动属于什么类型以及其组合。AS_MOVEX水平移动,AS_MOVEY垂直移动等,请参见AS_TYPE。

nScale:缩放比例,当对话框尺寸进行一定变化,该类控件按些指定的比例进行同步缩放。范围0到100。

alignType:基于哪种方式进行缩放,如是AS_A_LEFT则基于左边对齐,AS_A_H_CENTER则是基于水平距中对齐,AS_A_V_CENTER则是基于垂直距中对齐。

isMiniSize: 是否限定最小尺寸。如果限定将以对话框初始化的大小作为最小尺寸

szMiniSize:初始值是0,0,如果指定了isMiniSize后,将用于保存最小尺寸。

2. 在对话框中的OnSize中调用CAutoCtrlSize为中的AS_OnSize。

1
2
3
4
5
6
7
8
9
void CAutoSizeDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);
 
	if( m_pAutoSize )
	{
		m_pAutoSize->AS_OnSize(nType, cx, cy );
	}
}

在此将使用我们的类来处理所有缩放。

3. 在GetMinMaxInfo中调用AS_FixSize限定最小尺寸。

1
2
3
4
5
6
7
8
9
void CAutoSizeDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if( m_pAutoSize )
	{
		m_pAutoSize->AS_FixSize(lpMMI);
	}
	CDialog::OnGetMinMaxInfo(lpMMI);
}

最小尺寸将是对话框的初始大小。

到此已经完成该类的使用,如果您在使用中有什么麻烦或Bug请邮件通知本人,如果您有更好的修改请发一份给我谢谢。Lonkil_AT_Gmail.com或去我小站留言

  AutoSize_src.zip (43.8 KiB, 618 hits)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值