「解決する必要がなくなった」というオチで、終了してしまった(?)ので、かわりに質問します。
以前から、ちょっと気になっていた部分なんですが、ついでということで。。。
当方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あたりにバージョンアップしろ」という方法以外の解決方法があればなぁ。。。と。
ありゃ、書いてる途中で本スレ(?)に・・・。
ちょっと試してみよう。
あきません。
ソース見たら同じように
Result := IsAppThemed and IsThemeActive;
とやってました。
> http://www.delphi-gems.com/ThemeManager.php
> の ThemeManagerをインストールしてください。
それよりも、これをもっと早く知っていたら、自力でがんばることもなかっ
たということのほうが、ショック大 orz
それものすごく有名ですけど。特に D6Per ユーザには。
有名なのはナニ?
ThemeManager.phpのコト?
それとも、IsAppThemedのこと?
それだけでは、わからないデス、はぃ。
UxThemeのUseThemesは現在のOSがテーマ対応となっているかクラシックモードかを表していますのでAppそのもが対応しているかどうかの判断としては使用できません。
Appがテーマ対応になっているかを判断するには
Delphi7の場合は uses Themes,...
delphi-gemの ThemeManager の場合は uses ThemeSrv,...
の様に usesに追加します。
ThemeServices.ThemesEnabled を参照してください。
TrueでそのAppはテーマ適用状態です。
manifestファイルがなくリソースにもmanifestがない場合はFalseとなります。
その後もっと簡単な方法はないか探してみました。
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が適用されているかのチェックはこれでも良いのではないでしょうか。
> 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の定数が用意されているのかな?
>ちなみに、D6とかD7あたりなら、ComCtrls.pasユニットにComCtlVersionIE6の定数が用意されているのかな?
調べてみました
const
ComCtlVersionIE3 = $00040046;
ComCtlVersionIE4 = $00040047;
ComCtlVersionIE401 = $00040048;
ComCtlVersionIE5 = $00050050;
// Delphi6はここまで
// ここからDelphi7/Delphi2005
ComCtlVersionIE501 = $00050051;
ComCtlVersionIE6 = $00060000;
が ComCtrls.pasに定義されていました。
ツイート | ![]() |