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; } }