可以通过在运行时添加应用程序清单来执行运行时可选的切换**运行时主题**吗?

时间:2012-04-09 14:35:42

标签: delphi themes manifest

  

可能重复:
  How to switch an Application between Themed and not Themed at run-time?

我创建了一个GUI应用程序,运行时主题选项设置为 not enabled ,并且需要在App初始化期间手动启用嵌入式Manifest的选项。

问题:

VCL是否允许扩展点实现?

让我解释一下:

  • 自定义清单作为字符串常量嵌入到二进制文件中。
  • 使用命令行参数开关启用运行时主题,例如:MyApp.exe -themeOn

我已经深入研究了Forms.TApplication,希望找到一个句柄,但没有发现任何有意义的指向方向。

1 个答案:

答案 0 :(得分:4)

我会以相反的方式做到这一点。我将通过在项目设置中启用运行时主题来包含标准的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.

您需要确保{。{1}}在.dpr uses子句中,或者更好地将该函数移动到其自己的专用单元。

将清单包含在正常情况下会更容易,然后禁用运行时主题。启用运行时主题的替代方法涉及激活上下文,这种方法比这种方法更为复杂。


说过这比使用激活上下文更容易,我决定看看它涉及到什么。这就是我想出的:

UxTheme

您应该尽早在.dpr文件中包含此单元。任何内存管理器之后,但在任何RTL / VCL单元之前。在项目设置中将运行时主题设置为。您可能希望将清单文件作为资源包含在内,但为了方便起见,我已将其作为文件完成。