|
ヘッダ項目にアイコンをつける
今回はリストコントロールのレポートビューのヘッダ項目に次のようにアイコンをつけてみます。

ではまず、リソースエディタでアイコンを追加しましょう。今回はヘッダ項目にアイコンを追加するので、16x16の大きさのアイコンを作ります。アイコンを新規作成し、メニューから「イメージ」->「新しいイメージタイプ」を選択し、16x16の大きさのアイコンを追加します。透過したい部分は透過色(色ウィンドウで白い四角で囲まれている色)で塗りつぶしておきます。

アイコンを作成したら、32x32の大きさのアイコンは使わないので削除しておきましょう。メニューから「イメージ」->「現在のアイコンイメージタイプ」->「32x32」を選択し、「イメージ」->「イメージタイプの削除」で削除できます。
アイコンはヘッダ項目ごとに変えられます。今回は紫の顔のアイコンと黄土色の顔のアイコンの2種類を作りました。

アイコンイメージはCImageListクラスで管理します。これは複数のアイコンやビットマップを配列のように管理できるクラスです。ダイアログクラスにCImageListクラスのメンバを追加しておきます。

では、コードの方を実装していきましょう。OnInitDialog()でリストコントロールを初期化します。長くなるので別関数にしています。
BOOL CListCtrl3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
{
int err = 0;
if (!err) err = ListInit();
if (!err) err = ListAddItem();
}
return TRUE;
}
|
ではリストコントロールの初期化関数を見てみましょう。ここでイメージリストを初期化し、ヘッダコントロールにセットします。
// リストコントロール初期化
int CListCtrl3Dlg::ListInit(void)
{
LVCOLUMN lvc;
int i;
TCHAR caption[][32] = {_T("商品名"), _T("単価")};
const int clmNum = sizeof caption /sizeof caption[0];
HICON hIcon = NULL;
CHeaderCtrl *headerP = NULL;
HDITEM hdItem;
int err = 0;
// アイコン用イメージリストの初期化
if (!err) if (!m_imageList.Create(16, 16, ILC_COLOR, 2, 1)) err = 1;
if (!err)
{
if ((hIcon = AfxGetApp()->LoadIcon(IDI_ICON_LIST1)) != NULL)
m_imageList.Add(hIcon);
if ((hIcon = AfxGetApp()->LoadIcon(IDI_ICON_LIST2)) != NULL)
m_imageList.Add(hIcon);
}
// 状態イメージ用イメージリストの初期化
if (!err) if (!m_imageListState.Create(IDB_LIST_STATE, 16, 1, RGB(0, 0, 255))) err = 1;
// ヘッダ用イメージリストの初期化
if (!err) if (!m_imageHeader.Create(16, 16, ILC_COLOR, 2, 1)) err = 1;
if (!err)
{
if ((hIcon = AfxGetApp()->LoadIcon(IDI_ICON_LIST3)) != NULL)
m_imageHeader.Add(hIcon);
if ((hIcon = AfxGetApp()->LoadIcon(IDI_ICON_LIST4)) != NULL)
m_imageHeader.Add(hIcon);
}
// イメージリストをリストコントロールにセット
if (!err) m_xcList.SetImageList(&m_imageList, LVSIL_SMALL);
if (!err) m_xcList.SetImageList(&m_imageListState, LVSIL_STATE);
// イメージリストをヘッダコントロールにセット
if (!err)
{
headerP = m_xcList.GetHeaderCtrl();
headerP->SetImageList(&m_imageHeader);
}
// リストカラム作成
if (!err)
{
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (i = 0; i < clmNum; i++)
{
lvc.iSubItem = i;
lvc.pszText = caption[i];
lvc.cx = 150;
if (m_xcList.InsertColumn(i, &lvc) == -1) {err = 1; break;}
}
}
// ヘッダ項目にイメージをセット
if (!err)
{
for (i = 0; i < headerP->GetItemCount(); i++)
{
if (!err)
{
hdItem.mask = HDI_IMAGE | HDI_FORMAT;
hdItem.iImage = i %2;
hdItem.fmt = HDF_LEFT | HDF_IMAGE | HDF_STRING;
if (!headerP->SetItem(i, &hdItem)) err = 1;
}
if (err) break;
}
}
return err;
}
|
CImageList::Create()関数でイメージリストを初期化します。引数はイメージの幅、高さ、色数、初期イメージ数、拡張単位です。
イメージリストを初期化したら、イメージリストにアイコンを追加します。まず、CWinApp::LoadIcon()関数でアイコンリソースを読み込みます。次にCImageList::Add()関数で読み込んだアイコンを追加します。
リストコントロールのヘッダ部分はCHeaderCtrlという別クラスで操作します。リストコントロールにはこのクラスのオブジェクトが組み込まれているので、CListCtrl::GetHeaderCtrl()関数でCHeaderCtrlへのポインタを取得します。次にCHeaderCtrl::SetImageList()関数でイメージリストをヘッダコントロールにセットします。
次は各ヘッダ項目にアイコンイメージをセットします。これはリストのカラムを作成した後でないといけません。アイコンをセットするには、CHeaderCtrl::SetItem()関数を使います。この関数には、HDITEM構造体のポインタを渡します。HDITEM.maskメンバには、構造体のどのメンバをセットするのかを指定します。ここではHDI_IMAGEとHDI_FORMATの2つを指定します。
HDITEM.iImageメンバには0から始まるイメージリストのインデックスをセットします。HDITEM.fmtメンバにはヘッダ項目のフォーマットを指定します。HDF_LEFTは左寄せ、HDF_STRINGは文字列の表示、HDF_IMAGEはイメージの表示をあらわします。ここでHDF_IMAGEを指定していないとアイコンイメージが表示されません。
リストアイテムの追加関数は前回と同じです。では、ビルドして実行してみましょう。リストヘッダの項目の左側にアイコンが表示されました。

|