動的に生成したCTreeCtrlにXPスタイルを適用したい – プログラミング – Home

動的に生成したCTreeCtrlにXP...
 
通知
すべてクリア

[解決済] 動的に生成したCTreeCtrlにXPスタイルを適用したい

固定ページ 1 / 2

メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

WinXP+VC7+MFCです。

早速ですが質問させてください。

ダイアログエディタで配置したTreeコントロールは、枠がXPスタイルになるのですが、
CTreeCtrlをCreateして配置したTreeコントロールはXPスタイルになりません。

どのようにすれば動的に生成したTreeコントロールでもXPスタイルになるのでしょう
か?

よろしくお願いします。


引用未解決
トピックタグ
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

XPスタイルが何を指しているかわかりませんが、MSDNに
「拡張ウィンドウ スタイルを使用してツリー ビュー コントロールを作成する場合は、
Create ではなく CreateEx を呼び出します。」
との記述があります。


返信引用
メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

maruさんレスありがとうございます。

拡張ウィンドウスタイルではなく、
XPのビジュアルスタイル(LUNA)のことです。

CListCtrlやCEditはダイアログエディタで配置しても、
動的にCreateしてもビジュアルスタイルが適用されるのですが、
CTreeCtrlはCreateしても適用されないのです。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

ちょっと試してみましたが
コントロール作成時のスタイルに
WS_EX_CLIENTEDGEがないとダメかも。


返信引用
メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

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);


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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);


返信引用
メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

すみません、現在は試せないです。
ただ、コンパイルが通りそうにない気がします。。

また、CWnd::CreateEx()は、戻り値がBOOLです。
CWnd::CreateEx()の引数を見ても、
newしたm_pTreeと結び付けられなそうです。

提示しましたコードですが、間違っておりました。
m_pTree = new CTreeCtrl();

m_pTree = new CHogeTreeCtrl();

m_pTreeはCTreeCtrlを継承したCHogeTreeCtrlのポインタです。
申し訳ございません。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

えーと、CHogeTreeCtrlがCTreeCtrlから派生したクラスであれば、
CTreeCtrlで使えるメンバー関数は使えるはずですが、本当に使えませんか?
ちなみに

> また、CWnd::CreateEx()は、戻り値がBOOLです。
> CWnd::CreateEx()の引数を見ても、
> newしたm_pTreeと結び付けられなそうです。

この部分の意味が分からないです。
結び付けられ無そうという根拠も分からないし。
戻り値がBOOLである事と、使えないと言う判断の関係も分からない。
CTreeCtrlがCWndから派生しているわけですから
CHogeTreeCtrlも間接的にCWndから派生していると考えて良いはずですよ。
m_pTreeはCTreeCtrlを継承したCHogeTreeCtrlのポインタであっても
なんら問題無いと思いますよ。


返信引用
メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

subaruさん、PATIOさんありがとうございました。

試したところ、問題なくXPビジュアルスタイルに変えることが出来ました。

大変勉強になりました。

ありがとうございました。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

なるほど、ポイントは

> あとからスタイルビットを適用してもダメだったので

だったんですね。CTreeCtrl::CreateEx()はCreateしてからModifyStyleEx()を
よびだすが、CWnd::CreateEx()は拡張スタイルを指定してウィンドウを生成する。

そんなことどこにも書いていないじゃないか! > MSDN

CListCtrlは問題ないとすれば、CTreeCtrlの問題かな?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

> だったんですね。CTreeCtrl::CreateEx()はCreateしてからModifyStyleEx()を
> よびだすが、CWnd::CreateEx()は拡張スタイルを指定してウィンドウを生成する。

えーと、これってソースを見て確認したんでしょうか?
CreateExに指定すると言う事はウインドウの生成時に指定しないと効果がない
スタイルに関してはここで行う事が前提となるはずなので上記が本当なら
CreateExの意味が薄くなるような気もしますね。
メモリさんの試して見たと言う内容が単純に->CreateExで呼び出しただけなら
言われている話は事実関係と合っていないような気がするんですけれど。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

> えーと、これってソースを見て確認したんでしょうか?

そうです。ただし、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で呼び出しただけ」ではなく、事実関係
とも合致していると思いますけど。


返信引用
麩
 麩
(@麩)
ゲスト
結合: 17年前
投稿: 95
 

私も確認してみました。
VC6のMFCだとCTreeCtrl::CreateEx()は定義されていませんでした。
VS2005はmaruさんの話と同じです。

VC6から2005までの何処でこの変更があったのか判りませんが、CWndの
CreateExを呼び出すことで上手くいったのならVS2005と同じ実装だと推測でき
ます。

という事は、VC6からVC6以降に移植した場合でもこの現象にぶつかりそうです。
しかし、妙な実装ですね…


返信引用
メモリ
 メモリ
(@メモリ)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

解決忘れてますね。

> 最終的なコードがどうなったか報告がないんですが、話の流れとしては、

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スタイルになりました。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

うーむ、変な実装ですね。
正直な所、MSにちゃんと訳を解説して欲しい所ですねぇ。
回避策としてCWnd::CreateExで呼び出すと言うのはなるほど納得です。
しっかし、どう考えてもリーズナブルな訳と言うのが思いつかない。(--;


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました