ダークモード対応のソースを表示
←
ダークモード対応
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
このページは編集や他の操作ができないように保護されています。
このページのソースの閲覧やコピーができます。
==Windows 10 のダークモードに対応するためには?== 現時点 (Windows 10 1809) では、Windows 10 のダークモードに対応するためには UWP アプリケーションである必要があります。 しかし、Windows 10 1809 では explorer.exe がダークモードに対応したことで、Win32 アプリケーションのダークモード対応も徐々に開発されているような気がします。 Windows 10 1809 ではいくつかの非公開 API の存在が確認されており、これらを呼び出すことで Win32 アプリケーションでもダークモードに対応できる可能性が見えてきました。 ==Windows 10 のダークモードの隠し API 研究== 下記は Delphi でダークモードの API を呼び出す実験で作成したソースコード (雑) です。 アプリケーションの起動時に 1 度、AllowDarkModeForApp を呼び出しておけばメインメニューなどは Windows 10 のダークモードの設定の ON・OFF に連動して色が変わるようになりました。 また、AllowDarkModeForWindow を使用すれば TButton や TComboBox などに対してもダークモードを有効にできるらしいのですが、私の環境ではうまく動きませんでした。 <source lang="delphi"> unit DarkModeClasses; interface uses {$IF CompilerVersion > 22.9} Winapi.Windows, System.SysUtils; {$ELSE} Windows, SysUtils; {$IFEND} resourcestring SDllLoadError = '%s をロードできません'; const THEME_LIB = 'uxtheme.dll'; type TShouldAppsUseDarkMode = function: BOOL; cdecl; TAllowDarkModeForWindow = function(hwnd: HWND; allow: BOOL): BOOL; cdecl; TAllowDarkModeForApp = function(allow: BOOL): BOOL; cdecl; TFlushMenuThemes = procedure; cdecl; TRefreshImmersiveColorPolicyState = procedure; cdecl; var FHandle: THandle; FLoaded: Boolean; RefreshImmersiveColorPolicyState: TRefreshImmersiveColorPolicyState; ShouldAppsUseDarkMode: TShouldAppsUseDarkMode; AllowDarkModeForWindow: TAllowDarkModeForWindow; AllowDarkModeForApp: TAllowDarkModeForApp; FlushMenuThemes: TFlushMenuThemes; DarkModeSupported: Boolean; implementation function DarkModeLoadLibrary: Boolean; begin if CheckWin32Version(10) and (TOSVersion.Build >= 17763) then FHandle := LoadLibrary(PChar(THEME_LIB)); Result := FHandle <> 0; if Result then begin @RefreshImmersiveColorPolicyState := GetProcAddress(FHandle, MakeIntResource(104)); @ShouldAppsUseDarkMode := GetProcAddress(FHandle, MakeIntResource(132)); @AllowDarkModeForWindow := GetProcAddress(FHandle, MakeIntResource(133)); @AllowDarkModeForApp := GetProcAddress(FHandle, MakeIntResource(135)); @FlushMenuThemes := GetProcAddress(FHandle, MakeIntResource(136)); if (@RefreshImmersiveColorPolicyState <> nil) and (@ShouldAppsUseDarkMode <> nil) and (@AllowDarkModeForWindow <> nil) and (@AllowDarkModeForApp <> nil) and (@FlushMenuThemes <> nil) then DarkModeSupported := True; end; end; procedure DarkModeFreeLibrary; begin if FHandle <> 0 then FreeLibrary(FHandle); FHandle := 0; end; initialization if not FLoaded then FLoaded := DarkModeLoadLibrary; finalization if FLoaded then DarkModeFreeLibrary; end. </source> ==TButton や TComboBox などをダークモードに対応させるには?== Winapi.UxTheme の SetWindowTheme メソッドを使用してダークモードのテーマを割り当ててやることで、一部のコンポーネントはダークモードに対応させることができるようです。 <source lang="delphi"> SetWindowTheme(Handle, 'DarkMode_Explorer', nil); </source> しかしながら まだ情報が公開されていないこともあって 'DarkMode_Explorer' の部分は謎ですが、例えば TTreeView や TButton ですと 'DarkMode_Explorer'、TComboBox ですと 'DarkMode_CFD'、TListView ですと 'DarkMode_Explorer' か 'DarkMode_ItemsView' でダークモードが適用されるようです。 ==タイトルバーをダークモードに対応させるには?== ウィンドウのタイトルバーをダークモードに対応させるのは簡単で、DwmSetWindowAttribute を FormShow などで呼び出します。 <source lang="delphi"> var LDark: BOOL; begin LDark := True; DwmSetWindowAttribute(Handle, 19, @LDark, SizeOf(LDark)); </source>
ダークモード対応
に戻る。
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク