void CListTest::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ){
// 再描画するItemの座標を取得
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect(lpDrawItemStruct->rcItem);
int iItem = lpDrawItemStruct->itemID;
_TCHAR szBuff[MAX_PATH];
LVITEM lvItem;
int iCnt = 0;
CRect iRect;
//フォーカスがあるかどうか
BOOL isForcus = GetItemState(iItem, LVIS_FOCUSED) == LVIS_FOCUSED;
int iIndentPix;
int iIndent;
CHeaderCtrl *Head = GetHeaderCtrl();
int iMax = Head->GetItemCount();
while(iMax > iCnt){
//出力座標の初期化
iIndentPix = 0;
//アイテム取得のための設定
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_INDENT;
lvItem.iItem = iItem;
lvItem.iSubItem = iCnt;
lvItem.pszText = szBuff;
lvItem.cchTextMax = sizeof(szBuff);
lvItem.stateMask = LVIS_ACTIVATING | LVIS_FOCUSED | LVIS_SELECTED | LVIS_STATEIMAGEMASK;
if (GetItem(&lvItem) == TRUE){
iIndent = lvItem.iIndent;
if(iCnt == 0){
//アイテムの場合
GetItemRect(iItem, &iRect, LVIR_BOUNDS);
//インデント分の座標計算
iIndentPix = (iIndent > 0) ? iIndent * 16 : 0;
}else{
//サブアイテムの場合
GetSubItemRect(iItem, iCnt, LVIR_BOUNDS, iRect);
}
//選択状態か
DWORD txtColor = ::GetSysColor(COLOR_WINDOWTEXT);
BOOL isSelect = FALSE;
if(GetItemState(iItem, LVIS_SELECTED) == LVIS_SELECTED){
pDC->FillRect(iRect, &CBrush(::GetSysColor(COLOR_HIGHLIGHT)));
txtColor = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
isSelect = TRUE;
}else{
pDC->FillRect(iRect, &CBrush(::GetSysColor(COLOR_WINDOW)));
}
//フォーカスがあるか
if(GetItemState(iItem, LVIS_FOCUSED) == LVIS_FOCUSED){
CPen pen(PS_DOT, 1, ::GetSysColor(COLOR_BTNFACE));
pDC->SelectObject(pen);
CPoint pos[5];
pos[0].x = iRect.left + 1;
pos[0].y = iRect.top;
pos[1].x = iRect.right - 2;
pos[1].y = iRect.top;
pos[2].x = iRect.right - 2;
pos[2].y = iRect.bottom - 2;
pos[3].x = iRect.left + 1;
pos[3].y = iRect.bottom - 2;
pos[4].x = iRect.left + 1;
pos[4].y = iRect.top;
pDC->Polyline(&pos[0], 5);
pen.DeleteObject();
}
pDC->SetTextColor(txtColor);
DWORD uFlag = DT_WORD_ELLIPSIS | DT_SINGLELINE ;
//m_arrAttr はテキストの表示位置を格納しているCArrayのリスト
if(m_arrAttr.GetSize() > iCnt){
PLV_ATTRIBUTE attr = (PLV_ATTRIBUTE)m_arrAttr.GetAt(iCnt);
switch(attr->dwAligne){
case LVAL_CENTER:
uFlag |= DT_CENTER;
break;
case LVAL_RIGHT:
uFlag |= DT_RIGHT;
break;
default:
uFlag |= DT_LEFT;
break;
}
}else{
uFlag |= DT_LEFT;
}
CRect strRect;
strRect = iRect;
strRect.left += 2;
CString outText = lvItem.pszText;
pDC->DrawText(outText,
strRect, uFlag);
}
iCnt++;
}
}
|