C#winform设置窗体自动缩放适应不同尺寸的电脑屏幕大小 适应不同的分辨率 (带dataGridView控件)
解决dataGridView控件不能调整行高的问题
由于用户屏幕大小不同分辨率和缩放比例不同,固定大小的窗体不能满足所有人的需求,窗体缩放就成为了一个困扰,我在网上寻找过多种方法,以下方法最好用,再次对该贴作者表示感谢。
另外由于软件需求原先的代码无法做到dataGridView,listView等表格性的控件里面 列宽,行高,字体大小 做出相应改变,所以本人进行了相应的修改,以下代码以dataGridViewInfo为例做了个示范:
其他控件具体问题具体分析,希望以下代码能帮助到你。
一、控件准备
1. 首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里。
二、代码准备
#region控件缩放
double formWidth;//窗体原始宽度
double formHeight;//窗体原始高度
double scaleX;//水平缩放比例
double scaleY;//垂直缩放比例
double HeadersHeight;//dataGridView抬头高度
double RowTemplateHeight;//dataGridView行高
DictionarycontrolInfo = new Dictionary();//控件中心Left,Top,控件Width,控件Height,控件字体Size
//添加了dategridview的
//dataGridViewInfo
List dataGridViewInfo = newList();//dataGridView每列的宽度顺序一一对应。
///
///获取所有原始数据
///
protected void GetAllInitInfo(ControlCrlContainer)
{
if (CrlContainer.Parent == this)
{
formWidth = Convert.ToDouble(CrlContainer.Width);
formHeight =Convert.ToDouble(CrlContainer.Height);
}
foreach (Control item inCrlContainer.Controls)
{
if (item.Name.Trim() !="")
controlInfo.Add(item.Name,(item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2) +"," + item.Width + "," + item.Height + "," +item.Font.Size);
if(item.Name.Contains("dataGridView"))
{
for (int i = 0; i
{
dataGridViewInfo.Add(Convert.ToInt32(this.dataGridView1.Columns[i].Width));
}
HeadersHeight =this.dataGridView1.ColumnHeadersHeight;
RowTemplateHeight =this.dataGridView1.RowTemplate.Height;
}
if ((item as UserControl) ==null && item.Controls.Count > 0)
GetAllInitInfo(item);
}
}
private void ControlsChangeInit(ControlCrlContainer)
{
scaleX =(Convert.ToDouble(CrlContainer.Width) / formWidth);
scaleY =(Convert.ToDouble(CrlContainer.Height) / formHeight);
}
private void ControlsChange(ControlCrlContainer)
{
try
{
double[] pos = newdouble[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
foreach (Control item inCrlContainer.Controls)
{
if (item.Name.Trim() !="")
{
if ((item asUserControl) == null && item.Controls.Count > 0)
ControlsChange(item);
string[] strs =controlInfo[item.Name].Split(',');
for (int j = 0; j <5; j++)
{
pos[j] =Convert.ToDouble(strs[j]);
}
double itemWidth = pos[2] * scaleX;
double itemHeight =pos[3] * scaleY;
item.Left =Convert.ToInt32(pos[0] * scaleX - itemWidth / 2);
item.Top =Convert.ToInt32(pos[1] * scaleY - itemHeight / 2);
item.Width =Convert.ToInt32(itemWidth);
item.Height =Convert.ToInt32(itemHeight);
//if(!item.Name.Contains("dataGridView"))
item.Font = newSystem.Drawing.Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX,scaleY)).ToString()));
//gridview行宽列宽修改
if(item.Name.Contains("dataGridView"))
{
//dataGridView1.AutoSizeColumnsMode =DataGridViewAutoSizeColumnsMode.AllCells;
//DataGridView1.ColumnCount列
for (int i = 0; i< dataGridViewInfo.Count; i++)
{
this.dataGridView1.Columns[i].Width =Convert.ToInt32(dataGridViewInfo[i] * scaleX);
}
//设置自动调整解决行高不能设置的问题
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
//this.dataGridView1.ColumnHeadersHeight = Convert.ToInt32(HeadersHeight* scaleY);
//this.dataGridView1.RowTemplate.Height =Convert.ToInt32(RowTemplateHeight * scaleY);//待改进小行字体不一致
//this.dataGridView1.RowTemplate.DefaultCellStyle.Font = newSystem.Drawing.Font(item.Font.Name, float.Parse((pos[4]).ToString()));
//this.dataGridView1.RowTemplate.MinimumHeight =Convert.ToInt32(RowTemplateHeight * scaleY);
//***在控件界面设置行自适应即可dataGridView1.AutoSizeRowsMode =
DataGridViewAutoSizeRowsMode.AllCells;
}
}
}
}
catch(Exception ex)
{ }
}
#endregion
//3.在新建的窗体类中重写OnSizeChanged事件,并调用ControlsChangeInit和ControlsChange方法,代码如下:
protected override voidOnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
if (controlInfo.Count > 0)
{
ControlsChangeInit(this.Controls[0]);
ControlsChange(this.Controls[0]);
}
}
//调用函数
publicForm2()
{
InitializeComponent();
GetAllInitInfo(this.Controls[0]);
}