我會這樣做的另一種方式。我會通過在項目設置中啓用運行時主題來包含標準的comctl v6清單。然後,我會在啓動時從.dpr文件中調用SetThemeAppProperties
,以根據需要禁用運行時主題。
procedure DisableRuntimeThemes;
begin
InitThemeLibrary;
if Assigned(SetThemeAppProperties) then
SetThemeAppProperties(STAP_ALLOW_NONCLIENT);
end;
begin
if not FindCmdLineSwitch('themeOn') then
DisableRuntimeThemes;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
你需要確保UxTheme
在.dpr使用條款,甚至更好的移動,其功能是其自己的專用單元。
正常情況下包含清單,然後禁用運行時主題會更容易。啓用運行時主題的替代方法涉及激活上下文,這種方法比這種方法更爲複雜。
說到這比使用激活情況下,我決定去看看是什麼參與在更容易。這裏是我想出的:
unit ActivateRuntimeThemes;
interface
implementation
uses
Windows, SysUtils;
type
TActivationContext = class
private
FActCtxHandle: THandle;
FCreateActCtx: function(var pActCtx: TActCtx): THandle; stdcall;
FActivateActCtx: function(hActCtx: THandle; var lpCookie: LongWord): BOOL; stdcall;
FDeactivateActCtx: function(dwFlags: DWORD; ulCookie: LongWord): BOOL; stdcall;
FReleaseActCtx: procedure(hActCtx: THandle); stdcall;
FCookie: LongWord;
FSucceeded: Boolean;
public
constructor Create;
destructor Destroy; override;
end;
constructor TActivationContext.Create;
var
ActCtx: TActCtx;
hKernel32: HMODULE;
begin
inherited;
hKernel32 := GetModuleHandle(kernel32);
FCreateActCtx := GetProcAddress(hKernel32, 'CreateActCtxW');
if Assigned(FCreateActCtx) then
begin
FReleaseActCtx := GetProcAddress(hKernel32, 'ReleaseActCtx');
FActivateActCtx := GetProcAddress(hKernel32, 'ActivateActCtx');
FDeactivateActCtx := GetProcAddress(hKernel32, 'DeactivateActCtx');
ZeroMemory(@ActCtx, SizeOf(ActCtx));
ActCtx.cbSize := SizeOf(ActCtx);
ActCtx.lpSource := 'C:\desktop\comctlv6.manifest.txt';
FActCtxHandle := FCreateActCtx(ActCtx);
FSucceeded := (FActCtxHandle<>INVALID_HANDLE_VALUE) and FActivateActCtx(FActCtxHandle, FCookie);
end
else
FActCtxHandle := INVALID_HANDLE_VALUE;
end;
destructor TActivationContext.Destroy;
begin
if FSucceeded then
FDeactivateActCtx(0, FCookie);
if FActCtxHandle<>INVALID_HANDLE_VALUE then
FReleaseActCtx(FActCtxHandle);
inherited;
end;
var
ActivationContext: TActivationContext;
procedure FinaliseActivationContext;
begin
ActivationContext.Free;
end;
initialization
if FindCmdLineSwitch('themeOn') then
ActivationContext := TActivationContext.Create;
finalization
ActivationContext.Free;
end.
你應該儘早在你的.dpr文件中包含這個單元。在任何內存管理器之後,但在任何RTL/VCL單元之前。在項目設置中將運行時主題設置爲無。您可能希望將清單文件包含爲資源,但爲了方便起見,我已將其作爲文件完成。
試試這個問題[如何在運行時切換應用程序之間的主題和非主題?](http://stackoverflow.com/questions/4393723/how-to-switch-an-application-between-themed-而不是主題在運行時) – RRUZ 2012-04-09 14:51:19
@RRUZ:謝謝你指出它。 – menjaraz 2012-04-09 15:06:32
它不會是一個確切的重複的唯一原因是因爲這個問題規定你想做一些愚蠢的事情(不包括清單)。艾爾戈,這是一個騙局。 – 2012-04-09 18:21:23