根据屏幕分辨率将窗体中的调整大小按钮控件固定大小

3
我有一个特定的需求,即在不同的屏幕分辨率下,我的表单中的按钮大小应保持一定大小。如上图所示,我有“ON”和“OFF”两个按钮,它们的大小在特定分辨率下都是2厘米。现在我需要代码来重新调整按钮大小以适应不同的分辨率,或者使按钮的大小即使在不同分辨率下也保持不变。谢谢。

这似乎是自定义控件的工作... - terrybozzio
你是否已经为按钮设置了锚点?如果是,请先将其移除,然后再尝试。 - senthilkumar2185
1
@Senthilkumar 如果我们设置锚点,那么ON按钮将覆盖在OFF按钮上。因为OFF按钮的左侧位置不会根据ON按钮的宽度进行设置。 - Shell
@terry 虽然不是一个坏主意,但在这种情况下并不需要自定义控件。 - jay_t55
3个回答

0

根据https://dev59.com/rW445IYBdhLWcg3wnrvM#4767664的适应,我们可以得到:

private int CentimeterToPixel(double Centimeter)
{
    double pixel = -1;
    using (Graphics g = this.CreateGraphics())
    {
        pixel = Centimeter * g.DpiY / 2.54d;
    }
    return (int)pixel;
}

// ...

button.Width = CentimeterToPixel(2);

几点需要注意:

  1. 它使用DpiY进行转换,这可能(虽然不太可能,但仍有可能)与DpiX不同。
  2. 您可能想阅读关于DPI感知应用程序的内容,DPI感知是比手动缩放更好的选择,因为在手动缩放中,您需要负责所有应该缩放的内容(字体、边距、大小等)。

@sia 它具体是怎么不工作的?CentimeterToPixel返回的值是多少?你尝试过调试CentimeterToPixel吗?g.DpiY的值是多少? - Eugene Podskal
@EugenePodskal,我们如何从dpi获取实际大小?因为DPI在屏幕分辨率更改时不会更改。当我将结果更改为1024x768而不是1360x768时,控件将被拉伸。 - Shell
@Shell DPI(PPI)是我们唯一(至少我所知道的)将像素和物理尺寸(分辨率)相关联的方法。DPI通常不会随分辨率更改而自动更改,因此在任何与标准不同的分辨率或DPI不一致(手动更改)的情况下,我们将拥有实际与所需物理尺寸不同的控件,但它们的“虚拟物理尺寸”将是正确的。不幸的是,据我现在的理解,它对OP的情况没有帮助。也许有人会找到一种解决方案,考虑DPI和分辨率,以在屏幕上提供正确的物理尺寸。 - Eugene Podskal

0
问题似乎是“如何使Windows表单分辨率独立?”。顺便说一下,在互联网上提供了很多示例来使您的窗体分辨率独立。不幸的是,.Net没有提供任何一种使您的应用程序对所有分辨率普及的设施。但是,并不是只有一种正确的方式。
我已经发布了一个逻辑。你可以查看一下。 缩放Windows窗体窗口 您只需要将该代码添加到您的Windows表单即可。

我的问题是锚点设置了吗? - senthilkumar2185
不使用“Anchor”属性时,“Anchor”将无法正常工作。因此,如果我们要手动设置按钮的大小和位置,则应避免使用“Anchor”属性。 - Shell
发生了什么?@sia - Shell
@Shell - 当屏幕分辨率改变时,按钮控件的大小仍然会改变。我甚至尝试了这个公式double pixel = -1; pixel = Centimeter * 96 / 2.5d;return (int)pixel; - sia

-3

不了解Winforms,但这可能可以通过CSS处理:

@media (min-width: 221px) {
    #button1 {
        width: 200px;
        height: 200px;
    }
}
@media (min-width: 280px) {
    #button1 {
        width: 240px;
        height: 240px;
    }
}

针对不同的屏幕尺寸和按钮2进行重复操作。可以使用比我定义的更小或更大的屏幕尺寸。

或者可以使用jQuery处理:

jQuery(document).ready(function ($) {

window.onresize = function () {
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
        $("#button1").width(($(window).width()) / (3));
        $("#button1").height(($(window).height()) / (3));
        $("#button2").width(($(window).width()) / (3));
        $("#button2").height(($(window).height()) / (3));
    }
    else {
        $("#button1").width(($(window).width()) / (1.5));
        $("#button1").height(($(window).height()) / (1.5));
        $("#button2").width(($(window).width()) / (1.5));
        $("#button2").height(($(window).height()) / (1.5));
    }
});

无论如何都是这样。包括电话方面的内容,以防您正在寻找这方面的信息...


嗨,这不是Web应用程序,而是Windows应用程序。 - senthilkumar2185
1
在这种情况下,我可能会阅读:http://social.msdn.microsoft.com/Forums/en-US/bfb15fd0-533a-47b8-af07-472310002f26/c-winforms-resizing-forms?forum=csharplanguage。或者尝试设置WindowState = WindowState.Maximized并锚定按钮以确保它们与边缘保持距离。 - user3685738
2
你应该更新你的回答并发布一些与WinForm相关的代码和建议,否则你可能会被踩。 - Shell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接