1.イメージリストを作成
2.イメージリストをヘッダコントロールにセット
3.SetItem()でイメージのインデックスを設定
//==== ソート種別 ====//
enum SORTTYPE
{
SORT_UP = 0,
SORT_DOWN,
SORT_NONE
};
CImageList imgList;
void Initialize()
{
//==== ソート表示用イメージリストをセット ====//
imgList.Create(IDB_SORT_UP, 16, 4, RGB(255,255,255));
m_list.GetHeaderCtrl()->SetImageList(&imgList);
}
void SetSortImage(
int column,
SORTTYPE type )
{
HDITEM hi = {0};
hi.mask = HDI_FORMAT | HDI_IMAGE;
hi.fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
hi.iImage = type;
m_list.GetHeaderCtrl()->SetItem(column, &hi);
}
KEYDOWNイベントではEnterキー押下を拾うことが出来ないため、少々面倒な処理を行うことになります。
サブクラス化および派生クラスのWindowプロシージャ内で以下の記述を行います。
LRESULT CTestListCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LPMSG pMsg = NULL;
//==== メッセージ判定 ====//
switch(message)
{
case WM_GETDLGCODE:
if(lParam != 0)
{
pMsg = (LPMSG)lParam;
if( (pMsg->hwnd == GetSafeHwnd()) &&
(pMsg->message == WM_KEYDOWN) )
{
//==== キー判定 ====//
switch(pMsg->wParam)
{
//== Enter ==//
case VK_RETURN:
//~ ここにEnterキー押下時処理を記述 ~//
break;
//== その他 ==//
default:
break;
}
}
}
break;
}
return CListCtrl::WindowProc(message, wParam, lParam);
}
NM_CUSTOMDRAWハンドラをオーバーライドすることでカスタムドローを行います。
描画サイクル開始メッセージ(CDDS_PREERASE)でカスタム描画する項目の指定を行います。
void CnmCustomDrawTestDlg::OnNMCustomdrawListNum(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVCUSTOMDRAW pNMLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
if (!pNMLVCD) {
*pResult = 0;
return;
}
switch(pNMLVCD->nmcd.dwDrawStage)
{
//== 消去サイクルが始まる前 ==//
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
//== アイテムが描画される前 ==//
case CDDS_ITEMPREPAINT: //アイテム単位で処理
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
//== サブアイテムが描画される前 ==//
case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
*pResult = CDRF_DODEFAULT;
//==== サブアイテム判定 ====//
switch (pNMLVCD->iSubItem)
{
case 1:
pNMLVCD->clrText = RGB(0xFF, 0x00, 0x00);
*pResult = CDRF_NEWFONT;
break;
case 2:
pNMLVCD->clrText = RGB(0x00, 0xFF, 0x00);
*pResult = CDRF_NEWFONT;
break;
default: // cade1やcase2で色が変わってしまうので設定する必要がある
pNMLVCD->clrText = ::GetSysColor(COLOR_WINDOWTEXT);
*pResult = CDRF_NEWFONT;
break;
}
break;
//== その他 ==//
default:
*pResult = CDRF_DODEFAULT;
break;
}
}