记录页面切换学习过程,希望对各位有需要的朋友有所帮助,也希望对本人不完善的想法加以指导纠正,感谢!
想法介绍:是一个上位机系统的页面切换程序,页面分为三层有【FM1】“FM1 WelcomeForm”欢迎使用界面、【FM2】“FM2 LoginForm”登录界面、【FM3】“FM3 MainForm”主页,主页里面会有Panel里面的各个应用页面“PG1”、“PG2”,可以通过按钮进行页面切换;
第一步:建立各层窗口页面
![](https://i-blog.csdnimg.cn/blog_migrate/77b02cb74e01792737b856c08a1ad99e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b50bb226e0d4ac33430d77d6f50179c0.png)
第二步:各个窗口内部控件的添加
(1)欢迎使用界面【FM1】“FM1 WelcomeForm”
欢迎使用界面有一个页面切换按钮“button1”在工具箱拖拽过来修改名称即可
*还添加了一个“Panel1”,【Dock】属性设为“Fill”这一个“Panel1”是为了比例缩放而做的;
![](https://i-blog.csdnimg.cn/blog_migrate/29513836eca8e2150d379ffe5b7a33e5.png)
(2)登录界面【FM2】“FM2 LoginForm”
登录界面分别有“textBox_username”、“textBox_password”、“button1”在工具箱拖拽过来修改名称即可
*还添加了一个“Panel1”,【Dock】属性设为“Fill”这一个“Panel1”是为了比例缩放而做的;
![](https://i-blog.csdnimg.cn/blog_migrate/c127ca97d708faced115974b9e48e0ab.png)
(3)用户界面1【FM3】“FM3 MainForm”
用户界面1有Panel:“mainPanel”、Button:“openPG1”“openPG2”在工具箱拖拽过来修改名称即可
*还添加了一个“Panel1”,【Dock】属性设为“Fill”这一个“Panel1”是为了比例缩放而做的;
*用户界面1内部“mainPanel”的页面切换这次就先不记录了,因为做的并不好,希望有看到的朋友私信指导一下,感谢!
![](https://i-blog.csdnimg.cn/blog_migrate/f3d2976a0c4913edee9093a31808d063.png)
(4)准备“mainPanel”内部的PG1和PG2,方便后续扩展完善
*此处设置属性【FormBorderStyle】设成None,其他就根据需求添加一下;
![](https://i-blog.csdnimg.cn/blog_migrate/809804ebde4373ba803f71310937bc7b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c41545c23fe2768d949e95c4c7ae7847.png)
完成后就可以进行功能代码的编写啦;
第三步:欢迎使用界面代码的编写
双击【登录页面】按钮建立button1_Click按钮事件并输入切换页面代码
private void button1_Click(object sender, EventArgs e)
{
Form FM2 = new FM2();//FM2 是窗口的(Name)
FM2.ShowDialog(this);
this.Close();
}
效果演示:
![](https://i-blog.csdnimg.cn/blog_migrate/44c44ac79dde31f659fa9d9156a00256.gif)
控件比例缩放程序:
#region 控件缩放
double formWidth;//窗体原始宽度
double formHeight;//窗体原始高度
double scaleX;//水平缩放比例
double scaleY;//垂直缩放比例
Dictionary<string, string> controlInfo = new Dictionary<string, string>();
//控件中心Left,Top,控件Width,控件Height,控件字体Size
//获取控件初始信息:GetAllInitInfo()
protected void GetAllInitInfo(Control CrlContainer)
{
if (CrlContainer.Parent == this)
{
formWidth = Convert.ToDouble(CrlContainer.Width);
formHeight = Convert.ToDouble(CrlContainer.Height);
}
foreach (Control item in CrlContainer.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 as UserControl) == null && item.Controls.Count > 0)
GetAllInitInfo(item);
}
}
//获取窗体缩放比例:ControlsChaneInit()
private void ControlsChangeInit(Control CrlContainer)
{
scaleX = (Convert.ToDouble(CrlContainer.Width) / formWidth);
scaleY = (Convert.ToDouble(CrlContainer.Height) / formHeight);
}
//窗体改变时修改控件大小:ControlsChange()
private void ControlsChange(Control CrlContainer)
{
double[] pos = new double[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size
foreach (Control item in CrlContainer.Controls)
{
if (item.Name.Trim() != "")
{
if ((item as UserControl) == 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);
try
{
item.Font = new Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString()));
}
catch
{
}
}
}
}
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
if (controlInfo.Count > 0)
{
ControlsChangeInit(this.Controls[0]);
ControlsChange(this.Controls[0]);
}
}
#endregion
public FM1()
{
InitializeComponent();
//获取控件初始信息
GetAllInitInfo(this.Controls[0]);
//上电窗体最大化
this.WindowState = FormWindowState.Maximized;
}
第四步:登录界面程序代码编写
建立FM2_Load窗口登录事件
private void FM2_Load(object sender, EventArgs e)
{
this.Owner.Hide();
}
建立button1_Click按钮事件
private void button1_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(this.textBox_username.Text))
{
MessageBox.Show("用户名不能为空");
}
else if (String.IsNullOrEmpty(this.textBox_password.Text))
{
MessageBox.Show("密码不能为空");
}
else if (!this.textBox_username.Text.Equals("admin"))
{
MessageBox.Show("用户名不存在");
}
else if (!this.textBox_password.Text.Equals("admin"))
{
MessageBox.Show("密码不正确");
}
else
{
//登录成功,跳转到主页面
Form FM3 = new FM3();
FM3.ShowDialog(this);
this.Close();
}
}
效果演示:
![](https://i-blog.csdnimg.cn/blog_migrate/7d5f534277c406354b62579d9528296e.gif)
*若要窗口能有控件比例缩放功能复制上述【控件比例缩放程序代码】到FM2相应程序段即可;
第五步:用户界面1程序代码编写
*该页面想法是在页面下方有一排页面切换按钮进行Panel内部页面的切换的,目前只是写了两个示例而且页面显示不完美,后续完善后会专门发帖补充,也希望有看到的私信指点,感谢!
建立FM3_Load窗口登录事件
private void FM3_Load(object sender, EventArgs e)
{
this.Owner.Hide();
}
建立openPG1_Click按钮事件
private void openPG1_Click(object sender, EventArgs e)
{
this.mainPanel.Controls.Clear(); //初始化主panel
PG1 pg1 = new PG1(); // 实例化要在pnlMain里显示的form(PG1是新建的一个form)
pg1.TopLevel = false; //设置属性
//pg1.Width= mainPanel.Size.Width;
//pg1.Height= mainPanel.Size.Height;
pg1.Show(); //显示form
this.mainPanel.Controls.Add(pg1); //把from添加到pnlMain里
}
建立openPG2_Click按钮事件(两个按钮事件代码功能一样只是要显示的Form不一样)
private void openPG2_Click(object sender, EventArgs e)
{
this.mainPanel.Controls.Clear();
PG2 pg2 = new PG2();
pg2.TopLevel = false;
//pg2.Width = mainPanel.Size.Width;
//pg2.Height = mainPanel.Size.Height;
pg2.Show();
this.mainPanel.Controls.Add(pg2);
}
效果演示:
![](https://i-blog.csdnimg.cn/blog_migrate/1c7e4d0e43d22907287697e424380d8f.gif)
上述就是目前的学习过程及实现过程了,希望对有需要的朋友有帮助,更希望有朋友加以指点共同学习!