解决winform应用程序在不同分辨率系统下界面错乱的问题

首先,遇到的问题是这样的,当已经ok的程序在我电脑上运行时出现了界面很小,而且错乱无章的情况,如下图:

记得上一次我的解决办法是每个控件每个控件拖动修改,到最后perfect!可是??修改之后呢?半天时间没有了,要做的事没有挪动一步。。。。。

后来在网上查了查这是什么原因:

问题分析:

产生界面混乱的主要原因是,winform程序的坐标是基于点(point)的,而point与DPI(分辨率,每英寸所打印点数)相关,一英寸等于72 Point,当DPI发生变化时,显示在界面上的尺寸根据DPI自动变化,导致界面与设计之初产生错乱。

解决方案

  • 方案一:利用AutoScaleMode属性,将窗体的AutoScaleMode属性设置为DPI。

    DPI:根据现实分辨率控制缩放,常用分辨率为 96 和 120 DPI.

    Font : 根据类使用的字体(通常为系统使用的字体)的维度控制缩放。

    Inherit:根据类的父类的缩放模式控制缩放。如果不存在父类,则禁用自动缩放。

    None: 禁用自动缩放。

  • 方案二: 借鉴web程序中以pixel(像素)为常用单位,在winform 程序中使用像素来定位,在form的构造函数中将窗体的AutoScaleMode属性设置为Front.
 private void InitializeComponent()
      {
           //设定按字体来缩放控件
           this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
           //设定字体大小为12px
           this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular,
           System.Drawing.GraphicsUnit.Pixel, ((byte)(134)));
      }
采用方案二更改后的效果;

结果来看,有个别控件未达到期望的效果。但相比之前真的是调整改善很多。比我当初一个个拖动修改要明智的多。

  • 方案三 :记录下1920*1080分辨率下工作区域的Width和Height,记作DefaultWidth和DefaultHeight,用改变分辨率之后的工作区域的Width和Height去分别除以DefaultWidth和DefaultHeight,得到缩放比例,再调整主界面和各控件的缩放。
public class AutoReSizeForm
{
    static float SH
    {
        get
        {
             return (float)Screen.PrimaryScreen.Bounds.Height / DefaultHeight;
        }
    }
    static float SW
    {
        get
        {
             return (float)Screen.PrimaryScreen.Bounds.Width / DefaultWidth;
        }
    }

    public static void SetFormSize(Control fm)
    {
        fm.Location = new Point((int)(fm.Location.X * SW), (int)(fm.Location.Y * SH));
        fm.Size = new Size((int)(fm.Size.Width * SW), (int)(fm.Size.Height * SH));
        fm.Font = new Font(fm.Font.Name, fm.Font.Size * SH,fm.Font.Style,fm.Font.Unit,fm.Font.GdiCharSet,fm.Font.GdiVerticalFont);
        if (fm.Controls.Count!=0)
        {
            SetControlSize(fm);
        }
    }

    private static void SetControlSize(Control InitC)
    {
        foreach (Control c in InitC.Controls)
        {
            c.Location = new Point((int)(c.Location.X * SW), (int)(c.Location.Y * SH));
            c.Size = new Size((int)(c.Size.Width * SW), (int)(c.Size.Height * SH));
            c.Font = new Font(c.Font.Name, c.Font.Size * SH, c.Font.Style, c.Font.Unit, c.Font.GdiCharSet, c.Font.GdiVerticalFont);
            if (c.Controls.Count != 0)
            {
                SetControlSize(c);
            }
         }
    }
}

原文地址:https://www.cnblogs.com/skyeblogs/p/8434560.html

时间: 2024-11-10 14:25:50

解决winform应用程序在不同分辨率系统下界面错乱的问题的相关文章

C# 32位程序在64位系统下注册表操作

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突 相关资料请查看32位程序在64位系统下运行的重定向机制 下面是以获取操作系统安装密匙KEY的案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

高DPI下界面错乱的解决方法和原理

来源: http://bbs.csdn.net/topics/370177760 我在win32 + c写的界面中解决办法,就是把字体的字号给固定了,这样做的结果就是,不管dpi是否有改变,界面中控件的文字的字号不变,就不会出现文字换行的情况. 但像菜单文字的字号就变大了,combobox(右三角),checkbox(选择框)变大一点点,显的有点不协调. 但至少不影响使用. 下面是判断当前系统的dpi,然后重置字体的字号. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

android设计的布局在阿拉伯语下界面错乱的解决方法

(1)正在AndroidManifest.xml声明文件的application元素中,增加" android:supportsRtl=true" (2)建] androidの设计的布局在阿拉伯语下界面错乱的解决方法 (1)在AndroidManifest.xml声明文件的元素中,添加" android:supportsRtl=true" (2)修改应用程序中layout的"left/right"布局属性,改为对应的"start/end

解决Winform应用程序中窗体背景闪烁的问题

本文转载:https://my.oschina.net/Tsybius2014/blog/659742 我的操作系统是Win7,使用的VS版本是VS2012,文中的代码都是C#代码. 这几天遇到一个问题,即我用一个嵌入图片的Panel作为Winform应用程序的背景,如下图所示: 这是一个Winform窗体,里面放置了一个Panel,Dock属性为Fill,BackgroundImage使用了<少年电世界>2003年第02期的封面图片,BackgroundImageLayout使用了Stret

关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)

0x00 前言 最近学习了[email protected]的文章<Persistence Architecture Matters>,恰巧解决了我之前遇到过的一个问题,理清了文件和注册表重定向中需要注意的细节 大家在学习的过程中难免也会碰到,所以在此分享一下. <Persistence Architecture Matters>的链接:https://labs.mwrinfosecurity.com/blog/persistence-architecture-matters/ 0

32位程序访问64位系统上的Windows注册表

今天在工作的过程中遇到个奇怪的为问题,就是通过c#获取注册表键值的问题,一般都比较简单: string SQLPath = string.Empty; RegistryKey hkml = Registry.LocalMachine; RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer"); if (MSSQLServerKey != null) { string[] keys =

Linux系统下不让MySQL区分表名的大小写的解决办法

问题描述: 今天将某项目数据库移植到liunix服务器上,结果出现无法找到表的错误,查询数据库,表确实是存在的.经过分析比较,发现是表名大小写问题导致. 问题分析: MySQL数据库的表名在Linux系统下是严格区分大小写的,在Windows系统下开发的程序移植到Linux系统下,如果程序中SQL语句没有严格按照大小写访问数据库表,就可能会出现找不到表的错误. 解决办法: 修改MySQL的配置文件my.cnf,在[mysqld]部分添加如下配置选项lower_case_table_names =

WinForm 应用程序的打包和部署_简单版(图文)(转)

开发好了一个 WinForm 系统,如何使之可以平稳的运行在没有安装 .NET Framework 的操作系统上?这就涉及到打包和部署的内容,通过打包和部署形成安装程序,实现 WinForm 应用软件正常的安装在客户的操作系统上.另一方面同时需要考虑通过打包和部署形成卸载程序,将该应用软件卸载掉,达到方便客户使用的目的. (一) 创建部署项目 在 VS 环境下,单击“文件” → “新建” → “项目”,打开“新建项目”对话框,从“项目类型”列表中选择“安装和部署项目”,在对话框右边的“模板”列表

32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个DWORD类型的UnixStamp.  但是在64位系统上有所不同(仅测试了win7.win8),默认情况下32程序在64位机器上访问的是下面这个地址HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion