SetExtendedStyle(LVS_EX_FULLROWSELECT);
dwStyleEx = ListView_GetExtendedListViewStyle( g.hList );
dwStyleEx |= ( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
ListView_SetExtendedListViewStyle( g.hList, dwStyleEx );
// オーバーライド
// ClassWizard は仮想関数のオーバーライドを生成します。
//{{AFX_VIRTUAL(CMyListCtrl)
public:
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
//}}AFX_VIRTUAL
//{{AFX_MSG(CMyListCtrl)
// メモ - ClassWizard はこの位置にメンバ関数を追加または削除します。
protected:
COLORREF m_clrBgFirst;
COLORREF m_clrBgSecond;
COLORREF m_clrFgFirst;
COLORREF m_clrFgSecond;
//}}AFX_MSG
CMyListCtrl::CMyListCtrl()
{
// 色のデフォルト値を設定
m_clrBgFirst = ::GetSysColor( COLOR_WINDOW);
// とりあえず赤に設定
m_clrBgSecond = RGB( 255,0,0);
m_clrFgFirst = ::GetSysColor( COLOR_WINDOWTEXT);
m_clrFgSecond = ::GetSysColor( COLOR_WINDOWTEXT);
}
// 最初とその他の列用のオフセット
#define OFFSET_FIRST 2
#define OFFSET_OTHER 6
// オーナードローによる、縞々+1行選択表示ListView
// このルーチンは1行毎に呼ばれるので、まず左端のアイテムを描画
// その後、サブアイテムを、カラム数だけ描画するようになっている。
// 参考:http://athomejp.com/goldfish/mfc/listview/zebralistview.asp
// このサンプルは縞々だけだが、一部改造して1行選択表示させるようにした
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// FromHandleからディバイスコンテキストを取得
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
// 再描画するItemの座標を取得
CRect rcItem(lpDrawItemStruct->rcItem);
// 背景を透明にするフラグ(イメージデータ用)
UINT uiFlags = ILD_TRANSPARENT;
// イメージオブジェクト格納アドレス
CImageList* pImageList;
// アイテムのID
int nItem = lpDrawItemStruct->itemID;
// 現在コントロールにフォーカスがあるか否かの
// フラグを設定
BOOL bFocus = FALSE;
if( GetFocus() == this) {
bFocus = TRUE;
}
// 描画する色
COLORREF clrTextSave, clrBkSave;
COLORREF clrImage = m_clrBgFirst;
_TCHAR szBuff[MAX_PATH];
LPCTSTR pszText;
// アイテム データを取得します。
// つまり行の左端のデータを取得
LV_ITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.pszText = szBuff;
lvi.cchTextMax = sizeof(szBuff);
lvi.stateMask = 0xFFFF;
// すべての状態フラグを取得します。
GetItem(&lvi);
// アイテムが選択状態か否かのフラグを設定
BOOL bSelected =
(bFocus || (GetStyle() & LVS_SHOWSELALWAYS))
&& lvi.state & LVIS_SELECTED;
bSelected = bSelected || (lvi.state & LVIS_DROPHILITED);
// アイテムの表示されている幅を取得
CRect rcAllLabels;
GetItemRect(nItem, rcAllLabels, LVIR_BOUNDS);
// アイテムのラベルの幅を取得
CRect rcLabel;
GetItemRect(nItem, rcLabel, LVIR_LABEL);
// 左の位置を同じにする
rcAllLabels.left = rcLabel.left;
// 文字の横幅を取得
CSize szSize = pDC->GetTextExtent( szBuff, strlen( szBuff));
// 塗りつぶし範囲を文字部分にする(これが標準だが使わない)
CRect rcItemStr;
rcItemStr = rcLabel;
rcItemStr.right = rcItemStr.left + szSize.cx + OFFSET_OTHER;
// 行の塗りつぶしを行う
// 偶数番目ならm_clrBgFirst、奇数番目ならm_clrBgSecondで塗る
if( (nItem % 2) == 0) {
pDC->FillRect(rcAllLabels,&CBrush(m_clrBgFirst));
}
else {
pDC->FillRect(rcAllLabels,&CBrush(m_clrBgSecond));
}
// 選択されている場合は、選択色で1行塗りつぶし
// 標準では、文字部分のみ選択になる
if( bSelected == TRUE) {
pDC->FillRect(rcAllLabels,&CBrush(m_clrBgSelect));
}
// ココラ辺はアイコン描画対応らしいが、このプログラムでは使用しない
// 色を設定してアイコンをマスクします。
if((lvi.state & LVIS_CUT) == LVIS_CUT ) {
if( (nItem % 2) == 0) {
clrImage = m_clrBgFirst;
}
else {
clrImage = m_clrBgSecond;
}
uiFlags |= ILD_BLEND50;
}
else if( bSelected == TRUE) {
clrImage = ::GetSysColor(COLOR_HIGHLIGHT);
uiFlags |= ILD_BLEND50;
}
// 状態アイコンを描画します。
UINT nStateImageMask =
lvi.state & LVIS_STATEIMAGEMASK;
if( nStateImageMask == LVIS_STATEIMAGEMASK) {
int nImage = (nStateImageMask>>12) - 1;
pImageList =
GetImageList(LVSIL_STATE);
if (pImageList) {
pImageList->Draw(pDC, nImage,
CPoint(rcItem.left, rcItem.top), ILD_TRANSPARENT);
}
}
// 通常のアイコンとオーバーレイアイコンを描画します。
CRect rcIcon;
GetItemRect(nItem, rcIcon, LVIR_ICON);
pImageList = GetImageList(LVSIL_SMALL);
if( pImageList != NULL) {
UINT nOvlImageMask =
lvi.state & LVIS_OVERLAYMASK;
if( rcItem.left < rcItem.right - 1 ) {
ImageList_DrawEx(
pImageList->m_hImageList, lvi.iImage,
pDC->m_hDC,
rcIcon.left,rcIcon.top, 16, 16,
m_clrBgFirst, clrImage,
uiFlags | nOvlImageMask);
}
}
// アイテムのラベルを描きます。
// つまり左端のセルのTEXTを描く
GetItemRect(nItem, rcItem, LVIR_LABEL);
pszText = MakeShortString(pDC, szBuff,
rcItem.right-rcItem.left,
2*OFFSET_FIRST);
rcLabel = rcItem;
rcLabel.left += OFFSET_FIRST;
rcLabel.right -= OFFSET_FIRST;
// 選択状態ならば、システム標準の選択色でTextを描画する
if( bSelected == TRUE) {
clrTextSave =
pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
clrBkSave =
pDC->SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
}
pDC->DrawText(pszText,-1, rcLabel,
DT_LEFT |
DT_SINGLELINE |
DT_NOPREFIX |
DT_NOCLIP |
DT_VCENTER);
// カラム用のラベルを描画
// つまり左から2番目〜右端までのセルのTEXTを描画する
LV_COLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH;
// 選択色を元の色に戻す(1行選択なので、この時点では戻さない)
// if( bSelected == TRUE) {
// clrTextSave = pDC->SetTextColor( clrTextSave);
// clrBkSave = pDC->SetBkColor( clrBkSave);
// }
// カラム数分だけ、サブアイテムのTEXTを描画する
for( int nColumn = 1; GetColumn(nColumn, &lvc); nColumn++) {
rcItem.left = rcItem.right;
rcItem.right += lvc.cx;
int nRetLen =
GetItemText(nItem, nColumn,
szBuff, sizeof(szBuff));
if( nRetLen == 0) {
continue;
}
pszText = MakeShortString(pDC, szBuff,
rcItem.right - rcItem.left,
2*OFFSET_OTHER);
UINT nJustify = DT_LEFT;
if( pszText == szBuff) {
switch(lvc.fmt & LVCFMT_JUSTIFYMASK) {
case LVCFMT_RIGHT:
nJustify = DT_RIGHT;
break;
case LVCFMT_CENTER:
nJustify = DT_CENTER;
break;
default:
break;
}
}
rcLabel = rcItem;
rcLabel.left += OFFSET_OTHER;
rcLabel.right -= OFFSET_OTHER;
pDC->DrawText(pszText, -1, rcLabel,
nJustify | DT_SINGLELINE |
DT_NOPREFIX | DT_NOCLIP |
DT_VCENTER);
}
// 1行選択時は、色を元に戻しておく
if( bSelected == TRUE) {
clrTextSave = pDC->SetTextColor( clrTextSave);
clrBkSave = pDC->SetBkColor( clrBkSave);
}
// アイテムがフォーカスを持っているときに
// その選択枠を描画する
if( (lvi.state & LVIS_FOCUSED) ==
LVIS_FOCUSED && bFocus == TRUE) {
pDC->DrawFocusRect(rcItemStr);
}
}
m_mylistctrl.SubclassDlgItem( IDC_MYLISTCTRL, this );
Parsing error: "afx_msg"が必要です。
インプットライン:"protected"