博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#Winform控件随窗体缩放
阅读量:6840 次
发布时间:2019-06-26

本文共 2314 字,大约阅读时间需要 7 分钟。

实现步骤:

1.在窗体中放一个容器(例如:Panel),并且将容器的Dock属性设置为Fill。窗体中其他控件都放在这个容器中。

2.创建一个窗体类,该类继承于原始窗体类,并在新建的这个窗体类中添加如下代码,以后创建的窗体都继承于新建的这个窗体类:

#region
 控件缩放
double
 formWidth;
//
窗体原始宽度
double
 formHeight;
//
窗体原始高度
double
 scaleX;
//
水平缩放比例
double
 scaleY;
//
垂直缩放比例
Dictionary<
string
string
> controlInfo = 
new
 Dictionary<
string
string
>();
//
控件中心Left,Top,控件Width,控件Height,控件字体Size
///
 
<summary>
///
 获取所有原始数据
///
 
</summary>
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);
    }
}
private 
void
 ControlsChangeInit(Control CrlContainer)
{
    scaleX = (Convert.ToDouble(CrlContainer.Width) / formWidth);
    scaleY = (Convert.ToDouble(CrlContainer.Height) / formHeight);
}
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);
            item.Font = 
new
 Font(item.Font.Name, 
float
.Parse((pos[
4
] * Math.Min(scaleX, scaleY)).ToString()));
        }
    }
}

#endregion 

3.在新建的窗体类中重写OnSizeChanged事件,并调用ControlsChangeInit和ControlsChange方法,代码如下:

protected
 
override
 
void
 OnSizeChanged(EventArgs e)
{
    
base
.OnSizeChanged(e);
    
if
 (controlInfo.Count > 
0
)
    {
        ControlsChangeInit(
this
.Controls[
0
]);
        ControlsChange(
this
.Controls[
0
]);
    }
}

4.在窗体的构造函数中调用GetAllInitInfo方法,代码如下:

    GetAllInitInfo(
this
.Controls[
0
]);

 


注:原创,转载请指明出处。

你可能感兴趣的文章
PHP 时区报错
查看>>
MySQL报错解决方案:2013-Lost connection to MySQL server
查看>>
C# DES 加密 解密
查看>>
linux 与 window 对比式理解与应用
查看>>
SEO中的DIV CSS样式的命名规则
查看>>
一些随笔,我有故事,你有酒吗
查看>>
SELECT子句顺序
查看>>
Mac 终端便利工具: 管理工具-Homebrew 和提示工具oh my zsh
查看>>
《使用CSLA 2019:CSLA .NET概述》原版和机译文档下载
查看>>
SAP 应用服务负载均衡的实现
查看>>
C# 生成二维码
查看>>
php闭包研究
查看>>
ruby Encoding
查看>>
牛客练习赛7 E 珂朵莉的数列
查看>>
登录mysql出现/var/lib/mysql/mysql.sock不存在
查看>>
升级vue-cli为 cli3 并创建项目
查看>>
最喜欢的 jQuery 插件
查看>>
meta标签
查看>>
FZU 2159 WuYou
查看>>
Postgres-XL部署记录(一)
查看>>