みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MFCのListCtrlを使ってセルに色をつけたい

はじめて質問させて頂きます。 よろしくお願い致します。

MFCのリストコントロールを使って、”セル”ごとに色をつけたいのですが、
可能でしょうか?

調べたところ、CMFCListCtrl::OnGetCellBkColorを使えば可能のようなのですが、
まったく使い方がわかりません。

できれば、下記のコードに添削頂ければ、ありがたいです。
どうぞよろしくお願い致します。


<コード>

BOOL Clistctrol_colorDlg::OnInitDialog()
{

      ~略~

// TODO: 初期化をここに追加します。

//■カラム作成
char _ch00[10]="c1";
char _ch10[10]="c2";

LVCOLUMN lvc;
lvc.mask=LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

lvc.iSubItem=0;
lvc.pszText=_ch00;
lvc.cx=100;
m_wndList.InsertColumn(0, &lvc);

lvc.iSubItem=1;
lvc.pszText=_ch10;
lvc.cx=100;
m_wndList.InsertColumn(1, &lvc);

//■データ部
char _ch0[10]="0";
char _ch1[10]="1";
char _ch2[10]="2";
char _ch3[10]="3";

LVITEM lvi;
lvi.mask = LVIF_TEXT;

lvi.iItem=0;
lvi.iSubItem=0;
lvi.pszText=_ch0;
m_wndList.InsertItem(&lvi);

lvi.iItem=0;
lvi.iSubItem=1;
lvi.pszText=_ch1;
m_wndList.SetItem(&lvi);

lvi.iItem=1;
lvi.iSubItem=0;
lvi.pszText=_ch2;
m_wndList.InsertItem(&lvi);

lvi.iItem=1;
lvi.iSubItem=1;
lvi.pszText=_ch3;
m_wndList.SetItem(&lvi);

return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}


<調べたURL>
http://msdn.microsoft.com/ja-jp/library/bb984092.aspx
http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/CMFCListCtrl.html
http://www.aspfree.com/c/a/.NET/List-Control-and-Property-Grid-with-the-MFC-Feature-Pack/

投稿日時 - 2012-02-02 13:55:36

QNo.7280963

すぐに回答ほしいです

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

> 上記サンプルに添削いただくレベルでは、解決しないでしょうか?
提示部分には修正する場所はない。

> CMFCListCtrlを派生したクラスを作成し、そのクラスにOnGetCellBkColorを実装して、呼び出された引数(行、列)に応じたCOLOREF 値を返すようにする。

----ColoredListControl.h(新規作成)----
#pragma once

class CColoredListControl : public CMFCListCtrl
{
DECLARE_DYNAMIC(CColoredListControl)

public:
CColoredListControl(){}
virtual ~CColoredListControl(){}
virtual COLORREF OnGetCellBkColor(int row, int column)
{
// row, columnに応じた色を返すように変更!
return RGB((row+2) * 64, (column+2) * 64, 128);
}
protected:
DECLARE_MESSAGE_MAP()
};
----ColoredListControl.cpp(新規作成)----
#include "stdafx.h"
#include "ColeredList.h"
#include "ColeredListControl.h"

// CColeredListControl

IMPLEMENT_DYNAMIC(CColoredListControl, CMFCListCtrl)

BEGIN_MESSAGE_MAP(CColoredListControl, CMFCListCtrl)
END_MESSAGE_MAP()

----listctrol_colorDlg.h(Clistctrol_colorDlgの定義)----
CMFCListCtrlm_wndList;
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
CColoredListControl m_wndList;// 変更

----listctrol_colorDlg.cpp(Clistctrol_colorDlgの実装)----
#include "ColoredListControl.h"// 追加

投稿日時 - 2012-02-04 07:56:41

補足

できました!!!

本当に丁寧にありがとうございました!!

投稿日時 - 2012-02-06 21:47:51

お礼

ご回答ありがとうございます。 

今、いろいろとやっているのですが、なぜかうまくいきません。
もう少しやってみます。

本当にありがとうございます。

投稿日時 - 2012-02-06 18:21:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

提示されているMSDNを見たところ、CMFCListCtrl::OnGetCellBkColorは、
「フレームワークは、個々のセルの背景色を確認する必要がある場合に、このメソッドを呼び出します。」
とあり、解説には
「OnGetCellBkColor の既定の実装は、指定された入力パラメーターを使用するのではなく、単に GetBkColor を呼び出します。 したがって、既定では、リスト コントロール全体に同じ背景色が設定されます。 個々のセルに個別の背景色を設定する場合は、派生クラスで OnGetCellBkColor をオーバーライドします。 」
と説明されています。

ポイントは、「個々のセルに個別の背景色を設定する場合は、派生クラスで OnGetCellBkColor をオーバーライドします。」です。
つまり、CMFCListCtrlを派生したクラスを作成し、そのクラスにOnGetCellBkColorを実装して、呼び出された引数(行、列)に応じたCOLOREF 値を返すようにする。
リストビューコントロールはCMFCListCtrlではなく、派生したクラスを対応させる。

自分ではやったことがないですけど、MSDNによれば、これで出来るはず。

投稿日時 - 2012-02-02 14:49:51

お礼

ご回答ありがとうございます。

ですが申し訳ありません。 C++に詳しくなく派生クラスやオーバーライドがよくわかりません・・・

http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/CMFCListCtrl.html
http://www.aspfree.com/c/a/.NET/List-Control-and-Property-Grid-with-the-MFC-Feature-Pack/

で、おそらく派生クラス等がでているのですが、いったいDDX変数で設定した
m_wndListにどのように関連付けるのかがさっぱりわかりません…

上記サンプルに添削いただくレベルでは、解決しないでしょうか?

投稿日時 - 2012-02-02 23:56:03

あなたにオススメの質問