winform快速自定义布局计算实现

2 篇文章 0 订阅

前言:当winform界面放大时,我们布局就会显的很难看,如下:
在这里插入图片描述
在这里插入图片描述
这时候我们就要用到自定义布局,控件跟着界面缩放而自适应。
实现方法:会将from装进Panel里面对控件进行自动计算。

  1. 在项目中添加AutoWindowsSize.cs类,内容如下:
    在这里插入图片描述
类内容如下:
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; 
 
using System.Drawing.Drawing2D; 
//using System.Threading.Tasks; 
 
 
namespace AutoWindowsSize
{ 
    class AutoAdaptWindowsSize                       //窗口缩放对象 
    { 
        double formOriginalWidth;//窗体高度原始宽度 
        double formOriginalHeight;//窗体原始 
        double scaleX;//水平缩放比例 
        double scaleY;//垂直缩放比例 
        Dictionary<string, string> ControlsInfo = new Dictionary<string, string>();//控件中心Left,Top,控件Width,控件Height,控件字体Size 
 
        private Form _form; 
        Panel Win_Panel1 = new Panel(); 
        public AutoAdaptWindowsSize(Form form) 
        { 
            _form = form; 
 
            //代码生成一个容器panel1,添加至窗体 
            _form.Controls.Add(Win_Panel1); 
            Win_Panel1.BorderStyle = BorderStyle.None;    //容器border样式 
            Win_Panel1.Dock = DockStyle.Fill;             //设置填充,下面添加控件至容器完成后,容器会填充窗口
            Win_Panel1.BackColor = Color.TransParents;    // 设置为透明背景 
            //将窗体所有控件添加至panel1 
            while (_form.Controls[0].Name.Trim() != "") 
            { 
                foreach (Control item in _form.Controls) 
                { 
 
                    if (item.Name.Trim() != "" && item.Name.Trim() != Win_Panel1.Name.Trim()) 
                    { 
                        Win_Panel1.Controls.Add(item); 
                    } 
                } 
            } 
 
            //保存窗体和控件初始大小 
            InitControlsInfo(Win_Panel1); 
        } 
 
        public void InitControlsInfo(Control ctrlContainer) 
        { 
            if (ctrlContainer.Parent == _form)//获取窗体的高度和宽度 
            { 
                formOriginalWidth = Convert.ToDouble(ctrlContainer.Width); 
                formOriginalHeight = Convert.ToDouble(ctrlContainer.Height); 
            } 
            foreach (Control item in ctrlContainer.Controls) 
            { 
                if (item.Name.Trim() != "") 
                { 
                    //添加信息:键值:控件名,内容:据左边距离,距顶部距离,控件宽度,控件高度,控件字体。 
                    ControlsInfo.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) 
                { 
                    InitControlsInfo(item); 
                } 
            } 
 
        } 
        public void FormSizeChanged() 
        { 
            try 
            { 
                if (ControlsInfo.Count > 0)//如果字典中有数据,即窗体改变 
                { 
                    ControlsZoomScale(Win_Panel1);//表示pannel控件 
                    ControlsChange(Win_Panel1); 
                } 
            } 
            catch { } 
        } 
        private void ControlsZoomScale(Control ctrlContainer) 
        { 
            scaleX = (Convert.ToDouble(ctrlContainer.Width) / formOriginalWidth); 
            scaleY = (Convert.ToDouble(ctrlContainer.Height) / formOriginalHeight); 
        } 
 
        // 改变控件大小 
 
        private void ControlsChange(Control ctrlContainer) 
        { 
            double[] pos = new double[5];//pos数组保存当前控件中心Left,Top,控件Width,控件Height,控件字体Size 
            foreach (Control item in ctrlContainer.Controls)//遍历控件 
            { 
                if (item.Name.Trim() != "")//如果控件名不是空,则执行 
                { 
                    if ((item as UserControl) == null && item.Controls.Count > 0)//如果不是自定义控件 
                    { 
                        ControlsChange(item);//循环执行 
                    } 
                    string[] strs = ControlsInfo[item.Name].Split(',');//从字典中查出的数据,以‘,’分割成字符串组 
 
                    for (int i = 0; i < 5; i++) 
                    { 
                        pos[i] = Convert.ToDouble(strs[i]);//添加到临时数组 
                    } 
                    double itemWidth = pos[2] * scaleX;     //计算控件宽度,double类型 
                    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);//控件宽度,int类型 
                    item.Height = Convert.ToInt32(itemHeight);//控件高度 
                    if (float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString()) != 0)         //缩放字体大小不能为0 
                    { item.Font = new Font(item.Font.Name, float.Parse((pos[4] * Math.Min(scaleX, scaleY)).ToString())); }  //字体 
                } 
            } 
        } 
    } 
} 

在这里插入图片描述
2. 给界面添加启动事件和大小变化事件,按照下面图片箭头双击事件即可创建
在这里插入图片描述
添加界面大小变化事件
在这里插入图片描述
3. 在事件方法下面添加如下代码即可实现
在这里插入图片描述
代码如下:

 AutoAdaptWindowsSize AutoSize;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AutoSize = new AutoAdaptWindowsSize(this);
        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            if (AutoSize != null)
            {
                AutoSize.FormSizeChanged();
            }
        }

放大效果
在这里插入图片描述

注意:如果背景图是图片的话,放大会闪动,解决方法:在Form1的设计器中添加如下代码:

// 引入Forms。
using System.Windows.Forms;
protected override CreateParams CreateParams
{ 
    get 
    { 
        CreateParams cp = base.CreateParams; 
        cp.ExStyle |= 0x02000000; 
        return cp; 
    } 
}

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WinForms是一种基于.NET框架的Windows应用程序开发工具,可以使用C#或VB.NET语言进行编码。要实现自定义打印设计工具,可以按照以下步骤进行: 1. 创建一个新的WinForms应用程序项目。 2. 在项目中添加一个打印设计窗口,用于用户设计打印布局和设置打印选项。 3. 在窗口中添加需要的控件,例如文本框、按钮、图像框等,并设置其位置和大小。 4. 使用.NET的打印机类(PrinterSettings和PrintDocument)来实现打印功能。可以通过打印机类检测和选择可用的打印机、设置打印纸张、页边距、打印方向等。 5. 设计一个打印预览窗口,用于显示打印结果,可以在预览窗口中使用PrintPreviewControl控件实现。 6. 添加一个菜单栏或工具栏,包含打印、预览、设置、保存等功能按钮,方便用户进行操作。 7. 在代码中处理按钮的点击事件,调用相应的打印相关函数来处理打印任务。 8. 可以实现一些高级的打印功能,例如打印多页文档、自定义页眉页脚、选择打印区域等。可以通过自定义打印事件和处理程序来实现这些功能。 9. 最后,编译并发布应用程序,以供用户使用。可以将应用程序导出为可执行文件,或在安装程序中打包发布。 总结:通过使用WinForms的控件和打印机类,可以轻松实现自定义打印设计工具。用户可以在设计窗口中自由布局并设置打印选项,通过预览窗口查看打印结果,最后通过相应的按钮来触发打印任务。这样的工具可以方便用户进行打印布局的设计和打印任务的管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值