リストコントロール

ヘッダ部へのイメージ表示

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

Enterキー押下イベント

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