AIと戦って、あなたの人生のリスク診断 >>

おせわになります。
C++6.0 MFC で開発しております。

現在,CTreeCtrlで、下記のような画像付き(●:画像)のツリーを表示しています。
それぞれのノードをクリックすると、画像:●が★に変わります。

●A-●A_b
  -●A_c
    -●A_c_1
     -●A_c_2
            

そこで、A_c_1のノードだけを無効(バックに灰色がかかったような状態で、クリックしても反応しない。)にしたいのですが、どのようにすればよいでしょうか?

また、一つのノードだけ、無効にすることができないのであれば、
画像(●)とテキスト内容(A_c_1)を灰色をかけるにはどのようにすればよいでしょうか?

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

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>それぞれのノードをクリックすると、画像:●が★に変わります。



別のノードをクリックすると、画像はどうなるのでしょう?


では、本題。

>そこで、A_c_1のノードだけを無効(バックに灰色がかかったような状態で、クリックしても反応しない。)にしたいのですが、どのようにすればよいでしょうか?

無効表示(グレー表示)にする場合、画像の方は予め用意してImageListに入れておくことになるかと思います。
クリックに反応しない。というのが、どこまでのことを指すのが不明ですが…
TVN_ITEMCHANGINGかTVN_SELCHANGINGのハンドラ作成して、TRUEを返却することで変更/選択をキャンセルすることができるかと。
# 親ウィンドウのOnNotify()で処理…でしょうか。

>また、一つのノードだけ、無効にすることができないのであれば、
>画像(●)とテキスト内容(A_c_1)を灰色をかけるにはどのようにすればよいでしょうか?

画像については先の通り。
テキスト内容に関してはカスタムドローで対応できるかと思われます。
http://www.kumei.ne.jp/c_lang/sdk3/sdk_262.htm

こちらも親ウィンドウのOnNotify()でしょうか…
dwDrawStageがCDDS_PREPAINTの時にCDRF_NOTIFYITEMDRAWを返却すると、各ノードの描画の際に通知が来ます。
dwItemSpecに対象ノードのHTREEITEMが入って通知されるようですので、
GetItem()なりでノードを取得可能でしょう。
その上で、clrTextとclrTextBkに色を設定すればよろしいかと。
# EnableWindow()相当ならば…GetSysColor()辺りで取得できます。
    • good
    • 0
この回答へのお礼

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

Ctreectrlのメンバ関数では、やはりそのようなのはないのですね。。。

教えて頂いた方法をためします。

ありがとうございます。

お礼日時:2010/02/05 13:49

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVC++でツリーコントロールの文字色変更

VC++.NETを使い始めたばかりの初心者です。

ツリーコントロールで登録した文字列を
行ごとに文字色の変更をしたいのですが
やり方がわからなく困っています。

WM_NOTIFYメッセージを横取りして
clrTextメンバに色を設定をしてみたのですが、
アイテムのダブルクリックやマウス右クリック
メニューが使えなくなってしまいました。

ほかのやり方でもかまいませんので
ご存知の方は、ご教授をよろしくお願いします。

Aベストアンサー

ここは?
http://hp.vector.co.jp/authors/VA016117/treeview.html

参考URL:http://hp.vector.co.jp/authors/VA016117/treeview.html

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

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

おせわになります。

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

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

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

Aベストアンサー

 こんばんは。

 イメージリストの作成方法は何通りかある為、ピンポイントで説明するのは難しいのですが、イメージリストの使い方を間違えていて、●★◆□の様に並んでいないか、ツリーコントロールの操作を間違えているか、ではないでしょうか。
 以下は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;
}

 こんばんは。

 イメージリストの作成方法は何通りかある為、ピンポイントで説明するのは難しいのですが、イメージリストの使い方を間違えていて、●★◆□の様に並んでいないか、ツリーコントロールの操作を間違えているか、ではないでしょうか。
 以下は16x16のアイコン4個分を並べてデザインしたビットマップ(64x16のビットマップ)を読み込んで、ツリーアイテムに設定します。
 デザインさえ合っていれば成功する筈です。以下参考程度に。

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();...続きを読む


人気Q&Aランキング