如果您在 Windows 7 上将 Google Chrome 3.0.195.21 的大小调整为非常小的宽度(我没有尝试过其他版本),窗口按钮会挂在窗口外。
窗口大小未扩展,悬垂不响应鼠标。
窗口的缩略图预览仅显示窗口内的部分按钮;Aero Peek 预览显示所有按钮。
Spy++ 中没有出现悬垂(据我所知)。
这是怎么做的?
我怎么能做这样的事情?(我写 C#,但也会接受 C++ 的答案)
编辑:如果不清楚,我在问如何在我自己的程序中做出这样的突出。
在桌面上调整窗口大小时,Windows 依靠 WM_GETMINMAXINFO 消息来获取大小限制,以便窗口保持可用 - 根据Microsoft 指南,
[可调整大小的窗口] 如果有一个大小低于内容不再可用的大小,则应设置最小窗口大小。对于可调整大小的控件,将可调整大小的最小元素大小设置为其最小的功能大小,例如列表视图中的最小功能列宽度。
默认情况下,Windows 对高度施加标题栏高度的约束,对宽度施加大约 100 像素(最小/最大/关闭按钮 + 名称的几个字母)。要删除该约束,您应该自己处理 WM_GETMAXINFO 消息并将最小大小更改为必要的大小。
C#代码的一个例子可以从这里改编:
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);
}
并且(在研究这个时)我发现了另一个处理相同问题的SO question 。显然,您也需要重写WM_WINDOWPOSCHANGING
才能使其在 Vista 和/或 C# 中工作。(我见过的另一个例子是在 Delphi 中,也不需要覆盖后一条消息)。