プロが教える店舗&オフィスのセキュリティ対策術

おせわになります。

C++6.0 MFC で開発しております。

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

お手数ですがなにとぞよろしくお願いします。

A 回答 (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;
}
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

同じようにやっているつもりなのですが、アイコンを変えると、ツリーのすべてのアイコンが変わってしまって、ノード単位ができないのです。。。

ノード単位に変えるにはどうしたらよいのでしょうか???

大変お手数ですが、よろしくお願いします。

お礼日時:2010/01/07 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!