如何使用c#和WinForm创建一个1像素宽的窗口
本文关键字:一个 1像素 窗口 何使用 WinForm 创建 | 更新日期: 2023-09-27 18:16:45
我想创建一个应用程序,有一个小窗口显示在桌面的底部角落。在启动时,窗口应该非常小,理想情况下,宽度只有几个像素。
下面是我用来做这件事的代码:
public partial class DurationT64 : Form
{
private Size fullSize;
private Point fullPos;
private Point compactPos;
public DurationT64()
{
InitializeComponent();
var workingArea = Screen.PrimaryScreen.WorkingArea;
this.MinimumSize = new Size(0, this.Height);
this.MaximumSize = new Size(this.Width, this.Height);
// fullPos: the window location when it is in full size form.
fullPos = new Point(workingArea.Right - this.Width, workingArea.Bottom - this.Height);
this.Location = fullPos;
// fullSize: the size of the windown when it is in full size form.
fullSize = new Size(this.Width, this.Height);
this.Size = fullSize;
// compactPos: the window location when it is in compact size form.
compactPos = new Point(workingArea.Right - 30, fullPos.Y);
this.Width = 1;
this.Location = compactPos;
}
}
正如您在本例中看到的,我打算创建一个宽度仅为1像素的窗口,靠近主显示器的右边缘。
然而,我意识到窗口并不像我预期的那么小。它的宽度下降到20像素,但不会小于这个。请参考下面的屏幕截图:图片显示窗口比预期的要宽
我对这个问题做了一些研究,并注意到扎克·约翰逊(@zach-johnson)早在2009年就提出了一个解决方案。克服操作系统强加的Windows最小尺寸限制。
然而,该链接中提出的两种方法(Zach提出的拦截WM_消息和@Ace提出的SetBoundsCore)都适用于我。
谁能给我一些解决这个问题的方法?最好是一个纯粹基于c#/Winform的解决方案,如果可能的话,不依赖于本地Win32窗口消息循环。多谢!
这是相当直接的,Winforms确保窗口不能小于系统规定的最小窗口大小,暴露为SystemInformation。MinWindowTrackSize属性。这是一个"安全"设置,它确保用户在调整窗口大小时不会使窗口太小,从而失去对它的控制。同样的考虑也适用于代码
绕过这个限制不需要魔法,您需要做两件事:
- 设置FormBorderStyle属性为None,这样用户就不能调整窗口的大小。
- 在创建窗口后设置的大小。Load事件是最好的。
关于你现有代码的一些注释:小心修改Width/Height/Size属性,你在构造函数中做了太多,它不能正常工作。在构造函数中,它们还不匹配窗口的实际大小。在具有高分辨率显示器的现代机器上,自动缩放以匹配视频适配器的DPI在今天很重要。您必须推迟,直到创建窗口并完成缩放,Load事件是执行此类代码的合适位置。使用Load.
的少数几个原因之一并且注意你的Location属性计算是不充分的,它没有考虑任务栏的位置。在我的机器上不能用,我喜欢右边的任务栏。
最低再生产:public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
}
protected override void OnLoad(EventArgs e) {
this.Width = 1;
base.OnLoad(e);
}
}
请记住,你需要鹰眼才能在屏幕上找到它:)