• ベストアンサー

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

専門家に質問してみよう