【问题标题】:C# - Create a styled winforms like in Windows 7C# - 像在 Windows 7 中一样创建样式化的 winforms
【发布时间】:2012-09-03 09:15:13
【问题描述】:

我想创建一个这样的winform:

我已经完成了following other question 的视觉效果(如图所示)。但我不能禁止调整表格的大小,因为要有边框,它必须是“Sizeable”。有人建议将最小尺寸和最大尺寸值设置为等于当前表单尺寸。这解决了部分问题,但是当鼠标悬停在边框上时,它仍然显示双端箭头,表明表单是可调整大小的。有什么方法可以禁用此光标更改?我的目标是模仿 Windows 7 中的原始系统托盘弹出窗口,例如网络、声音等。

谢谢!

【问题讨论】:

    标签: c# winforms customization system-tray


    【解决方案1】:

    示例代码:

    private const int WM_NCHITTEST = 0x84;
    private const int HTCLIENT = 0x1;
    
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCHITTEST:
                m.Result = (IntPtr)HTCLIENT;
                return;
        }
        base.WndProc(ref m);
    }
    

    这样,当光标悬停在边框上时,指针不会改变,因为它被视为在表单内部,达到了预期的效果。

    【讨论】:

      【解决方案2】:

      将消息处理程序添加到您的表单并处理 WM_NCHITTEST。原件返回HTSIZE(等)时,返回HTNONE或HTCAPTION。

      this question 之类的内容应该可以帮助您入门。

      解释一下:

      当 Windows 想知道您的窗口使用哪个光标时,它首先会向您发送一条WM_NCHITTEST 消息(非客户端命中测试)。此消息由WndProc 方法处理。您的窗口应该返回HT* 代码之一,以告诉Windows 鼠标在窗口的哪个部分。例如,为标题区域返回HTCAPTION,为客户区域返回HTCLIENT,或为左下角调整大小返回HTSIZENESW。默认消息处理程序(调用base.WndProc)为标准窗口处理此问题。

      我们没有标准窗口。

      我们在这里尝试做的是询问原始窗口鼠标在哪里。如果它返回任何HTSIZE* 值,我们想用HTNONE(无操作)或HTCLIENT(如果您希望光标被视为在窗口内——可能不是这个)替换该返回值) 或HTCAPTION(如果您希望能够拖动窗口的边缘 -- 可能会有用)。

      【讨论】:

      • 我更改了您给我的示例(而不是 HTCLIENT,我输入了 HTSIZE (0x4)),但光标仍然发生变化。抱歉,我是 WndProc 的新手,我不确定自己在做什么。如果可能的话,你能提供一些这个案例的例子吗?
      • 谢谢,经过一番研究,效果很好。有关常量,请参见此处:msdn.microsoft.com/en-us/library/windows/desktop/…
      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2016-10-25
      相关资源
      最近更新 更多