ビジュアルスタイルが有効かどうか(かわりに質問)

解決


とおりすがらない  2005-05-24 02:36:26  No: 14978

「解決する必要がなくなった」というオチで、終了してしまった(?)ので、かわりに質問します。
以前から、ちょっと気になっていた部分なんですが、ついでということで。。。

当方D5ユーザーなのですが、XPスタイルに対応したコンポーネントを作りました。
UxTheme.h やらを変換したヘッダーを自力(他力も多いけど)で用意し、ビジュアルスタイルで表示できるようになりました。

なお、XPスタイル未対応アプリケーションでも、〜.exe.manifest のファイルを用意するだけで、そこそこXPスタイルで表示してくれます。
このmanifestを取り込んでコンパイルすることで、manifestファイルがあるように動作します(D6とかD7あたりで対応?)。

では、manifestファイルによるビジュアルスタイル化なのか、アプリケーション自身が、ビジュアルスタイルスタイル対応なのかということを知りたくて、
UxTheme.dllからインポートしたIsAppThemedを使ってみました。
ですが、manifestファイルのない非ビジュアルスタイル対応アプリケーションでもIsAppThemed=True と返ってきてしまうんです。
おかげで、ビジュアルスタイル非対応アプリでも、ビジュアルスタイルで表示されてしまうコンポーネントになってしまいました。

確かに、TMemoのスクロールバーとかは、ビジュアルスタイルになるのですが、TButtonは以前のスタイルで表示されています。
スクロールバーぐらいなら、バランスは悪くないのですが、それ以外の部分でビジュアルスタイル表示しているのは、かっこわるいです。

アプリケーションがビジュアルスタイル非対応の場合、TButtonのようにmanifestファイルあるときのみ、ビジュアルスタイル表示したい。
ただそれだけだと思っていたのですが、どうにもならない orz

アプリ自身をビジュアルスタイル対応にすれば問題ないんですが、D5の場合TListViewのReport表示でエラーがでまくりという不具合があって、非対応にせざるを得ないこともあります。

IsAppThemedあたりでググっても、解決できるようなものはありませんでした(半年前だけど)。
それで、すっかりあきらめて、長い間記憶の片隅に片づけておいたのですが、コレを機に引っ張り出してみました。
「D6とかD7とか2005あたりにバージョンアップしろ」という方法以外の解決方法があればなぁ。。。と。


とおりすがらない  2005-05-24 02:38:03  No: 14979

ありゃ、書いてる途中で本スレ(?)に・・・。
ちょっと試してみよう。


とおりすがらない  2005-05-24 02:45:56  No: 14980

あきません。
ソース見たら同じように

 Result := IsAppThemed and IsThemeActive;

とやってました。


とおりすがらない  2005-05-24 02:49:21  No: 14981

http://www.delphi-gems.com/ThemeManager.php
> の ThemeManagerをインストールしてください。
それよりも、これをもっと早く知っていたら、自力でがんばることもなかっ
たということのほうが、ショック大 orz


あれ?  2005-05-24 02:59:50  No: 14982

それものすごく有名ですけど。特に D6Per ユーザには。


とおりすがらない  2005-05-24 03:26:13  No: 14983

有名なのはナニ?
ThemeManager.phpのコト?
それとも、IsAppThemedのこと?

それだけでは、わからないデス、はぃ。


kkk  2005-05-24 11:44:25  No: 14984

UxThemeのUseThemesは現在のOSがテーマ対応となっているかクラシックモードかを表していますのでAppそのもが対応しているかどうかの判断としては使用できません。

Appがテーマ対応になっているかを判断するには
Delphi7の場合は uses Themes,...
delphi-gemの ThemeManager の場合は uses ThemeSrv,...
の様に usesに追加します。

ThemeServices.ThemesEnabled を参照してください。
TrueでそのAppはテーマ適用状態です。
manifestファイルがなくリソースにもmanifestがない場合はFalseとなります。


kkk  2005-05-24 18:10:42  No: 14985

その後もっと簡単な方法はないか探してみました。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnwxp/htm/xptheming.asp
によるとComCtl32.dll のバージョン 6以上かどうかでチェックできそうです。

uses ComCtrls,....;

function IsThemesEnabled: Boolean;
begin
  Result := GetComCtlVersion >= $00060000;
end;

単にmanifestが適用されているかのチェックはこれでも良いのではないでしょうか。


とおりすがらない  2005-05-24 19:20:44  No: 14986

> delphi-gemの ThemeManager の場合は uses ThemeSrv,...
> の様に usesに追加します。

> ThemeServices.ThemesEnabled を参照してください。
これを見て調査してたところ、解決できたので書こうかと思ったら、すでに追加されておりました(^^ゞ
kkkさんありがとうございます。

kkkさんのレスにあるとおり、GetComCtlVersionを調べることでいいようです。
まさかバージョンを調べるなんて思いもよらないMSらしいワザです(と言ってみる)

なお、うちのXP環境では、manifestなしで以下の値が返ってきました。
GetComCtlVersion = $000500052 > ComCtlVersionIE5($000500050)
「IE6 = ComCtl32のバージョン6」だと思っていたのに、クラシックスタイルは旧バージョンで表示しているだけということですね。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnwxp/htm/xptheming.asp
ここも知っていたのですが、日本語にもかかわらずほとんど読み飛ばしていたのがよくなかったようです。

ちなみに、D6とかD7あたりなら、ComCtrls.pasユニットにComCtlVersionIE6の定数が用意されているのかな?


kkk  2005-05-25 03:44:51  No: 14987

>ちなみに、D6とかD7あたりなら、ComCtrls.pasユニットにComCtlVersionIE6の定数が用意されているのかな?
調べてみました

const
  ComCtlVersionIE3 = $00040046;
  ComCtlVersionIE4 = $00040047;
  ComCtlVersionIE401 = $00040048;
  ComCtlVersionIE5 = $00050050;
// Delphi6はここまで
// ここからDelphi7/Delphi2005
  ComCtlVersionIE501 = $00050051;
  ComCtlVersionIE6 = $00060000;

が ComCtrls.pasに定義されていました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加