RichEditにビジュアルスタイルを適用させるには

[戻る]
Monoliss 2010/01/24(日) 19:00:40
Windows XP SP3、 Visual Studio 2008 SDK

manifestファイルを適用させてビジュアルスタイルにしているのですが、RichEditにビ
ジュアルスタイルが適用されない問題に困り、質問させていただきました。
(EDITやBUTTONなどは適用されるのですがRichEditだけが適用されません)

RichEditにビジュアルスタイルを適用させる方法などありましたら、ご教授いただける
と助かります。宜しくお願い致します。

■ソース
case WM_CREATE:
    hRtLib = LoadLibrary(_T("RICHED20.DLL"));

    hEdit = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            _T("RICHEDIT20A"),
            _T(""),
            WS_CHILD | WS_VISIBLE | ES_MULTILINE,
            0,
            0,
            300,
            200,
            hWnd, (HMENU)100, hInst, NULL);
    break;

■プロジェクトに以下のマニフェストファイルを追加しております。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="TestVisualStyle.exe"
    type="win32"
/>
<description>TestVisualStyle.exe</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

gak 2010/01/25(月) 17:11:45
http://www.codeguru.com/cpp/controls/richedit/conversions/article.php/c8729/
"EditBox" の theme data を "RichEdit" に流用(というか自力描画)してソレっぽく見
せる方法が紹介されてる。

> _T("RICHEDIT20A")
ver7.0 が出ようかという昨今、RichEdit の ver2.0 ってまだまともに更新されているの
だろうか?
http://blogs.msdn.com/murrays/archive/2009/09/05/richedit-versions-update-to-7-0.aspx
仮に更新が bugfix 程度のみとかいう状況なら、xp の theme に対応していなくても不思
議では無いし…どうなんだろ?

http://blogs.msdn.com/murrays/archive/2006/10/14/richedit-versions.aspx
最新verの RichEdit だと theme に対応しているだろうと思ったんだが…Ver5.0以降は要
Officeになっているのね。
Office不要の最新はver4.1らしいのでコレを試してみたが、ver2.0 と変わらず。XP、
Vista 両環境において theme は適用されなかった。

PATIO 2010/01/25(月) 17:38:39
マニフェストファイルで指定しているのは、Microsoft.Windows.Common-Controlsの
範疇の話ですから、直接DLLを指定して導入しているRichEditが上記の範疇から
外れているのであれば、ヴィジュアルスタイルが反映されなくても不思議ではない
と思います。

そういう意味ではRichEditの位置付けが他のコントロールとは違う
と言う事では無いでしょうか。

ITO 2010/01/26(火) 10:03:23
うーーん、
gakさんが調べてますね。
前によくあったのですが、RichEditのバージョンが会わないってことはないでしょうか?
WIN9XとWINXP/2000でRichEditのバージョンが違ってましたよね。

aetos 2010/01/26(火) 10:43:22
クラス名を直接書いているのはまずそうですね。
RICHEDIT_CLASS なり MSFTEDIT_CLASS なりを使うべきかと。

Monoliss 2010/01/27(水) 21:00:08
返信が遅くなりましたm(_ _)m
gak様、PATIO 様、ITO様、aetos様、回答ありがとうございます。

> "EditBox" の theme data を "RichEdit" に流用(というか自力描画)してソレっぽ
く見せる方法が紹介されてる。

多くの資料をありがとうございます。参考になります。
このような方法が載っているという事は、やはり通常では難しいようですね;
どうしてもビジュアルスタイルを適用させたい時は、この方法を参考にしたいと思いま
す。


> マニフェストファイルで指定しているのは、Microsoft.Windows.Common-Controlsの
> 範疇の話ですから、直接DLLを指定して導入しているRichEditが上記の範疇から
> 外れているのであれば、ヴィジュアルスタイルが反映されなくても不思議ではないと
思います。

たしかにそのような気がします。
後述するVC#.NETでのRichEditも適用されていなかったので、
RichEditは基本的に範囲外のように思えてきました。


> 前によくあったのですが、RichEditのバージョンが会わないってことはないでしょう
か?
> WIN9XとWINXP/2000でRichEditのバージョンが違ってましたよね。

大変申し訳ないのですが、
まだ自分自身がよく理解しておらず、「バージョンが合わない」という内容が分かりま
せん;
宜しければ、少し補足して頂けると助かりますm(_ _)m


> クラス名を直接書いているのはまずそうですね。
> RICHEDIT_CLASS なり MSFTEDIT_CLASS なりを使うべきかと。

ご指摘ありがとうございます、勉強になります。
次回から気をつけたいと思います。


VC#.NETのFORMアプリケーションにてRichEditを配置し枠をいじったのですがビジュアル
スタイルにはなりませんでした。
やはり、通常の方法では難しいように思えてきました;
また週末に時間が取れれば、皆様から頂いた情報を元に試してみたいと思います。
その結果を以て「解決」とさせて頂くつもりです。
もし何か情報やご意見などありましたら、宜しくお願い致します。

ITO 2010/01/28(木) 09:58:19
> 大変申し訳ないのですが、
> まだ自分自身がよく理解しておらず、「バージョンが合わない」という内容が
> 分かりません;
> 宜しければ、少し補足して頂けると助かりますm(_ _)m
 SDKにも含まれているかも知れませんが、XPまではRichEditは、「RECHEDXX.DLL」
というDLLで扱われていました。
WinXPとWin9XではそのDLLのバージョンが違ってました。
今回Vistaがどういう扱いになっているか分かりませんが
「もし、専用のDLLがあるとすると、バージョンの食い違いの可能性があるかな?」
と思います。

PATIO 2010/01/28(木) 10:13:49
理屈上の話だけで書きますが、

DLL名を指定して使用していると言う事は、
指定したDLLによって利用されるRichEditのバージョンが決まると言うことです。
上位互換があったとしても指定したDLLで提供されている物以降のバージョンに
関してはあずかり知らぬ物となります。
ヴィジュアルスタイルへの対応が指定したライブラリよりも新しい物で
対応されているとすると古いバージョンを指定してた場合、
ヴィジュアルスタイルには対応できない事になると思います。

ヴィジュアルスタイルに適応させるには使用するライブラリを
ヴィジュアルスタイルに適応したバージョンにする必要が有り、
マニフェストファイルではこれを指定する事でヴィジュアルスタイルに
対応させていたと思います。

今回のケースではプログラマがRichEditを利用する為のライブラリを
指定している為にマニフェストファイルで指定しているバージョンとは
連動していない物と思います。
ライブラリを直接指定して利用すると言う事はこの部分を考慮して
適切なライブラリを選択するのはプログラマの責任になると思います。

あと、RichEditコントロールがヴィジュアルスタイルに対応しているのか
と言う問題は別にあるので対応しているバージョンがあるのであれば、
そのバージョンを使う必要があるでしょう。
この辺は詳しくないのでご自分で調べて見てください。

PATIO 2010/01/28(木) 10:14:36
すいません、上位互換ではなくて下位互換ですね。

gak 2010/01/28(木) 17:32:06
> RichEditが上記の範疇から外れている
> RichEditは基本的に範囲外のように思えてきました。
http://www.mombu.com/microsoft/windows-programmer-tools-mfc/t-richedit-and-the-new-xp-visual-styles-1378878.html
Vistaが出る前の古い情報だけど、MSMVPの人も同じ見解を示している。
Office2003のRichEditにはテーマが適用されるという情報も出てる。(「Officeが独自に
対応している可能性があるかも」とMVPの人は回答してる)

http://msdn.microsoft.com/en-us/library/bb787877%28VS.85%29.aspx
逆に、↑の「Note」にはVisual Styleに対応可能な事を示唆する記述があったりする。

もう俺には情報のみからの正誤判断は不可だが、とりあえず情報だけ紹介。

subaru 2010/02/02(火) 10:45:37
>http://msdn.microsoft.com/en-us/library/bb787877%28VS.85%29.aspx
>逆に、↑の「Note」にはVisual Styleに対応可能な事を示唆する記述があったりする。

気になって調べてみましたが、マニフェスト適用してRichEditコントロールを
改行していくと、スクロールバー部分だけはVisual Styleになってましたw
(SetWindowThemeでVisual Style無効化するとスクロールバー部分が無効化されます)

STATICコントロールにWS_EX_CLIENTEDGEスタイルを与えてもコントロールはフラットに
ならないのでそれと同様の扱いなのかもしれません。

Monoliss 2010/02/06(土) 04:40:52
[[解決]]
多忙のため、実験できずに1週間が経ってしまいましたm(_ _)m
ITO様、PATIO様、gak様、subaru様、回答ありがとうございます。

まとめますと、どのDLLのRichEditを使用するかによって
一部ではVisual Styleが適用されるという事ですね。
(自分の環境ではOffice2003のRichEditを確認できなく残念なのですが……)

今回はOfficeの有無に依存できないため
RichEditのバージョン3.0までに対応する事になるのですが、
この場合は、Visual Styleの適用は難しそうです;

現在の結論としては、
自力でVisual Styleのように描画する方法が一番簡単かもしれません;

質問を投稿させて頂いてから日数が経っているため、ここで解決とさせて頂きます。
また時間に余裕が出来ましたら調べたいと思います。
皆様、本当にありがとうございましたm(_ _)m
頂いた情報が非常に参考になりました。
今後もさらに調査したいと思います。

古いスレッドには追加発言できません。