如何像 Windows 11 一样自定义 WinForms 标题栏 [已关闭]

How to customize WinForms title bar like Windows 11 [closed]

提问人:Mateusz Zawojski 提问时间:11/14/2023 最后编辑:Mateusz Zawojski 更新时间:11/17/2023 访问量:78

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

5天前关闭。

这篇文章在 5 天前被编辑并提交审核,未能重新打开帖子:

原始关闭原因未解决

我想在 C# Windows 窗体中自定义标题栏。

我需要做的是:

  • 当应用程序框架像 Windows 11 一样接触屏幕边缘时展开应用程序窗口。
  • 使用 C# Windows 窗体像 Windows 11 一样应用(对齐布局/组)

我需要使 Windows 窗体主布局屏幕像 Windows 11 屏幕一样灵活(当它触及屏幕边缘时展开,当我使用鼠标悬停缩放按钮时显示对齐布局/组)。

如何一步一步地做出上述解决方案?

这是效果,我谈到了。

C# Windows WinForms

评论

0赞 Ralf 11/14/2023
这里的具体问题是什么?如果您希望窗口内置的所有功能都不使用它们,那么您需要重新编程所有内容。
0赞 Dai 11/14/2023
搜索“非客户端渲染” - 还要注意,自定义非客户端区域渲染很少能在多个 WIndows 版本中很好地工作。
0赞 IV. 11/14/2023
我想我明白你在这里问什么。如果我的答案看起来很合适,请告诉我,我可以帮助您编辑问题以使其更清晰。如果我离得很远并且答案没有帮助,也请告诉我,这样我就可以删除它。
0赞 ali 11/15/2023
如果需要在应用程序框架接触屏幕边缘和/或应用对齐(布局/组)时展开应用程序窗口,则可以按照此问题进行操作,也可以使用此链接按照 Microsoft 的自定义标题栏说明进行操作。

答:

1赞 IV. 11/14/2023 #1

据我了解,您希望检测应用程序框架何时接触屏幕边缘,以便显示(或更改)您正在设计的“自定义标题栏”的外观。如果要拖动主窗体,则可以在属性的边界矩形不再完全包含在当前屏幕中时触发属性。bool

hitting the edge

public partial class MainForm : Form
{
    public MainForm() =>InitializeComponent();
    public bool IsLeavingScreenBounds
    {
        get => _isLeavingScreenBounds;
        set
        {
            if (!Equals(_isLeavingScreenBounds, value))
            {
                _isLeavingScreenBounds = value;
                if (IsLeavingScreenBounds)
                {
                    MessageBox.Show("Hit the edge!");
                }
            }
        }
    }
    bool _isLeavingScreenBounds = false;

    protected override void OnMove(EventArgs e)
    {
        base.OnMove(e);
        var currentScreen = Screen.FromControl(this);
        IsLeavingScreenBounds = !currentScreen.WorkingArea.Contains(Bounds);
    }
}