C#Winform控件随窗体缩放

解决方法一:(测试可用)

/// <summary>
/// 缩放比
/// </summary>
private double m_AllZoomScale = 1.0;
/// <summary>
/// 控件中心Left,Top,控件Width,控件Height,控件字体Size
/// </summary>
private Dictionary<string, string> m_DctControlInfo = new Dictionary<string, string>();

/// <summary>
/// 缩放控件
/// </summary>
private void Resize_Zoom()
{
	if (m_DctControlInfo.Count > 0)
	{
		Resize_ControlsChange(this.panelPDF);
	}
}

/// <summary>
/// 递归获取所有要缩放的控件
/// </summary>
private void Resize_GetAllInitInfo(Control CrlContainer)
{
	foreach (Control item in CrlContainer.Controls)
	{
		if (item.Name.Trim() != string.Empty)
			m_DctControlInfo.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) + "," + item.Width + "," + item.Height + "," + item.Font.Size);
		if ((item as UserControl) == null && item.Controls.Count > 0)
			Resize_GetAllInitInfo(item);
	}
}

/// <summary>
/// 缩放存储的所有控件
/// </summary>
private void Resize_ControlsChange(Control CrlContainer)
{
	// pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
	double[] pos = new double[5];
	foreach (Control item in CrlContainer.Controls)
	{
		if (item.Name.Trim() != string.Empty)
		{
			if ((item as UserControl) == null &&item.Controls.Count > 0)
                Resize_ControlsChange(item);
		
			string[] strs = m_DctControlInfo[item.Name].Split(',');
			for (int j = 0; j < 5; j++)
			{
				pos[j] = Convert.ToDouble(strs[j]);
			}

			double itemWidth = pos[2] * m_AllZoomScale;//scaleX;
			double itemHeight = pos[3] * m_AllZoomScale;//scaleY;
			item.Left = Convert.ToInt32(pos[0] * m_AllZoomScale - itemWidth / 2);//scaleX
			item.Top = Convert.ToInt32(pos[1] * m_AllZoomScale - itemHeight / 2);//scaleY
			item.Width = Convert.ToInt32(itemWidth);
			item.Height = Convert.ToInt32(itemHeight);
			item.Font = new Font(item.Font.Name, float.Parse((pos[4] * m_AllZoomScale).ToString()));//scaleX, scaleY
		}
	}
}

Resize_GetAllInitInfo() 函数用于递归获取并保存所有要缩放的控件到m_DctControlInfo变量中。

Resize_Zoom() 函数中的“this.panelPDF”应该是所有缩放控件的顶层容器,应当和调用Resize_GetAllInitInfo() 函数时传递的值一样。

×此方法参考修改自:http://www.cnblogs.com/sydeveloper/archive/2013/01/29/2881521.html


解决方法二:(测试可用)

/// <summary>
/// 缩放比
/// </summary>
private float m_AllZoomScale = 1.0f;

/// <summary>
/// 缩放控件
/// </summary>
private void Resize_Zoom()
{
	if (m_DctControlInfo.Count > 0)
	{
		this.panelPDF.Scale(new SizeF(m_AllZoomScale, m_AllZoomScale));
	}
}

一般控件都继承自Control,而Control有个Scale函数,使用此函数也可进行缩放。

×但此方法相对于“解决方法一”存在控件中输入的字体不能放大,和连续点击放大缩小时似乎存在间隔(?)的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值