奇怪的窗口绘画

时间:2009-10-02 01:01:05

标签: c# window paint

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

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

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

在Spy ++中没有出现过剩(据我所知)。

这是怎么做到的?

我该怎么办? (我写C#,但也会接受C ++答案)

编辑:如果不清楚,我问我怎样才能在自己的程序中出现这样的问题。

1 个答案:

答案 0 :(得分:2)

在桌面上调整窗口大小时,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中,并且不需要覆盖后面的消息)。