【问题标题】:How can I get a window to look like a frame?我怎样才能让一个窗口看起来像一个框架?
【发布时间】:2013-01-12 01:52:57
【问题描述】:

它应该看起来像当您单击托盘中的操作中心、电源、网络或声音图标时出现的小框。它需要有没有标题栏的玻璃边框。

它还需要是固定大小且不可调整大小。感谢任何能提供帮助的人! :)

【问题讨论】:

  • 谷歌搜索几秒钟应该会给你答案。禁用 Maximise、Minimse 和 Control 框,将标题设置为空字符串并将表单 FormBorderStyle 设置为 Fixed3D
  • 这不会给我一个玻璃般的边框...当我将边框设置为 Sizable 但它必须是固定大小时它确实有效。
  • @FactorMystic 这不是完全重复的。该问题中接受的答案是可调整大小的,这不是 Phoenix 正在寻找的。​​span>
  • 不,但公平地说,两者之间的区别是单个属性...

标签: c# .net windows trayicon window-style


【解决方案1】:

需要将ControlBox设置为false,清除标题文字,设置边框样式。既然你说你想要相当大的边框,但不允许调整它的大小,你也可以设置最小和最大尺寸。最后,为了防止鼠标光标显示调整大小的光标,如果 WM_NCHITTEST 结果位于其中一个边框上,我们将覆盖它们:

private void Form1_Load(object sender, EventArgs e)
{
    this.ControlBox = false;
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
    this.MinimumSize = this.MaximumSize = this.Size; 
    this.Text = "";                
}
const int WM_NCHITTEST = 0x0084;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 16;
const int HTBOTTOMRIGHT = 17;
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTTOP = 12;
const int HTCLIENT = 1;
protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    if (m.Msg == WM_NCHITTEST)
    {
        Console.WriteLine(m.Result.ToString());
        switch (m.Result.ToInt32())
        {
            case HTBOTTOM:
            case HTBOTTOMLEFT:
            case HTBOTTOMRIGHT:
            case HTLEFT:
            case HTRIGHT:
            case HTTOPLEFT:
            case HTTOPRIGHT:
            case HTTOP:
                m.Result =(IntPtr) HTCLIENT;
                break;
        }
    }
}

【讨论】:

  • 它需要看起来像玻璃。我正在尝试匹配 Windows 7 的风格。
  • @PhoenixLogan 我更新了示例。摆脱调整大小的鼠标光标可能需要一些工作,但这应该会给您想要的外观和感觉。
  • 如何摆脱鼠标光标?
  • 没关系。我找到了一个使用 WndProc 覆盖来处理 WM_NCHITTEST 并为所有边框返回 CLIENT 的示例。
  • @PhoenixLogan 我也发现了这一点,并用适合我的解决方案更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2016-11-01
  • 2015-03-21
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多