2009-10-02 111 views
0

如果您在Windows 7上將Google Chrome 3.0.195.21調整爲非常小的寬度(我還沒有嘗試過其他版本),則窗口按鈕會懸掛在窗口上。奇怪的窗口繪畫

窗口大小沒有擴展,並且突出端不響應鼠標。

窗口的縮略圖預覽僅顯示窗口內的按鈕部分; Aero Peek預覽顯示所有按鈕。

突出顯示在Spy ++中(據我所知)。

這是怎麼做的?

我該怎麼做這樣的事情? (我寫C#,但也會採用C++的答案)

編輯:如果不清楚,我問我怎麼能在我自己的程序中做出這樣的懸而未決。

+0

這是編程相關的。如果問題不清楚,我會問如何做出這樣的懸念。 – SLaks 2009-10-02 01:05:39

+2

有人得說出來:你爲什麼要這樣?我寧願看到一個窗口限制其最小寬度,所以這不會發生在第一位。 – MusiGenesis 2009-10-02 01:13:06

+0

顯然不適用於窗口按鈕,但它可能對狀態指示器等有用。另外,我很好奇。 – SLaks 2009-10-02 02:25:12

回答

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中,也不需要覆蓋後面的消息)。

+0

這不回答我的問題。我不問如何製作一個非常小的窗口;我在問如何做出懸崖。 – SLaks 2010-01-04 14:19:52

+0

對我來說,這看起來像一個錯誤 - 當窗口對於按鈕來說太小時,它們會懸垂......你是否試圖實現這一點,並看到按鈕被裁剪? – MaxVT 2010-01-05 07:43:43