方法來自百度, 不算太好,但目前能滿足需求。(窗口在LOAD的時候記錄每個控件的坐標,每次窗口重繪的時候引時SizeChange事件,根據比率重新設置坐標)
以下是代碼 AutoSizeFormClass類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace SalesClient.Sys { public class AutoSizeFormClass { public struct controlRect { public int Left; public int Top; public int Width; public int Height; } private bool _Flag; public bool Flag { get { return _Flag; } set { _Flag = value; } } private int _Number; public int Number { get { return _Number; } set { _Number = value; } } private List<controlRect> oldCtrl; public void Initialize(Form mForm) { oldCtrl = new List<controlRect>(); controlRect cR; cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height; oldCtrl.Add(cR); foreach (Control c in mForm.Controls) { controlRect objCtrl; objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height; oldCtrl.Add(objCtrl); } Flag = true; Number = mForm.Controls.Count; } public void ReSize(Form mForm) { if (!Flag) return; float wScale = (float)mForm.Width / (float)oldCtrl[0].Width; float hScale = (float)mForm.Height / (float)oldCtrl[0].Height; int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0; int ctrlNo = 1; try { if (mForm.Controls.Count != Number) return; foreach (Control c in mForm.Controls) { ctrLeft0 = oldCtrl[ctrlNo].Left; ctrTop0 = oldCtrl[ctrlNo].Top; ctrWidth0 = oldCtrl[ctrlNo].Width; ctrHeight0 = oldCtrl[ctrlNo].Height; c.Left = (int)(ctrLeft0 * wScale); c.Top = (int)(ctrTop0 * hScale); c.Width = (int)(ctrWidth0 * wScale); c.Height = (int)(ctrHeight0 * hScale); ctrlNo += 1; } } catch { return; } } } }
在要設置的窗體里
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SalesClient.HT
{
public partial class test : Form
{
public test()
{
InitializeComponent();
}
SalesClient.Sys.AutoSizeFormClass asc = new SalesClient.Sys.AutoSizeFormClass();
private void test_Load(object sender, EventArgs e)
{
asc.Initialize(this);
}
private void test_SizeChanged(object sender, EventArgs e)
{
asc.ReSize(this);
}
}
}
效果圖
原來
放大后
這樣如果屏幕分辨率改變,就可以根據縮放比率進行調整 。