簡體   English   中英

如何將Form Border更改為Windows Basic而不是Aero Style?

[英]How to change Form Border to Windows Basic instead of Aero Style?

我想知道是否可能,如果可以,如何將表單邊框樣式更改為Windows Basic而不是Aero主題? 顯然,首先考慮Aero是否啟用,如果不啟用,則無需嘗試更改邊框樣式。

所以代替:

在此輸入圖像描述

我們會:(模擬圖像)

在此輸入圖像描述

MDI應用程序已經為子表單執行此操作,但我不想要或不需要MDI應用程序。 我試着查看Vcl.Forms的來源,看看我是否能找到任何相關但我無法 - 我可能是錯的但我實際上認為繪制MDI表單的方式是由Windows而不是Delphi決定的。

DSiWin32包含一些與Aero相關的功能,例如確定Aero是否已啟用,以及能夠啟用和禁用Aero - 但這似乎是系統范圍的更改,而不是每個窗體/窗口基礎,它也導致屏幕延遲,而主題改變,這是不好的。

我不確定在這一點上去哪里。 我可能忽略了一些簡單的事情嗎? 我們是否需要創建和覆蓋我們自己的TForm以及一些特定的標志等來實現這一點,或者可能有一種方法可以在任何時候改變表單樣式,例如為表單啟用/禁用Aero?

簡單地說,我想知道是否可以不使用MDI應用程序,我們是否可以將任何窗體/窗口邊框更改為Windows Basic主題,只要首先啟用Aero?

調用DwmSetWindowAttribute傳遞DWMWA_NCRENDERING_POLICY屬性,其值為DWMNCRP_DISABLED

type
  TForm1 = class(TForm)
  protected
    procedure CreateWnd; override;
  end;

procedure TForm1.CreateWnd;
var
  Policy: Integer;
begin
  inherited;
  Policy := DWMNCRP_DISABLED;
  DwmSetWindowAttribute(WindowHandle, DWMWA_NCRENDERING_POLICY, @Policy, 
    SizeOf(Policy));
end;

我在這里忽略了錯誤檢查。 您可以確定響應錯誤是值得的。 我也沒有做任何測試操作系統是否支持這個函數調用,但如果你需要支持XP,你也可以選擇這樣做。

請注意, CreateWnd是調用DwmSetWindowAttribute的正確位置。 窗口句柄是在CreateWnd創建的,我們希望盡快應用此策略。 將代碼放在CreateWnd也可以使其在重新創建時更加強大。

普通航空表格:

在此輸入圖像描述

調用DwmSetWindowAttribute

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM