Halcon联合C# 添加工具类让winform自动根据窗体大小自适应缩放所有控件
为什么需要自适应布局?
在现代软件开发中,应用程序需要运行在各种不同分辨率和DPI设置的设备上。传统的固定像素布局方式已无法满足需求,自适应布局成为必备技能。本文将全面解析C# WinForm中实现完美自适应布局的各类技术方案,特别针对Halcon混合开发场景进行深度优化。
下面是一个完整的自适应布局 AutoControlSize.cs工具类实现,包含构造函数初始化和控件触发逻辑:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Windows.Forms;
using System.ComponentModel;
using System.Data;
using System.Drawing;namespace WinForms1.Attrs
{public class AutoControlSize{private static Queue<Control> MyControlQuery_Init = new Queue<Control>();//初始化控件集合队列private static ArrayList MyControlInfoList_Init = new ArrayList();//初始化控件参数集合private static Int32 MainDlg_H_Init;//初始化主对话框参数private static Int32 MainDlg_W_Init;//初始化主对话框参数private static Int32 MainDlg_H_Curr;//当前主对话框参数private static Int32 MainDlg_W_Curr;//当前主对话框参数private struct ControlInfo//控件参数结构体{public string ControlName;public Int32 Height;public Int32 Width;public Int32 Loc_X;public Int32 Loc_Y;}private static void FormControlList(Control item)//递归遍历控件{for (int i = 0; i < item.Controls.Count; i++){if (item.Controls[i].HasChildren){FormControlList(item.Controls[i]);}ControlInfo Node = new ControlInfo();Node.ControlName = item.Controls[i].Name;Node.Height = item.Controls[i].Height;Node.Width = item.Controls[i].Width;Node.Loc_X = item.Controls[i].Location.X;Node.Loc_Y = item.Controls[i].Location.Y;MyControlInfoList_Init.Add(Node);MyControlQuery_Init.Enqueue(item.Controls[i]);}}private static void GetMainFromSize_Init(Form MyForm)//获取初始化对话框参数{MainDlg_H_Init = MyForm.Height;MainDlg_W_Init = MyForm.Width;}private static void GetMainFromSize_Curr(Form MyForm)//获取当前对话框参数{MainDlg_H_Curr = MyForm.Height;MainDlg_W_Curr = MyForm.Width;}public static void RegisterFormControl(Form MyForm)//注册对话框所以控件{FormControlList(MyForm);GetMainFromSize_Init(MyForm);}public static void ChangeFormControlSize(Form MyForm)//使能AutoSize{GetMainFromSize_Curr(MyForm);Control myQuery;Queue<Control> ControlQuery = new Queue<Control>(MyControlQuery_Init);ControlInfo Node = new ControlInfo();Int32 i = 0;Int32 count = ControlQuery.Count;for (i = 0; i < count; i++){myQuery = ControlQuery.Dequeue();Node = (ControlInfo)MyControlInfoList_Init[i];myQuery.Height = (Int32)(Node.Height * (MainDlg_H_Curr / (double)MainDlg_H_Init));myQuery.Width = (Int32)(Node.Width * (MainDlg_W_Curr / (double)MainDlg_W_Init));myQuery.Location = new Point((Int32)(Node.Loc_X * (MainDlg_W_Curr / (double)MainDlg_W_Init)),(Int32)(Node.Loc_Y * (MainDlg_H_Curr / (double)MainDlg_H_Init)));}}}
}
将"AutoControlSize.RegisterFormControl(this);"添加到Form的构造函数里控件初始化函数中;
AutoControlSize.RegisterFormControl(this);
打开窗体设计器 在 解决方案资源管理器 中,双击打开你的窗体文件(如 Form1.cs
),进入 设计视图。
找到 Resize 事件
-
选中控件列表中的 窗体本身(不是里面的按钮或其他控件)。
-
打开右侧的 属性窗口(按
F4
或右键 → 属性)。 -
点击顶部的小闪电图标(事件图标),进入事件列表。
-
找到
Resize
事件,双击它。
3. 自动生成事件响应函数
-
Visual Studio 会自动在代码中生成如下函数