【问题标题】:Strange Window Painting奇怪的窗户画
【发布时间】:2015-09-22 08:35:02
【问题描述】:

如果您在 Windows 7 上将 Google Chrome 3.0.195.21 的宽度调整为非常小的宽度(我没有尝试过其他版本),窗口按钮会挂在窗口之外。

窗口大小未扩展,悬垂不响应鼠标。

窗口的缩略图预览仅显示窗口内的部分按钮; Aero Peek 预览显示所有按钮。

Spy++ 中没有出现悬垂(据我所知)。

这是怎么做到的?

我怎么能做这样的事情? (我写的是 C#,但也会采用 C++ 的答案)

编辑:如果不清楚,我在问我如何在自己的程序中做出这样的突出。

【问题讨论】:

  • 这是编程相关的。如果问题不清楚,我在问如何制作这样的悬垂。
  • 有人要说:你为什么要这个?我宁愿看到一个窗口限制它的最小宽度,这样一开始就不会发生这种情况。
  • 显然不适用于窗口按钮,但对于状态指示器之类的东西可能很有用。另外,我很好奇。
  • 我不得不从您的帖子中删除图片,因为 ImageShack 已将其删除并替换为广告。请参阅meta.stackexchange.com/q/263771/215468 了解更多信息。如果可能,您最好重新上传它们。谢谢!
  • @Undo:糟糕。我无法轻易找到原始图像。

标签: c# window paint


【解决方案1】:

在桌面上调整窗口大小时,Windows 依靠 WM_GETMINMAXINFO 消息来获取大小限制,以便窗口保持可用 - 按照 Microsoft guidelines

[可调整大小的窗口] 如果窗口大小低于该大小,内容将不再可用。对于可调整大小的控件,将可调整大小的最小元素大小设置为其最小的功能大小,例如列表视图中的最小功能列宽度。

默认情况下,Windows 对高度施加了标题栏高度的约束,宽度约为 100 像素(最小/最大/关闭按钮 + 名称的几个字母)。要删除该约束,您应该自己处理 WM_GETMAXINFO 消息并将最小大小更改为必要的大小。

C#代码示例可改编from here

private const long WM_GETMINMAXINFO = 0x24;

public struct POINTAPI
{
    public int x;
        public int y;
}

public struct MINMAXINFO
{
    public POINTAPI ptReserved; 
    public POINTAPI ptMaxSize; 
    public POINTAPI ptMaxPosition;
    public POINTAPI ptMinTrackSize; 
    public POINTAPI ptMaxTrackSize;
}

protected override void WndProc(ref System.Windows.Forms.Message m )
{
    if (m.Msg == WM_GETMINMAXINFO)
    {
        MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
        mmi.ptMinTrackSize.x = 0;
        mmi.ptMinTrackSize.y = 0;
        System.Runtime.InteropServices.Marshal.StructureToPtr(mmi, m.LParam, true);
    }

    base.WndProc(ref m);
}

而且(在研究这个问题时)我发现another SO question 可以解决同样的问题。显然,您也需要覆盖 WM_WINDOWPOSCHANGING 才能使其在 Vista 和/或 C# 中工作。 (我看到的另一个例子是在 Delphi 中,也不需要覆盖后面的消息)。

【讨论】:

  • 这不能回答我的问题。我不是在问如何制作一个非常小的窗口;我在问如何做一个悬垂。
  • 这对我来说只是一个错误 - 当窗口对于按钮来说太小时,它们会悬垂......您是否尝试实现它并看到按钮被裁剪?
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多