怎么解决C# winform在小屏幕电脑上界面显示不全的问题。

zg80fj 2018-02-01 09:33:16
C#编写的winform程序,
在台式机上可以正常显示,没有问题,界面如下:

但是在笔记本上就显示不全,见下图:

现在笔记本上显示用的滚动条,但是很不方便,想问有没有方法设置界面在不同尺寸的屏幕上自动按比例缩小或放大?谢谢。
...全文
9240 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jzdcf 2021-03-02
  • 打赏
  • 举报
回复
引用 1 楼 exception92 的回复:
->1.用布局控件进行布局: TableLayoutPanel:把区域划分成行和列,设置Anchor为Top|Bottom|Left|Right后,会随着窗口的大小自动调整单元格大小。 FlowLayoutPanel:按照从左到右、从上到下的顺序排列子控件,设置Anchor后,会随着窗口大小变化重新布局。 ->2.用控件的Anchor属性确定控件的定位方式,使控件可以与窗口某边界的位置固定或自动调整大小 ->3.控件的Dock属性可以让子控件紧贴窗口边界或充满窗口。 设置界面在不同尺寸的屏幕上自动按比例缩小或放大 -》换成WPF去布局界面,ViewBox控件完全足矣。
123在横屏显示正常但是如果是竖屏就很难适配了, ViewBox在不同横纵比时控件会被压扁看起来不自然。
estella1984 2020-06-22
  • 打赏
  • 举报
回复
我之前也是笔记本显示不全,但在台式机上显示全了。我是把AutoScaleMode设置成None就可以了,我原来设置成DPI形式了,问题应该就是分辨率的事儿
zj_zwl 2018-02-06
  • 打赏
  • 举报
回复
右边的控件不用管,左侧座标在绘制时就得考虑窗口的大小,每小格的大小不能固定,要动态算出来才行
Static逃 2018-02-06
  • 打赏
  • 举报
回复
WinForm开发的话,Form的属性里面有一个borderStyle 好像是叫这个,改成Sizeable就好了吧 然后最大化窗口
Jason_Mao1 2018-02-05
  • 打赏
  • 举报
回复
这个问题我之前也遇到过,你得知道一个问题,分辨率 DPI 等等,你看那个QQ 你如果调整了分辨率 或者是 DPI 他都会提示你是否也把QQ 设置成同样的DPI 。我觉得如果做的好的话,你也得这么考虑,就是通过DPI 去设计或者是去加载不同的布局和字体大小 。确实挺麻烦的 。希望能帮助到你 。
蜗牛慢慢趴 2018-02-05
  • 打赏
  • 举报
回复 1
分辨率不一样,你在画坐标轴的时候,XY轴上每个刻度长度如果固定,那分辨率不同,你绘制出来的XY轴刻度个数应该也不一样,不然你怎么调整都是显示不全的 右边的是dock anchor的问题,改一下就好了
stevenjin 2018-02-05
  • 打赏
  • 举报
回复
看下属性里有没有同比缩放
a7234355 2018-02-05
  • 打赏
  • 举报
回复
直接设置成百分比就好了
super_admi 2018-02-04
  • 打赏
  • 举报
回复
应该是在你的笔记本上,控件发生了自动缩放。 建议将自动缩放关闭.
xuzuning 2018-02-03
  • 打赏
  • 举报
回复
先通过 Screen.FromControl(this) 获取屏幕大小 再根据预置的尺寸做适当调整 大多数情况下都是不需要调整到每个控件的,比如你示例的画面是并列的两个容器,你只要改变容器的宽度和右控件的起点就可以了,没必要改变容器内的控件的尺寸。 虽然理论上并没有错误,但改变控件尺寸也要相应改变字体大小,弄不好会很难看的
健者天行 2018-02-03
  • 打赏
  • 举报
回复
这个界面就分左右2部份, 你只需要缩放左边的“坐标轴”就可以了吧。。。
chenxin981 2018-02-02
  • 打赏
  • 举报
回复
按百分比进行设置
  • 打赏
  • 举报
回复
引用 6 楼 u010848611 的回复:
[quote=引用 5 楼 xomix 的回复:] [quote=引用 4 楼 zg80fj 的回复:] [quote=引用 3 楼 xomix 的回复:]

        private void setfrom(Control.ControlCollection IControls)
        {
            foreach (Control item in IControls)
            {
                item.Top = (int)(item.Top * 0.8);
                item.Left = (int)(item.Left * 0.8);
                item.Width = (int)(item.Width * 0.8);
                item.Height = (int)(item.Height * 0.8);
                if (item.HasChildren)
                {
                    setfrom(item.Controls);
                }
            }
        }
这是个缩小到80%的方法,你自己写参数做成缩小指定倍数的即可。
你好,你这种方法是不是以每个控件的中心来缩放? 能不能设定将控件的左上角固定来缩放?[/quote] 能也不能。 你自己根据控件逻辑位置和间隔来制作left就可以左上角实现了。 但是我觉得你来问肯定就是不知道怎么制造这些控件的逻辑位置, 那就简单点说吧: 控件1|控件2 例如他们的left分别是0,55。 这时候物理位置就是 0和55,逻辑位置是0,控件1的宽度+两个控件的间距。 如果你缩放的时候使用的是物理位置,当然看起来就是以空间的中心缩放,但是当你使用逻辑位置你就会发现这是按照 顶点(左上角)缩放的了。 但是逻辑位置的制作这些还是需要一些时间的: 1、理顺全部控件关系。 2、控件在窗口初始化的时候直接使用逻辑位置*比例的方式指定四个参数。[/quote] 位置好像只能重新指定了, 我是用基准的方法来做的. 如取左上角控件位置一定, 然后后面的控件位置 = ctrler_base.x+控件间间隔(*系数). 当然间隔也可以指定[/quote] 实际上你只要兼容几个分辨率就好了,就像游戏一样做几个分辨率的布局,然后用户设置分辨率这样开发速度要快一些。
xity 2018-02-02
  • 打赏
  • 举报
回复
引用 5 楼 xomix 的回复:
[quote=引用 4 楼 zg80fj 的回复:] [quote=引用 3 楼 xomix 的回复:]

        private void setfrom(Control.ControlCollection IControls)
        {
            foreach (Control item in IControls)
            {
                item.Top = (int)(item.Top * 0.8);
                item.Left = (int)(item.Left * 0.8);
                item.Width = (int)(item.Width * 0.8);
                item.Height = (int)(item.Height * 0.8);
                if (item.HasChildren)
                {
                    setfrom(item.Controls);
                }
            }
        }
这是个缩小到80%的方法,你自己写参数做成缩小指定倍数的即可。
你好,你这种方法是不是以每个控件的中心来缩放? 能不能设定将控件的左上角固定来缩放?[/quote] 能也不能。 你自己根据控件逻辑位置和间隔来制作left就可以左上角实现了。 但是我觉得你来问肯定就是不知道怎么制造这些控件的逻辑位置, 那就简单点说吧: 控件1|控件2 例如他们的left分别是0,55。 这时候物理位置就是 0和55,逻辑位置是0,控件1的宽度+两个控件的间距。 如果你缩放的时候使用的是物理位置,当然看起来就是以空间的中心缩放,但是当你使用逻辑位置你就会发现这是按照 顶点(左上角)缩放的了。 但是逻辑位置的制作这些还是需要一些时间的: 1、理顺全部控件关系。 2、控件在窗口初始化的时候直接使用逻辑位置*比例的方式指定四个参数。[/quote] 位置好像只能重新指定了, 我是用基准的方法来做的. 如取左上角控件位置一定, 然后后面的控件位置 = ctrler_base.x+控件间间隔(*系数). 当然间隔也可以指定
  • 打赏
  • 举报
回复

        private void setfrom(Control.ControlCollection IControls)
        {
            foreach (Control item in IControls)
            {
                item.Top = (int)(item.Top * 0.8);
                item.Left = (int)(item.Left * 0.8);
                item.Width = (int)(item.Width * 0.8);
                item.Height = (int)(item.Height * 0.8);
                if (item.HasChildren)
                {
                    setfrom(item.Controls);
                }
            }
        }
这是个缩小到80%的方法,你自己写参数做成缩小指定倍数的即可。
  • 打赏
  • 举报
回复
引用 楼主 zg80fj 的回复:
C#编写的winform程序, 在台式机上可以正常显示,没有问题,界面如下: 但是在笔记本上就显示不全,见下图: 现在笔记本上显示用的滚动条,但是很不方便,想问有没有方法设置界面在不同尺寸的屏幕上自动按比例缩小或放大?谢谢。
版主说的是慢的做法 还有个快的: 将本界面所有元素遍历,将他们的宽高上左四个属性 乘以 当前分辨率/设计分辨率 的结果即可,记得中间比值的结果要用double否则就看不见了。
exception92 2018-02-01
  • 打赏
  • 举报
回复
->1.用布局控件进行布局: TableLayoutPanel:把区域划分成行和列,设置Anchor为Top|Bottom|Left|Right后,会随着窗口的大小自动调整单元格大小。 FlowLayoutPanel:按照从左到右、从上到下的顺序排列子控件,设置Anchor后,会随着窗口大小变化重新布局。 ->2.用控件的Anchor属性确定控件的定位方式,使控件可以与窗口某边界的位置固定或自动调整大小 ->3.控件的Dock属性可以让子控件紧贴窗口边界或充满窗口。 设置界面在不同尺寸的屏幕上自动按比例缩小或放大 -》换成WPF去布局界面,ViewBox控件完全足矣。
  • 打赏
  • 举报
回复
引用 4 楼 zg80fj 的回复:
[quote=引用 3 楼 xomix 的回复:]

        private void setfrom(Control.ControlCollection IControls)
        {
            foreach (Control item in IControls)
            {
                item.Top = (int)(item.Top * 0.8);
                item.Left = (int)(item.Left * 0.8);
                item.Width = (int)(item.Width * 0.8);
                item.Height = (int)(item.Height * 0.8);
                if (item.HasChildren)
                {
                    setfrom(item.Controls);
                }
            }
        }
这是个缩小到80%的方法,你自己写参数做成缩小指定倍数的即可。
你好,你这种方法是不是以每个控件的中心来缩放? 能不能设定将控件的左上角固定来缩放?[/quote] 能也不能。 你自己根据控件逻辑位置和间隔来制作left就可以左上角实现了。 但是我觉得你来问肯定就是不知道怎么制造这些控件的逻辑位置, 那就简单点说吧: 控件1|控件2 例如他们的left分别是0,55。 这时候物理位置就是 0和55,逻辑位置是0,控件1的宽度+两个控件的间距。 如果你缩放的时候使用的是物理位置,当然看起来就是以空间的中心缩放,但是当你使用逻辑位置你就会发现这是按照 顶点(左上角)缩放的了。 但是逻辑位置的制作这些还是需要一些时间的: 1、理顺全部控件关系。 2、控件在窗口初始化的时候直接使用逻辑位置*比例的方式指定四个参数。
zg80fj 2018-02-01
  • 打赏
  • 举报
回复
引用 3 楼 xomix 的回复:

        private void setfrom(Control.ControlCollection IControls)
        {
            foreach (Control item in IControls)
            {
                item.Top = (int)(item.Top * 0.8);
                item.Left = (int)(item.Left * 0.8);
                item.Width = (int)(item.Width * 0.8);
                item.Height = (int)(item.Height * 0.8);
                if (item.HasChildren)
                {
                    setfrom(item.Controls);
                }
            }
        }
这是个缩小到80%的方法,你自己写参数做成缩小指定倍数的即可。
你好,你这种方法是不是以每个控件的中心来缩放? 能不能设定将控件的左上角固定来缩放?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧