C# winform根据屏幕大小自动缩放

1  Form基类

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.Runtime.InteropServices;
using System.IO;
using System.Reflection;

/// <summary>
/// 用法:
/// 1 新建Form窗体,继承BaseForm
/// 2 新Form添加panel, dock = fill;
/// 3 新Form load事件添加
/// </summary>
public class BaseForm : Form
{
    #region 属性
    double formWidth, formHeight;//初始化大小
    double xScale, yScale;//缩?放比括例
    //控?件t坐?标括,?大洙小?,?字?体?
    Dictionary<string, string> controlInfo = new Dictionary<string, string>();
    #endregion

    #region 方?法

    public void RemoveVirtualBorder(object obj)
    {
        MethodInfo methodinfo = obj.GetType().GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod);
        methodinfo.Invoke(obj, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, new object[] { ControlStyles.Selectable, false }, Application.CurrentCulture);

    }
    /// <summary>
    /// 获?取?原-始?大洙小?
    /// </summary>
    /// <param name="CrlContainer"></param>
    protected void GetInitInfo(Control CrlContainer)
    {
        if (CrlContainer.Parent == this)
        {
            formWidth = Convert.ToDouble(CrlContainer.Width);
            formHeight = Convert.ToDouble(CrlContainer.Height);
        }

        foreach (Control c in CrlContainer.Controls)
        {
            if (c.Name.Trim() != "")
                controlInfo.Add(c.Name, (c.Left + c.Width / 2) + "," + (c.Top + c.Height / 2) + "," +
                    c.Width + "," + c.Height + "," + c.Font.Size);
            if ((c as UserControl) == null && c.Controls.Count > 0)
                GetInitInfo(c);
            RemoveVirtualBorder(c);

        }
    }

    /// <summary>
    /// 获?取?缩?放?比括例
    /// </summary>
    /// <param name="CrlContainer"></param>
    private void ControlsChangeInit(Control CrlContainer)
    {
        xScale = (Convert.ToDouble(CrlContainer.Width)) / formWidth;
        yScale = (Convert.ToDouble(CrlContainer.Height)) / formHeight;
    }

    /// <summary>
    /// 缩?放?控?件t
    /// </summary>
    /// <param name="CrlContainer"></param>
    private void ControlsChange(Control CrlContainer)
    {
        double[] pos = new double[5];//存?放?当獭前°控?件t关?键ü值μ。£

        foreach (Control c in CrlContainer.Controls)
        {
            if (c.Name.Trim() != "")
            {
                if ((c as UserControl) == null && c.Controls.Count > 0)
                    ControlsChange(c);
                string[] strTmp = controlInfo[c.Name].Split(',');
                for (int i = 0; i < 5; i++)
                {
                    pos[i] = Convert.ToDouble(strTmp[i]);
                }
                double cWidth = pos[2] * xScale;
                double cHeigth = pos[3] * yScale;
                c.Left = Convert.ToInt32(pos[0] * xScale - cWidth / 2);
                c.Top = Convert.ToInt32(pos[1] * yScale - cHeigth / 2);
                c.Width = Convert.ToInt32(cWidth);
                c.Height = Convert.ToInt32(cHeigth);
                double tmp;
                if (xScale == 0 && yScale == 0)
                    tmp = 1;
                else
                    tmp = Math.Min(xScale, yScale);

                c.Font = new Font(c.Font.Name, float.Parse((pos[4] * tmp).ToString()));
            }
        }
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        if (controlInfo.Count > 0)
        {
            ControlsChangeInit(this.Controls[0]);
            ControlsChange(this.Controls[0]);
        }
    }
    #endregion
}
时间: 2024-11-10 00:18:57

C# winform根据屏幕大小自动缩放的相关文章

让网页背景图片 根据屏幕大小自动铺满

让网页背景图片 根据屏幕大小自动铺满:设置两层div,底层div当做背景使用,放置一张图片即可.<div id="background" style="position:absolute;z-index:-1;width:100%;height:100%;top:0px;left:0px;"><img src="1.jpg" width="100%" height="100%"/>&

C#WinForm获取屏幕大小

当前的屏幕除任务栏外的工作域大小 this.Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; this.Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 当前的屏幕包括任务栏的工作域大小 this.Width=System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;

移动端页面按手机屏幕分辨率自动缩放的js

<script>        var phoneWidth = parseInt(window.screen.width);        var phoneHeight = parseInt(window.screen.height);        var phoneScale = phoneWidth/750; //除以的值按手机的物理分辨率        var ua = navigator.userAgent;        if (/Android (\d+\.\d+)/.tes

图片大小不改动,根据屏幕大小自动把图片居中显示

background属性 background-image: url('../img/1_1.jpg'); <!-- 背景图片路径 --> background-repeat: no-repeat; <!-- 背景图片是否重复显示 --> background-position: center; <!-- 若背景图片小于div,则居中显示 --> background-attachment: fixed; <!-- 背景图片固定,不随scroll拖动而变动 --&

html 网页背景图片根据屏幕大小CSS自动缩放

https://blog.csdn.net/coslay/article/details/47109281 腾讯微博和QQ空间的登录背景图片是根据访客的屏幕大小自动缩放的,但是好像是用JQuery代码实现的.先不说要调用jq库拖慢了网页的打开时间,而且对于兼用性不好. 前几天用CSS研究出相同效果的样式代码.无论图片多大都能根据屏幕变化(当然图片尺寸越大越好).而且在拉动网页窗体大小时会自动调节图片大小,实时交互.效果上图看不了.在这里放个连接, CSS 代码如下: #background {

Android官方提供的支持不同屏幕大小的全部方法

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8830286 原文地址为:http://developer.android.com/training/multiscreen/screensizes.html 本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕 根据屏幕的配置来加载合适的UI布局 确保正确的布局应用在正确的设备屏幕上 提供可以根据屏幕大小

Android官方提供的支持不同屏幕大小的全部方法(转)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8830286 原文地址为:http://developer.android.com/training/multiscreen/screensizes.html 本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕 根据屏幕的配置来加载合适的UI布局 确保正确的布局应用在正确的设备屏幕上 提供可以根据屏幕大小自动伸缩的图片 使用 "

使用百分比设置自动缩放图片的小技巧

响应式web网页开发中,如果要求无论是PC端还是移动端,网页都要铺满整个屏幕,并且图片要随着屏幕进行自动缩放.图片自动缩放很容易想到用百分比来设定宽高,可是用百分比形式设置图片的宽高,那么不管是放大还是缩小,浏览器都将保持图像的宽高比例.这意味着图像的高度与宽度之比将不会发生变化,图像也就不会发生扭曲.这也会引发一个问题,那就是当浏览器只是宽度改变而高度不变时,图片默认下宽度是随着浏览器变化而变化,而图片的高度也会岁宽度发生改变.原本想要的是当屏幕宽度改变高度不变的时候,图片也只是宽度改变高度不

Android 官方提供的支持屏幕大小的全部方法(精华)

本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕 根据屏幕的配置来加载合适的UI布局 确保正确的布局应用在正确的设备屏幕上 提供可以根据屏幕大小自动伸缩的图片 使用 "wrap_content" 和 "match_parent" 为了确保你的布局能够自适应各种不同屏幕大小,你应该在布局的视图中使用"wrap_content"和"match_parent"来确定它的宽和高.