VC++ 6.0 XP
ツリーコントロールをダイアログに貼り付けて表示しています。
実行させて、アイテムをクリックすると、その文字は、反転し、アクティブになってい
るようになるのですが、プログラムのほうで、このどのアイテムがクリックされたの
か、知る方法がわかりません。ご存知の方よろしくおねがいします。
MFC を使っているかどうかは必ず書いてくださいな。
使っているなら CTreeCtrl::GetSelectedItem、使っていないなら
TreeView_GetSelection でいかがでしょ。
選択されたタイミングを知りたいなら、TVN_SELCHANGED をハンドリングします。
aetosさんレスありがとうございます。
MFCを使用しています。
アイテムをクリックしたタイミングでメッセージが発生しることは、ないのでしょう
か?クリックしたタイミングで処理をおこないたいのですが。
(できれば、そのメッセージのパラメータにどのアイテムがクリックされたかの情報が
のっていると都合がいいのですが。)
例えば、エクスプローラでは、フォルダーをクリックしたタイミングで、メインのビュ
ーにそのフォルダーの内容が表示されるような処理をおこないたいと思うのです。
既にaetosさんから
>選択されたタイミングを知りたいなら、TVN_SELCHANGED をハンドリングします。
と回答がありますが、VC++6を使用されているようなのでView側に
ClassWizardでメッセージを探してハンドラを作ることになるんじゃないでしょうか。
別の方法としてはメインフレーム側でOnWndMsgかWindowProcを
オーバライドすればWM_NOTIFYのメッセージでTVN_SELCHANGEDが拾えると思います。
MSDNを活用される事をお勧めします。
キーワードでCTreeCtrlと入れれば、
下のリストボックスにCTreeCtrl の通知メッセージという項目があるはずです。
ここから通知メッセージの一覧が見れます。
一覧で各通知メッセージの意味の説明もありますからここで
メッセージに目星をつけます。
次に目星を付けたメッセージこの場合は、TVN_SELCHANGEDをキーワードに
入れるとリストボックスにTVN_SELCHANGEDが出てきますから
ここでリストボックス上のTVN_SELCHANGEDをダブルクリックします。
該当するトピックがリスト表示されますから
この中のShell Command Controlを選択して内容を表示させます。
英語表記ですが、プログラミングの資料で英語表記の資料は極当たり前に
出てきます。英語の辞書を使ってでも読むくらいの事は必要です。
但し、意味がわかれば良いだけなので翻訳する必要は有りません。
よく英語だから読めないと言う方がいらっしゃいますが、
翻訳家が翻訳したような文章を目指すから挫折するわけで
要は片言だろうが意味がわかれば良いわけなので、読んでみる努力をするべきです。
この手の文章は文法的に難しい言い回しを使っている事は殆ど有りません。
平易に単語の意味を引いて行けば意味はわかると思いますよ。
ここで言っているMSDNはVC++6.0についてきたHELPの事を言っています。
オンラインのMSDNでも検索は可能ですが、上記の操作はローカルのHELPを
想定しているので少し違っていると思います。
いずれにしてもこの辺は調べる為の肝を身につけていかないと
なかなか自分で解決できないので効率が悪いです。
始めはうまく行かなくてもチャレンジしてみる事をお勧めします。
あと、質問時にこう言う調べ方をしたけど分からなかった等を
書いていると調べ方に関してのアドバイスを得られるかもしれません。
aetosさん、subaru さん、PATIOさん、レスありがとうございます。
①クラスウイザードでツリービューを貼り付けた、ダイアログクラスのTVN_SELCHANGED
メッセージに対してメソッドを実装する。デフォルトでOnSelchanged○○○と作られま
した。 aetosさんの言って下さったTVN_SELCHANGEDをハンドリングするとは、このこと
だと思います。
②実装の内容は、以下の通りです。
void CxxxDialog::OnSelchanged○○○(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してくださ
い
char buff[256];
TVITEM wTvitem ;
wTvitem.hItem = m_wndTree1.GetSelectedItem() ;//セレクトされたアイテム
wTvitem.mask = TVIF_TEXT ;
wTvitem.pszText = buff ;
wTvitem.cchTextMax = 255;
m_wndTree1.GetItem(&wTvitem) ;
CString msg ;
msg.Format(buff) ;
AfxMessageBox(buff) ;
*pResult = 0;
}
GetSelectedItem()でセレクトされた、アイテムの内容をどうやって見るのか、なかなか
わかりませんでした。結局、GetItem()に、GetSelectedItem()の返り値を渡すことに気
がついてなんとかできました。
そんなことをせずとも、pNMTreeView にアイテム情報が入ってます。
PATIOさんのアドバイスどおり、TVN_SELCHANGEDのヘルプを見て、英語の内容をみ
てみましたが、これでは、コーディング結果には、なかなか結びつかないように思いま
すが、「なれ」もあると思いますので、これからすこしづつ、やっていきたいと思いま
す。ありがとうございました。
あ、ダイアログって書いてあった。
前回の続きでドキュメントビューかと思って書き込んでしまった(^^ゞ
aetos さん、レスありがとうございます。GetSelectedItem()は、いらないみたいです
ね。GetItemは、必要みたいです。
char buff[256];
TVITEM wTvitem ;
//(削除)wTvitem.hItem = m_wndTree1.GetSelectedItem() ;
wTvitem.hItem = pNMTreeView->itemNew.hItem ;//セレクトされたアイテム
wTvitem.mask = TVIF_TEXT ;
wTvitem.pszText = buff ;
wTvitem.cchTextMax = 255;
m_wndTree1.GetItem(&wTvitem) ;
AfxMessageBox(buff) ;
> GetItemは、必要みたいです。
というか、設定されている文字列が欲しいんだったら、
CString str_ = wndTree1.GetItemText(pNMTreeView->itemNew.hItem);
で一発じゃん。VC6では使えないんだっけ?