• ベストアンサー

CTreeCtrlのノードごとにアイコンを変えたい

おせわになります。 C++6.0 MFC で開発しております。 現在,CTreeCtrlで、下記のような画像付き(●:画像)のツリーを表示しています。 ●AAA-●bbb  -●ccc -●ddd そこで、下記のようにノードごとに画像を変えたいのですが、どのような関数を使用すればよいのでしょうか? ●AAA-★bbb  -◆ccc -□ddd お手数ですがなにとぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんばんは。  イメージリストの作成方法は何通りかある為、ピンポイントで説明するのは難しいのですが、イメージリストの使い方を間違えていて、●★◆□の様に並んでいないか、ツリーコントロールの操作を間違えているか、ではないでしょうか。  以下は16x16のアイコン4個分を並べてデザインしたビットマップ(64x16のビットマップ)を読み込んで、ツリーアイテムに設定します。  デザインさえ合っていれば成功する筈です。以下参考程度に。 BOOL CTestDlg::OnInitDialog() { CDialog::OnInitDialog(); // "バージョン情報..." メニューをシステム メニューに追加します。 // IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、 // Framework は、この設定を自動的に行います。 SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定 SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定 // TODO: 初期化をここに追加します。 //16x16のアイコン4個分(64x16デザイン)のイメージを読み込む HIMAGELIST hImgList = ::ImageList_LoadImage(NULL, TEXT("imglist.bmp"), 16, 0, CLR_NONE, IMAGE_BITMAP, LR_LOADFROMFILE); //CImageListの作成 CImageList* pImgList = new CImageList(); pImgList->Attach(hImgList); //CTreeCtrlにアイテムを追加 CTreeCtrl* pTree = static_cast<CTreeCtrl*>(this->GetDlgItem(IDC_TREE1)); pTree->SetImageList(pImgList, TVSIL_NORMAL); /*アイテム追加と同時にイメージリスト番号を指定する場合 HTREEITEM hItem = pTree->InsertItem(TEXT("AAA"), 0, 0);//イメージリスト1番目を指定 hItem = pTree->InsertItem(TEXT("bbb"), 1, 1, hItem);//イメージリスト2番目を指定 hItem = pTree->InsertItem(TEXT("ccc"), 2, 2);//イメージリスト3番目を指定 hItem = pTree->InsertItem(TEXT("ddd"), 3, 3, hItem);//イメージリスト4番目を指定 */ /*後でイメージリスト番号を指定する場合 HTREEITEM hItem1 = pTree->InsertItem(TEXT("AAA")); HTREEITEM hItem2 = pTree->InsertItem(TEXT("bbb"), hItem1); HTREEITEM hItem3 = pTree->InsertItem(TEXT("ccc")); HTREEITEM hItem4 = pTree->InsertItem(TEXT("ddd"), hItem3); pTree->SetItemImage(hItem1, 0, 0); pTree->SetItemImage(hItem2, 1, 1); pTree->SetItemImage(hItem3, 2, 2); pTree->SetItemImage(hItem4, 3, 3); */ return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } void CTestDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: ここにメッセージ ハンドラ コードを追加します。 CTreeCtrl* pTree = static_cast<CTreeCtrl*>(this->GetDlgItem(IDC_TREE1)); if(pTree == NULL) return; CImageList* pImgList = pTree->SetImageList(NULL, TVSIL_NORMAL); if(pImgList == NULL) return; //CImageListをnewで作成した場合はdeleteが必須 delete pImgList; }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

SetImageListで表示する分の画像(選択、非選択)を用意したCImageListを設定し、iImageとiSelectedImage(ノード追加時はInsetItemのTVITEM構造体のメンバ、ノード更新時はSetItemのTVITEM構造体のメンバかSetItemImage)に用意したイメージリストのインデックスを指定することで変えられると思います。

kgyqk433
質問者

お礼

お返事ありがとうございます。 同じようにやっているつもりなのですが、アイコンを変えると、ツリーのすべてのアイコンが変わってしまって、ノード単位ができないのです。。。 ノード単位に変えるにはどうしたらよいのでしょうか??? 大変お手数ですが、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CTreeCtrlで、あるノード以下だけを無効にしたい

    おせわになります。 C++6.0 MFC で開発しております。 現在,CTreeCtrlで、下記のような画像付き(●:画像)のツリーを表示しています。 それぞれのノードをクリックすると、画像:●が★に変わります。 ●A-●A_b   -●A_c     -●A_c_1      -●A_c_2              そこで、A_c_1のノードだけを無効(バックに灰色がかかったような状態で、クリックしても反応しない。)にしたいのですが、どのようにすればよいでしょうか? また、一つのノードだけ、無効にすることができないのであれば、 画像(●)とテキスト内容(A_c_1)を灰色をかけるにはどのようにすればよいでしょうか? お手数ですが、なにとぞよろしくお願いします。

  • 【エクセル】空セルを埋める方法

    お世話になります。 下記のような表があります。 1行目:AAA,BBB,CCC,DDD 2行目:空セル,BBB,CCC,DDD 3行目:空セル,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:空セル,BBB,CCC,DDD ・・・ こんなパターンの行が結構あります。 空セル部分を下記のように埋めたいのですが 1行目:AAA,BBB,CCC,DDD 2行目:AAA,BBB,CCC,DDD 3行目:AAA,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:aaa,BBB,CCC,DDD てっとり早く埋める方法ありませんか? いまは、【ctrl+↓】 ⇒【↑】⇒【ctrl+D】を延々繰り返しています。 宜しくお願いいたします。

  • 正規表現で一つ目の区切り文字で区切りたいのですが・・・

    aaa/bbb/ccc/ddd aaa/bbb/ccc/ddd/eee aaa/ccc/ddd $a=~/(.*)\/(.*)/; $1はそれぞれ aaa/bbb/ccc aaa/bbb/ccc/ddd aaa/ccc と成ってしまいます。 このように 「最後の/」で分けられてしまいます。 一つ目の/で分けるにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • EXCELの横列を縦列に並べ替え

    こんばんは 横列に並んでいるものを縦列に並び替えたいのですがどのようにすれば いいかわかりません。お知恵を貸してください。 EXCELは2007を使用しています 下記のように並んでいるものを、      A     B     C      D    E   F 1     AAA 111 BBB 333   FJD 999 2     CCC 444 DDD 666 3     AVA    777 AAA    111 これを   A   B 1 AAA  111 2 BBB  333 3 FJD  999 4 CCC  444 5 DDD  666 6 7 AVA  777 6 BBB  666 7   8 AAA  111 9 のように並び替えたいです。 何か簡単に出来る方法があったら教えて下さい。 よろしくお願いします。

  • Excelの関数に詳しい方、お願いします。

    わかりづらい説明かもしれませんが、よろしくお願いします。 例として、 AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF ・ ・ ・ といった文字列がエクセルの先頭列A1~A100までずらりと並んでいるとします。 各アルファベットには任意の数字(日付など)が入るとして、この並んだ百件のデータからCCCの部分の最大値を表示するための適切な関数があれば教えていただけないでしょうか? 現在少々急いでいるため言葉足らずで申し訳ありませんが、よろしくお願いいたします.

  • Excelで同一のデータを抽出して横並びに

    A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  ccc     4 bbb      12  ddd     6 ccc     10  aaa     22 ddd     6   eee     10 eee     5   bbb     7 fff       8 kkk 9 kkk 7 lll 4 上記のようなデータを 以下のように同じ商品コードを横並びに表示させたいのですが どういったcountifとかで試したのですが上手くいかず、どのような関数を使えば可能でしょうか? A     B  C     D 商品コード 注文数  商品コード 注文数 aaa     15  aaa     22 bbb      12  bbb     7 ccc     10  ccc     4 ddd     6   ddd     6 eee     5   eee     10 fff       8 kkk 7 kkk 9 lll 4 宜しくお願い致します。

  • ハンドルされていない例外が発生?

    C++にて作成したアプリを終了すると0xC0000005エラーが発生します。 エラー箇所は AAA *aaa //AAAは外部クラス(グローバル) void BBB{ aaaa = new aaa; aaa->ccc();} void CCC{ aaa->ddd(); delete aaaa; } メイン関数にてBBB→CCCの順で数回読んでいます。 エラーの原因として何が考えられるでしょうか? 開発環境はWindowsXP VC++6.0です。 よろしくお願いします。

  • EXCELのVBAで空白列を削除して左づめにできますか?

    いつも参考にしています。まだ、マクロの記録にチョット手を加えて自動化?している程度の腕前ですが? 仕事の都合で下記の問題を解決しなくてはならなくなり、皆様のお知恵をお借りしたいと思い質問させて頂きます。 エクセルのワークシートに空白のセルがランダムに入っているデータがあります。これを、ある列まで(例ではD列までの左の空白セルをなくして左づめのデータとしたいのです。 (例)  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|   |BBB|CCC|DDD|EEE| 3|AAA|   |CCC|DDD|EEE| 4|AAA|   |CCC|   |EEE| 5|   |   |   |DDD|EEE|     ↓  | A | B | C | D | E | 1|AAA|BBB|CCC|DDD|EEE| 2|BBB|CCC|DDD|   |EEE| 3|AAA|CCC|DDD|   |EEE| 4|AAA|CCC|   |   |EEE| 5|DDD|   |   |   |EEE| ここで、E列以降は詰めないでほしいのです。 できれば、VBAで実現したいのですが、どのような考えで、どのようなコード?を書けばよいのか教えてください。 質問の仕方も用途を得ないで、失礼な質問になっていると思いますが、よろしくお願いします。

  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl
  • ある項目(数値)に加算したものでソートしたい。

    ある項目(数値)に加算したものでソートしたい。 下のようなテーブルがあります。 そのpointに加算した結果でソートしたいのですが、可能でしょうか? テーブル name  | point ああAAA| 100 ああBBB| 400 いいCCC| 300 ううDDD | 200 おおCCC| 500 ============== ふつうにORDER BY point DESC でソートすると下記のようになります。 おおCCC| 500 ああBBB| 400 いいCCC| 300 ううDDD | 200 ああAAA| 100 ============== そこでpointに加算した結果(dbには反映させず、あくまで表示上のみ) name[ *CCC]にはpointに80%加算 いいCCC 300→540 おおCCC 500→900 ソート結果 おおCCC| 900 いいCCC| 540 ああBBB| 400 ううDDD | 200 ああAAA| 100 ============== このような事は可能でしょうか?

このQ&Aのポイント
  • 江戸時代の歯車作りにはどのような道具と設計方法が使われていたのかを教えてください。
  • 江戸時代には、cadなどの設計ソフトが存在しなかったため、歯車の設計はどのように行われていたのでしょうか。
  • 江戸時代において、歯車を書くための道具や設計方法について教えてください。
回答を見る

専門家に質問してみよう