领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

不同屏幕分辨率下Winform 主界面处理

nixiaole 2025-04-08 17:10:43 知识剖析 7 ℃

在基于Winform(C#)开发桌面上位机程序过程中,总会碰到一个问题,如果在不同的电脑,不同的屏幕分辨率下,主界面的控件该如何显示?

实际上这个是一个系列问题,今天主要针对其中一种方案进行介绍:

当屏幕分辨率比较高时,主界面放大处理(不着重介绍)。

当屏幕分辨率比较低时,主界面的长宽有最小阈值,如果小于最小阈值,那么就会对滚动条的方式,部分显示。当然,这个最小阈值要设置合理,比如设置为1360*768的屏幕分辨率,大部分电脑是支持这样的分辨率的,只有一小部分电脑低于该阈值,这样,就极大的提高了用户使用体验。

首先,在程序启动时,需要检测该电脑的电脑分辨率,利用以下方式:

private bool check_screen_dpi(int width, int height)
{
  bool status = false;
  System.Drawing.Rectangle screen_work = Screen.GetWorkingArea(this);
  if ((screen_work.Width >= width) && (screen_work.Height >= height))
  {
  status = true;
  }
  return status;
}

上面的代码解决了主界面的的宽度和高度,那么该如何显示滚动条?

我们可以利用Panel控件来实现这个功能,将Panel的大小设置为主界面的大小,然后将其他所有控件放置于该Panel之上,我们称呼该Panel为 MainPanel。然后设置该Form的属性,AutoScroll = true。MainPanel的最小Size设置为想要的最小显示范围。注意Anchor属性要设置Top以及Left。

this.MainPanel.Controls.Add(this.MainSpliter);//将所有控件设置到MainPanel之上
this.MainPanel.Location = new System.Drawing.Point(0, 23);
this.MainPanel.MinimumSize = new System.Drawing.Size(1234, 556);
this.MainPanel.Name = "MainPanel";
this.MainPanel.Size = new System.Drawing.Size(1234, 556);
this.MainPanel.TabIndex = 9;

这样,当屏幕分辨率比较小时,主界面的控件,将通过滚动条来全部展示。但是这样同步会引入一个问题,当屏幕分辨率比较大时,主界面的控件不会同步放大,因为所有控件都放入了MainPanel上,MainPanel的大小是固定的。这个该怎么解决呢?

MainPanel有个属性为Anchor,如果Anchor属性设置为TOP BOTTOM Left Right时,mainPanel会随着主界面的大小变化。因此,我们需要实现,当屏幕分辨率小时,mainPanel的大小不随主界面变化;当屏幕分辨率比较大时,MainPanel的大小要随着主界面变化。见下面代码:(在Form的SizeChanged事件中加入如下代码即可)

private void Form_SizeChanged(object sender, EventArgs e)
{
  if ((this.Width >= 1250) && (this.Height >= 650))
  {
    //主界面宽和高均大于MainPanel的最小值
    MainPanel.Width = this.Width - 16;
    MainPanel.Height = this.Height - IICComToolMenu.Height - IICComStatusStrip.Height - 41;
    MainPanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
  }
  else if ((this.Width >= 1275) && (this.Height < 650))
  {
    //主界面的宽大于MainPanel的最小值,注意需要考虑Scroll Height侧的宽度,假定为25
    MainPanel.Width = this.Width - 16 - 25;
    MainPanel.Height = this.Height - IICComToolMenu.Height - IICComStatusStrip.Height - 41;
    MainPanel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
  }
  else if ((this.Width < 1250 this.height>= 675))
  {
    //主界面的高大于MainPanel的最小值,注意需要考虑Scroll Width侧的宽度,假定为25
    MainPanel.Width = this.Width - 16;
    MainPanel.Height = this.Height - IICComToolMenu.Height - IICComStatusStrip.Height - 41-25;
    MainPanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left ;
  }
  else
  {
    //主界面宽和高均小于MainPanel的最小值
    MainPanel.Width = 1234;
    MainPanel.Height = 556;
    MainPanel.Anchor = AnchorStyles.Top | AnchorStyles.Left;
  }
}

通过上述操作即可,实现本文的目的,当屏幕分辨率小时,就用滚动条来显示全部控件,如果屏幕分辨率大时,控件按照比例进行放大显示。

另外,还有一个问题,就是当屏幕分辨比较小时,如果你有菜单栏,通过点击菜单栏来调用另外一个子窗口,当该子窗口关闭时。主界面显示位置有时会移动,有时不会移动。这个问题比较简单,主要是焦点聚焦的问题。

当调用子窗口关闭之后,主窗口的焦点会回到最后保存的焦点位置。而滚动条的移动以及菜单栏,工具栏的点击是不修改焦点位置的。因此在调用子窗口并且存在屏幕分辨率小的情况,需要在调用子窗口,子窗口关闭之后,规定主窗口的焦点,比如将焦点设置为调用子窗口时可能会存在的主界面控件上。如:

this.ActiveControl = ConnectButton;//该Button控件在菜单栏下方,如果要点击菜单栏,该控件必然会出现在界面上。

至此,关于屏幕分辨率比较小的情况得到了很好的改善。

Tags:

最近发表
标签列表