みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語 TreeViewのノードをプログラムで選択

お世話になっています。

TreeViewをプログラムの内部から選択したり、選択を外したりする方法を探しています。
何かご存知のかた、いらっしゃいましたらご教授いただければ幸いです。


さて、これだけですと「自分で調べろ」と言われそうなので、現在の私のやり方をば。

ただ、Cのカテゴリに投稿していますが実際は言語が違います。
なぜCのカテゴリに投稿したかというと、個人開発言語ですので利用者が少なくほしい情報を得ることが出来ないと考えたためです。
ご了承ください。
なお、言語はActiveBasicというものを使っています。(VBとは文法がかなり違うのであえてCに投稿しています。)

以下、無理矢理Cになおしています。
TVITEM tvi;
HWND focus;

tvi.mask = TVIF_STATE;
tvi.stateMask = TVIS_SELECTED;
tvi.state = TVIS_SELECTED;
tvi.hItem = [ツリーのノードのハンドル];

SendMessage(hTree,TVM_SETITEM,0,VarPtr(tvi));

このような感じで書いていますが、
SendMessage(hTree,TVM_GETNEXTITEM,&H0009,0);
で、選択したはずの値(ハンドル)が返ってきません。

いろいろ試行錯誤しているのですが、どうも理解できないので質問させていただきました。
よろしくお願いします。

投稿日時 - 2014-03-18 04:11:49

QNo.8518352

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

No1 です
状態はわかりましたが確認として 
SendMessage(hTree,TVM_SETITEM,0,VarPtr(tvi));
こっちの戻り値確認する方が先ではないかと
http://chokuto.ifdef.jp/urawaza/message/TVM_SETITEM.html

後 TVITEM tvi; の使ってないメンバはクリアしておいたほうが良いかもしれません
http://chokuto.ifdef.jp/urawaza/struct/TVITEM.html

実際使ったことがないので具体的なことは言えませんが
参考として以下あたりが参考になるのではないかと思います
SendMessage使うならMSDN探せとか書いてあるけど
http://www.nitoyon.com/vc/reference/gui/treeview.htm

投稿日時 - 2014-03-18 23:33:10

お礼

ご回答ありがとうございます。

>こっちの戻り値確認する方が先ではないかと
もちろん確認した上でご質問させて頂いています。(確認の後条件文は消してしまいましたが……)

>後 TVITEM tvi; の使ってないメンバはクリアしておいたほうが良いかもしれません
ActiveBasicでは定義した瞬間にすべて0で初期化してくれます……が、そのことではなく、ですか?
もう一度した方がいいのでしょうか……うむむ…

一応症状を画像でまとめてみました。
(A)http://fast-uploader.com/file/6950711390639/
(B)http://fast-uploader.com/file/6950711438023/
なお、(B)の症状については、TreeViewを一度クリックするとクリアされます。
直接ノードをクリックすると(A)の状態になるのです……

今もいろいろ探しながらやっていますが、難しいですね……

投稿日時 - 2014-03-19 00:18:59

ANo.1

回答ではありません
あなたがやりたいのは自分で作ったプログラム内で使用しているTreeViewですか?
記載コードを見てると外部プログラムのTreeViewを
コントロールしようとしているように見えますがどちらでしょうか?

更にできていないのはハンドルの取得の話なのでしょうか?(質問中にはそう書いてる)
それともハンドル取得できてるのに制御(TreeViewのノードをプログラムで選択 )ができない
  でも質問中でハンドルが返ってこないってことなら問題は
  SendMessageではなくて tvi.hItem = [ツリーのノードのハンドル];
  の方になりますけど
どちらなのでしょうか?

ハンドルが取得できているとしてそのハンドルが本当に
目的のものであるかの確認ができているのかもよくわかりません

ActiveBasic事態は依然お遊びで数行のコード書いたことがある程度なので
はっきり覚えてませんがWindowsAPI使えるのでしたらある程度のことはできるはずです
(変数型は合わせる必要ありますけど関数仕様はCと変わりません)

投稿日時 - 2014-03-18 12:47:06

お礼

ご返信有難うございます。
言葉足らずで申し訳ありません。

>あなたがやりたいのは自分で作ったプログラム内で使用しているTreeViewですか?
はい、プログラム内で使用しているTreeViewです。


>記載コードを見てると外部プログラムのTreeViewをコントロールしようとしているように見えます
すいません、おそらくそれは「hTree」を見てのことだと思います。
これは、
Dim hTree As HWND
hTree = GetDlgItem(hMainWnd,TreeView1)
のようになっています。


>更にできていないのはハンドルの取得の話なのでしょうか?(質問中にはそう書いてる)
取得ではなく、おそらく設定です。

詳しく書きますと、
先のプログラムをサブルーチン化しており、新しくノードを追加した時にそちらにフォーカスを移したかったのですが、
そのルーチンを実行すると、2つ目移行が全て選択状態(恒例の青い網掛け的な状態)になります。
しかし、SendMessage(hTree,TVM_GETNEXTITEM,&H0009,0)で選択状態のノードのハンドルの取得を試みると、
一番最初のノードのハンドルが返ってきます。
これを修正したいと考えています。



>ActiveBasic事態は依然お遊びで数行のコード書いたことがある程度なのではっきり覚えてませんがWindowsAPI使えるのでしたらある程度のことはできるはずです
>(変数型は合わせる必要ありますけど関数仕様はCと変わりません)
はい、Cと変わらないためこちらのカテゴリで質問させて頂いています。


もうしわけありませんが、よろしくお願いします。

投稿日時 - 2014-03-18 22:30:03

あなたにオススメの質問