2012-12-05 71 views

回答

5

簡短的回答是否,目前使用Delphi XE2或XE3不可能直接將Vcl樣式應用於非VCL樣式(或創建於VCL應用程序之外的樣式)。

現在很長的答案,技術上可行的VCL樣式適用於這些類型的對話框,但這需要很多工作(相信我是很多工作)。

使用WH_CBT鉤,檢測HCBT_CREATEWND代碼,然後檢查是否類窗口的是#32770(類爲一個對話框)。從這裏可以使用SetWindowLong函數替換窗口過程關鍵與GWL_WNDPROC索引。

這是比較容易的部分,現在,你有你必須遍歷子控件,並再次使用 GWL_WNDPROC指數更換窗口過程由Windows對話框 發送的消息的控制。這可以在Windows對話框(按鈕,syslistview32,Combobox等)中使用的每個控件創建Wrapper類(這是一項艱苦的工作)

這是一個用於syslistview32 windows類的Wrapper類定義的示例。

TListViewWnd = class(TCustomListView) 
    private 
    FNewWndProc : Pointer; 
    FOrgWndProc : Pointer; 
    Fhwnd: THandle; 
    procedure CreateParams(var Params: TCreateParams); override; 
    procedure CreateWnd; override; 
    procedure DestroyWnd; override; 
    procedure WndProc(var Message: TMessage); override; 
    public 
    constructor Create(hwnd: THandle); 
    destructor Destroy;override; 
    end; 

最後,你可以在這條路上

TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook); 

我以前已經完成上述任務的一部分使用現有的VCL樣式爲VCL的的鉤定義的控制,如TListView的,但不尚未完成,因此這類項目需要大量時間。

enter image description here

+0

看起來不錯! (除了自己製作的細節:-) [+1] – TLama

+1

我猜UseLatestCommonDialogs = False是必需的嗎? –

+1

@SertacAkyuz,是的,因爲沒有辦法破解無證的'DirectUIHWND' :( – RRUZ