对于C#写的窗口应用程序,会出现拉伸要放大的情况,但是拉伸之后 组件的大小以及位置都不会改变,这些有点难了
对于上述的问题,觉得有两种解决办法。
1.设置所写的窗口应用程序不可拉伸(固定大小)
即固定住窗口应用程序的大小
在组件form的属性中修改为 FormBorderStyle为None、Fixed3D、FixedDialog或者FixedToolWindow即可,这样就可以固定住界面,不会被拉伸变换。
补充一下:FormBorderStyle各项含义如下:
Fixed3D:固定的三维边框。
FixedDialog:固定的对话框样式的粗边框。
FixedSingle:固定的单行边框。
FixedToolWindow:不可调整大小的工具窗口边框。工具窗口不会显示在任务栏中也不会显示在当用户按 Alt+Tab 时出现的窗口中。尽管指定 FixedToolWindow 的窗体通常不显示在任务栏中,还是必须确保 ShowInTaskbar 属性设置为 false,因为其默认值为 true。
None:无边框。
Sizable:可调整大小的边框。
SizableToolWindow:可调整大小的工具窗口边框。工具窗口不会显示在任务栏中也不会显示在当用户按 Alt+Tab 时出现的窗口中。
2.界面中的控件等比例拉伸放大缩小
首先要把组件form的属性中修改为 FormBorderStyle为Sizable或者SizableToolWindow
代码如下:
public Form1()
{
InitializeComponent();//初始化组件
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
x = this.Width;//初始化时候的界面宽度
y = this.Height;//初始化时候的界面高度
setTag(this);
}
private float x;//定义当前窗体的宽度
private float y;//定义当前窗体的高度
//拖动页面操作
private void Form1_Resize(object sender, EventArgs e)
{
float newx = (this.Width) / x;//拖动界面之后的宽度与之前界面的宽度之比
float newy = (this.Height) / y;//拖动界面之后的高度与之前界面的高度之比
setControls(newx, newy, this);//进行控件大小的伸缩变换
}
private void setTag(Control cons)
{
foreach (Control con in cons.Controls)
{
con.Tag = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size;
if (con.Controls.Count > 0)
{
setTag(con);
}
}
}
//用来拉伸界面中的组件
private void setControls(float newx, float newy, Control cons)
{
//遍历窗体中的控件,重新设置控件的值
foreach (Control con in cons.Controls)
{
//获取控件的Tag属性值,并分割后存储字符串数组
if (con.Tag != null)
{
string[] mytag = con.Tag.ToString().Split(new char[] { ';' });
//根据窗体缩放的比例确定控件的值
con.Width = Convert.ToInt32(System.Convert.ToSingle(mytag[0]) * newx);//宽度
con.Height = Convert.ToInt32(System.Convert.ToSingle(mytag[1]) * newy);//高度
con.Left = Convert.ToInt32(System.Convert.ToSingle(mytag[2]) * newx);//左边距
con.Top = Convert.ToInt32(System.Convert.ToSingle(mytag[3]) * newy);//顶边距
Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小
con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
if (con.Controls.Count > 0)
{
setControls(newx, newy, con);
}
}
}
}