• 締切済み

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); で、選択したはずの値(ハンドル)が返ってきません。 いろいろ試行錯誤しているのですが、どうも理解できないので質問させていただきました。 よろしくお願いします。

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.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

mogeraccho
質問者

お礼

ご回答ありがとうございます。 >こっちの戻り値確認する方が先ではないかと もちろん確認した上でご質問させて頂いています。(確認の後条件文は消してしまいましたが……) >後 TVITEM tvi; の使ってないメンバはクリアしておいたほうが良いかもしれません ActiveBasicでは定義した瞬間にすべて0で初期化してくれます……が、そのことではなく、ですか? もう一度した方がいいのでしょうか……うむむ… 一応症状を画像でまとめてみました。 (A)http://fast-uploader.com/file/6950711390639/ (B)http://fast-uploader.com/file/6950711438023/ なお、(B)の症状については、TreeViewを一度クリックするとクリアされます。 直接ノードをクリックすると(A)の状態になるのです…… 今もいろいろ探しながらやっていますが、難しいですね……

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

回答ではありません あなたがやりたいのは自分で作ったプログラム内で使用しているTreeViewですか? 記載コードを見てると外部プログラムのTreeViewを コントロールしようとしているように見えますがどちらでしょうか? 更にできていないのはハンドルの取得の話なのでしょうか?(質問中にはそう書いてる) それともハンドル取得できてるのに制御(TreeViewのノードをプログラムで選択 )ができない   でも質問中でハンドルが返ってこないってことなら問題は   SendMessageではなくて tvi.hItem = [ツリーのノードのハンドル];   の方になりますけど どちらなのでしょうか? ハンドルが取得できているとしてそのハンドルが本当に 目的のものであるかの確認ができているのかもよくわかりません ActiveBasic事態は依然お遊びで数行のコード書いたことがある程度なので はっきり覚えてませんがWindowsAPI使えるのでしたらある程度のことはできるはずです (変数型は合わせる必要ありますけど関数仕様はCと変わりません)

mogeraccho
質問者

お礼

ご返信有難うございます。 言葉足らずで申し訳ありません。 >あなたがやりたいのは自分で作ったプログラム内で使用しているTreeViewですか? はい、プログラム内で使用しているTreeViewです。 >記載コードを見てると外部プログラムのTreeViewをコントロールしようとしているように見えます すいません、おそらくそれは「hTree」を見てのことだと思います。 これは、 Dim hTree As HWND hTree = GetDlgItem(hMainWnd,TreeView1) のようになっています。 >更にできていないのはハンドルの取得の話なのでしょうか?(質問中にはそう書いてる) 取得ではなく、おそらく設定です。 詳しく書きますと、 先のプログラムをサブルーチン化しており、新しくノードを追加した時にそちらにフォーカスを移したかったのですが、 そのルーチンを実行すると、2つ目移行が全て選択状態(恒例の青い網掛け的な状態)になります。 しかし、SendMessage(hTree,TVM_GETNEXTITEM,&H0009,0)で選択状態のノードのハンドルの取得を試みると、 一番最初のノードのハンドルが返ってきます。 これを修正したいと考えています。 >ActiveBasic事態は依然お遊びで数行のコード書いたことがある程度なのではっきり覚えてませんがWindowsAPI使えるのでしたらある程度のことはできるはずです >(変数型は合わせる必要ありますけど関数仕様はCと変わりません) はい、Cと変わらないためこちらのカテゴリで質問させて頂いています。 もうしわけありませんが、よろしくお願いします。

関連するQ&A

  • C#でtreeviewの指定ノードを選択する

    C#にて、 treeviewでの選択ノードを記憶しておき、 treeviewを一度更新(削除し作成)し、 記憶してあるノードを再び選択する。という動きをしたいです。 TreeNode tn = new TreeNode(); tn = treeView1.SelectedNode; //ここでDB再読み込み→treeView再作成 treeView1.Focus(); treeView1.SelectedNode = tn; としているのですが、TopNode選択状態になってしまい、 最初に選択していたNodeを選択してくれません。 どなたかご教授願います。 よろしくお願いいたします。

  • ActiveBasic ListView 選択を移動させたい

    SendMessage関数を使って、ListViewの選択されているアイテムの場所を移動させたいのですが、 思うように動きません。 Dim lv As LVITEM With lv .iItem=PlayListNum[RandomFlag] .mask=LVIF_STATE .state=LVIS_SELECTED End With SendMessage(hList,LVM_SETITEM,0,VarPtr(lv)) ※hListには、ListViewのハンドルが格納されてあります。 ご存知の方、いらっしゃいましたら、やり方の方をご教授下さい。 Win XP AB 4.23.00

  • TreeView の初期表示について

    TreeView に『A』『B』『C』のノードがあるとします。 初期表示を『B』ノードを選択・展開した状態(子ノードあり)にしたいのですが、 方法がわかりません。 何かよい方法はないでしょうか?よろしくお願いします。 説明不足な点はすぐに補います。

  • TreeView と DOMツリー

    C# WPF でプログラミングをしています。 TreeView に XML の階層構造を表示させて、ある項目を選択し、ボタンをクリックするとその項目の子ノードが追加されるようにするプログラムを作っています。 選択した項目(TreeView.SelectedItem(Object型)) を、DOMツリーの要素ノード (XmlElement型) にキャストし、それに新しく作った要素ノード(XmlElement型)をつなげるといったようにしているのですが、その際「挿入するノードは、異なるドキュメント コンテキストのものです。」のエラーが発生してしまいます。 XmlElement tvi = treeView.SelectedItem as XmlElement; XmlElement item = doc.CreateElement("item"); tvi.PrependChild(item); // エラー発生箇所 ※ doc は XmlDocument のインスタンスです。 解決策を教えてください。よろしくお願いします。

    • ベストアンサー
    • XML
  • LVM_SETITEMSTATEでListViewのアイテムを選択するには?

    C#でSendMessageを使用してListViewのアイテムを選択する方法で悩んでいます。 [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )] public struct LVITEM { public uint mask; public int iItem; public int iSubItem; public uint state; public uint stateMask; public IntPtr pszText; public int cchTextMax; public int iImage; public int lParam; public int iIndent; // (_WIN32_WINNT >= 0x501) public int iGroupId; public uint cColumns; public IntPtr puColumns; } ・・・・ public void HogeHoge() { LVITEM lvi = new LVITEM(); lvi.state = LVIS_FOCUSED | LVIS_SELECTED; lvi.stateMask = 0x000F; SendMessage( hLV, LVM_SETITEMSTATE, 0, ref lvi ); } LVM_SETITEMSTATEでは選択できないのでしょうか? OSはXPです。

  • C# TreeViewのノードの判定

    TreeViewでクリックしたノードの位置が親ノード(+の位置)かそれとも配下の子ノード なのか判定することはできますでしょうか。

  • TreeViewで複数ノードの選択は可能ですか?

    VisualBasic2005でwindowsアプリの開発をしています。 今回希望として、複数のノードを一度にドラッグするというのがあるのですが、 TreeViewで複数ノードの選択は可能なのでしょうか? そして、もし可能な場合、それらを一気にドラッグということは可能でしょうか? ドロップ先では、ドラッグ中のノードのtextが取れればよいです。 よろしくお願いします。

  • C#、VB.NET、C++.NETでのメモリ確保の質問

    投稿カテゴリに.NETの言語のカテゴリが無いのが 残念ですが、.NET言語に関する質問をさせてください。 C#でWin32アプリとやり取りするアプリケーションを 作っていて、プログラム内でメモリ確保をする必要があります。 Marshal.AllocCoTaskMem()とMarshal.AllocHGlobalが() ありますが、これらは動作にどのような違いがあるのでしょうか。 ヘルプなどを読みましたが、よく分かりませんでした。。

  • プルダウンを選択していないときは、初期値(selected)の値を、選

    プルダウンを選択していないときは、初期値(selected)の値を、選択したときは選択値を、hiddenで渡したい。 ▽プルダウン例 <form> <select> <option value="0" selected>A</option> <option value="4">B</option> <option value="6">C</option> </select> </form> ↑上で選択した値(A or B or C)値を、↓下のvalue=「"hoge"」に渡したいです。 ※選択肢は3つだけではなくて、たくさんあります。 ▽input例 <input name="category_name" value="hoge" type="hidden"> ※formとかselectにid振っても構いません。 ※javascriptでやりたいです。

  • プログラムを組んでいる途中、行き詰ってしまったので質問させていただきま

    プログラムを組んでいる途中、行き詰ってしまったので質問させていただきます。 ボタンを左クリックしたらコモンダイアログを表示し、ファイル名を取得するものを作っていたのですが、ファイルを選択した後ボタンが押したままになってしまいます。 ボタンはサブクラス化をしてあります。(サブクラス化しないと上手くいっているため、原因はここだと思います。) 画面が切り替わると判断できるものがあれば、その中でボタンを離したことにすれば良いと考えたのですが、判断できるウィンドウメッセージが分かりません。 サブクラス化したボタンプロシージャの中身の一部 switch(Msg){  case WM_LBUTTONDOWN:   SendMessage(親ウィンドウのハンドル,Msg,wParam,lParam);  case /*ここに切り替わりを判断できるメッセージ*/:   SendMessage(親ウィンドウのハンドル,WM_LBUTTONUP,(省略),(省略));   break; ※とりあえず左クリックのみ対応と言うことでWM_LBUTTONUPになっています。 分かる方いましたら、お願いします。 環境:Windows 言語:C++(WinAPI使用)