作者: 死胖子叔叔
查看: 7880|回复: 11
打印 上一主题 下一主题

[源码] 【等比缩放】窗体/控件 等比缩放子控件不偏移

[复制链接]
跳转到指定楼层
楼主
死胖子叔叔 发表于 2018-4-2 12:25:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查看: 7880|回复: 11
[C#] 纯文本查看 复制代码
        /// <summary>
        /// Zoom Control(Form) Ex 1.0 By Xomix comic_729#sina.com
        /// </summary>
        /// <param name="c">Control(Form) Need Zoom .</param>
        /// <param name="Zoom">Zoom, 10:Nothing , less than 10:Zoom out , more than 10:Zoom in </param>
        private void ZoomEX(System.Windows.Forms.Control c, int Zoom)
        {
 
            //求出相对中心
            System.Drawing.Point p0 = new System.Drawing.Point(c.Width / 2, c.Height / 2);
            //获取控件列表,计算控件距离中心位置得出相对坐标。
            System.Collections.Generic.LinkedList<ControlEx> Controls
                = new System.Collections.Generic.LinkedList<ControlEx>();
            foreach (System.Windows.Forms.Control item in c.Controls)
            {
                //查看该子控件是否有子控件,如果有,自调用本方法
                if (item.HasChildren)
                {
                    ZoomEX(item, Zoom);
                }
                ControlEx itemEx = new ControlEx(item);
                itemEx.ExPoint = new ControlEx.exPoint(((float)item.Left - (float)p0.X) / (float)c.Width, ((float)item.Top - (float)p0.Y) / (float)c.Height);
                itemEx.ExSize = new ControlEx.exSize((float)item.Width / (float)c.Width, (float)item.Height / (float)c.Height);
                Controls.AddLast(itemEx);
            }
            //求出新的Size
            System.Drawing.Size newSize = new System.Drawing.Size(c.Width * Zoom / 10, c.Height * Zoom / 10);
            //求出新的相对中心
            System.Drawing.Point pNew = new System.Drawing.Point(newSize.Width / 2, newSize.Height / 2);
            //对每一个控件重新生成坐标和Size
            foreach (ControlEx item in Controls)
            {
                item.Control.Size = new System.Drawing.Size((int)(item.ExSize.Width * newSize.Width), (int)(item.ExSize.Height * newSize.Height));
                item.Control.Location = new System.Drawing.Point((int)(item.ExPoint.X * newSize.Width + pNew.X), (int)(item.ExPoint.Y * newSize.Height + pNew.Y));
            }
            c.Size = newSize;//调整控件本身大小
        }
 
        class ControlEx
        {
            public System.Windows.Forms.Control Control  { get; set; }
            public ControlEx(System.Windows.Forms.Control c)
            {
                Control = c;
            }
            public exPoint ExPoint { get; set; }
            public exSize ExSize { get; set; }
            public class exPoint
            {
                public float X;
                public float Y;
 
                public exPoint(float x, float y)
                {
                    // TODO: Complete member initialization
                    this.X = x;
                    this.Y = y;
                }
            }
            public class exSize {
                public exSize(float p1, float p2)
                {
                    // TODO: Complete member initialization
                    this.Width = p1;
                    this.Height = p2;
                }
                public float Width { get; set; }
                public float Height { get; set; }
            }
        }
 
//窗体使用   ZoomEX(this, 15);   实现缩放,1.5


前几天无聊做的窗口等比缩放,喜欢的拿走吧,主要解决已经设计好的窗体在分辨率变化后太小/太大的问题。
什么你们说Echarts?我心情还没那么好哈哈哈。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 转播转播
回复 论坛版权

使用道具 举报

沙发
boxxie 发表于 2018-4-3 09:57:31 | 只看该作者

多谢楼主分享哟
板凳
895090595 发表于 2018-4-21 00:39:44 | 只看该作者
嘿嘿,评论一下  以后不然找不到.(窗体/控件 等比缩放子控件不偏移)
地板
mqzzzz 发表于 2018-5-17 14:08:18 | 只看该作者
动态添加的控件应该无效吧
5#
 楼主| 死胖子叔叔 发表于 2018-12-20 15:14:25 | 只看该作者
mqzzzz 发表于 2018-5-17 14:08
动态添加的控件应该无效吧

已经添加到窗体上的控件全部等比缩放,但是你动态添加的时候自己设置了topleft你让我怎么处理你的这些数据,你又没暴露出来。
6#
moningcw 发表于 2019-3-1 17:11:14 | 只看该作者
支持一下!!!!!!!!
回复

使用道具 举报

7#
jacksonwong 发表于 2019-5-25 13:25:53 | 只看该作者
谢谢分享!
回复

使用道具 举报

8#
qinghexue 发表于 2019-5-25 17:18:27 | 只看该作者
谢谢分享 螺柱好人哦
9#
Sxxjava 发表于 2019-6-8 22:26:47 | 只看该作者
嘿嘿,评论一下  以后不然找不到
10#
胖头鱼 发表于 2019-6-11 11:00:43 | 只看该作者
好东西感谢分享
您需要登录后才可以回帖 登录 | 加入CSkin博客

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|CSkin ( 粤ICP备13070794号

Powered by Discuz! X3.2  © 2001-2013 Comsenz Inc.  Designed by ARTERY.cn
GMT+8, 2024-11-22 13:15, Processed in 0.870733 second(s), 28 queries , Gzip On.

快速回复 返回顶部 返回列表