WinXP+VC7+MFCです。
早速ですが質問させてください。
ダイアログエディタで配置したTreeコントロールは、枠がXPスタイルになるのですが、
CTreeCtrlをCreateして配置したTreeコントロールはXPスタイルになりません。
どのようにすれば動的に生成したTreeコントロールでもXPスタイルになるのでしょう
か?
よろしくお願いします。
XPスタイルが何を指しているかわかりませんが、MSDNに
「拡張ウィンドウ スタイルを使用してツリー ビュー コントロールを作成する場合は、
Create ではなく CreateEx を呼び出します。」
との記述があります。
maruさんレスありがとうございます。
拡張ウィンドウスタイルではなく、
XPのビジュアルスタイル(LUNA)のことです。
CListCtrlやCEditはダイアログエディタで配置しても、
動的にCreateしてもビジュアルスタイルが適用されるのですが、
CTreeCtrlはCreateしても適用されないのです。
ちょっと試してみましたが
コントロール作成時のスタイルに
WS_EX_CLIENTEDGEがないとダメかも。
subaruさんレスありがとうございます。
> WS_EX_CLIENTEDGEがないとダメかも。
試していただいたときに、WS_EX_CLIENTEDGEをつければ適用されましたでしょうか?
こちらの環境では、適用されませんでした。
// ツリーはXPビジュアルスタイルにならない
m_pTree = new CTreeCtrl();
m_pTree->CreateEx(WS_EX_CLIENTEDGE,
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
CRect(0,0,0,0), this, IDC_TREE1);
// リストはXPビジュアルスタイルになる
m_pList = new CListCtrl();
m_pList->CreateEx(WS_EX_CLIENTEDGE,
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
CRect(0,0,0,0), this, IDC_LIST1);
XP+MFCな環境がなくてそこまでは試してませんでした(^^ゞ
CreateExのソースを見る限りCreateしたあとに
ModifyStyleExが適用されるようです。
あとからスタイルビットを適用してもダメだったので
以下のように書き換えてもダメでしょうか?
>m_pTree = new CTreeCtrl();
>m_pTree->CreateEx(WS_EX_CLIENTEDGE,
> WS_CHILD | WS_VISIBLE | WS_TABSTOP,
> CRect(0,0,0,0), this, IDC_TREE1);
m_pTree = new CTreeCtrl();
m_pTree->CWnd::CreateEx(WS_EX_CLIENTEDGE, WC_TREEVIEEW, NULL,
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
CRect(0,0,0,0), this, IDC_TREE1);
すみません、現在は試せないです。
ただ、コンパイルが通りそうにない気がします。。
また、CWnd::CreateEx()は、戻り値がBOOLです。
CWnd::CreateEx()の引数を見ても、
newしたm_pTreeと結び付けられなそうです。
提示しましたコードですが、間違っておりました。
m_pTree = new CTreeCtrl();
↓
m_pTree = new CHogeTreeCtrl();
m_pTreeはCTreeCtrlを継承したCHogeTreeCtrlのポインタです。
申し訳ございません。
えーと、CHogeTreeCtrlがCTreeCtrlから派生したクラスであれば、
CTreeCtrlで使えるメンバー関数は使えるはずですが、本当に使えませんか?
ちなみに
> また、CWnd::CreateEx()は、戻り値がBOOLです。
> CWnd::CreateEx()の引数を見ても、
> newしたm_pTreeと結び付けられなそうです。
この部分の意味が分からないです。
結び付けられ無そうという根拠も分からないし。
戻り値がBOOLである事と、使えないと言う判断の関係も分からない。
CTreeCtrlがCWndから派生しているわけですから
CHogeTreeCtrlも間接的にCWndから派生していると考えて良いはずですよ。
m_pTreeはCTreeCtrlを継承したCHogeTreeCtrlのポインタであっても
なんら問題無いと思いますよ。
subaruさん、PATIOさんありがとうございました。
試したところ、問題なくXPビジュアルスタイルに変えることが出来ました。
大変勉強になりました。
ありがとうございました。
なるほど、ポイントは
> あとからスタイルビットを適用してもダメだったので
だったんですね。CTreeCtrl::CreateEx()はCreateしてからModifyStyleEx()を
よびだすが、CWnd::CreateEx()は拡張スタイルを指定してウィンドウを生成する。
そんなことどこにも書いていないじゃないか! > MSDN
CListCtrlは問題ないとすれば、CTreeCtrlの問題かな?
> だったんですね。CTreeCtrl::CreateEx()はCreateしてからModifyStyleEx()を
> よびだすが、CWnd::CreateEx()は拡張スタイルを指定してウィンドウを生成する。
えーと、これってソースを見て確認したんでしょうか?
CreateExに指定すると言う事はウインドウの生成時に指定しないと効果がない
スタイルに関してはここで行う事が前提となるはずなので上記が本当なら
CreateExの意味が薄くなるような気もしますね。
メモリさんの試して見たと言う内容が単純に->CreateExで呼び出しただけなら
言われている話は事実関係と合っていないような気がするんですけれど。
> えーと、これってソースを見て確認したんでしょうか?
そうです。ただし、Visual Studio 2005(MFC 8.0)です。VC7でも変わらないと思う。
> CreateExに指定すると言う事はウインドウの生成時に指定しないと効果がない
> スタイルに関してはここで行う事が前提となるはずなので上記が本当なら
> CreateExの意味が薄くなるような気もしますね。
そう思って、本当にそんなことがあるの? っと思ったんで調べてみたんです。
CTreeCtrl::CreateExはCTreeCtrl::Createの後、ModifyStyleExが呼ばれるが、
CWnd::CreateExはPreCreateWindow、AfxHookWindowCreate、AfxCtxCreateWindowEx
等が呼び出され、最終的にはCreateWindowExに行きつく。
つまり、異なる処理が行なわれているわけです。動作が違っていても仕方ない。
> メモリさんの試して見たと言う内容が単純に->CreateExで呼び出しただけなら
> 言われている話は事実関係と合っていないような気がするんですけれど。
最終的なコードがどうなったか報告がないんですが、話の流れとしては、
メモリ 2007/09/14(金) 11:23:25
m_pTree->CreateEx を使用、NG
subaru 2007/09/14(金) 12:06:15
m_pTree->CWnd::CreateExを提案
メモリ 2007/09/14(金) 16:06:33
スタイル変更に成功
となっているので、「単純に->CreateExで呼び出しただけ」ではなく、事実関係
とも合致していると思いますけど。
私も確認してみました。
VC6のMFCだとCTreeCtrl::CreateEx()は定義されていませんでした。
VS2005はmaruさんの話と同じです。
VC6から2005までの何処でこの変更があったのか判りませんが、CWndの
CreateExを呼び出すことで上手くいったのならVS2005と同じ実装だと推測でき
ます。
という事は、VC6からVC6以降に移植した場合でもこの現象にぶつかりそうです。
しかし、妙な実装ですね…
解決忘れてますね。
> 最終的なコードがどうなったか報告がないんですが、話の流れとしては、
subaruさんから提示された、
> m_pTree->CWnd::CreateEx(WS_EX_CLIENTEDGE, WC_TREEVIEEW, NULL,
> WS_CHILD | WS_VISIBLE | WS_TABSTOP,
> CRect(0,0,0,0), this, IDC_TREE1);
です。
ちなみに、CreateWindowEx()でもXPスタイルになりました。
うーむ、変な実装ですね。
正直な所、MSにちゃんと訳を解説して欲しい所ですねぇ。
回避策としてCWnd::CreateExで呼び出すと言うのはなるほど納得です。
しっかし、どう考えてもリーズナブルな訳と言うのが思いつかない。(--;