电气学员 发表于 2016-6-1 10:27:23

win32 sdk listview自绘

LRESULT ListViewCustomDraw(HWND hwnd, NMLVCUSTOMDRAW* pcd)
{   
    int nResult = CDRF_DODEFAULT;   
      
    if (CDDS_PREPAINT == pcd->nmcd.dwDrawStage)
    {
             return CDRF_DODEFAULT | CDRF_NOTIFYSUBITEMDRAW;
    }
    else if (CDDS_ITEMPREPAINT == pcd->nmcd.dwDrawStage)
    {
       return nResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pcd->nmcd.dwDrawStage)
    {
      nResult = CDRF_SKIPDEFAULT;
         
      const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;
         
      HDC hdc = pcd->nmcd.hdc;   
      SetBkMode(hdc,TRANSPARENT);
      int nItem = pcd->nmcd.dwItemSpec;   
      int nSubItem = pcd->iSubItem;   
         
      BOOL bItemSelected = ListView_GetItemState(hwnd, nItem, LVIS_SELECTED);
         
      RECT subItemRect;
       ListView_GetSubItemRect(hwnd, nItem, nSubItem, LVIR_BOUNDS, &subItemRect);
      
      HBRUSH brsh=0;   
      if (bItemSelected)
      {   
         brsh=CreateSolidBrush(RGB(255, 128, 128));
            FillRect(hdc, &subItemRect,brsh);
      }
       else
      {
         brsh=CreateSolidBrush(RGB(51+nItem*30, 153, 255-nItem*30));
            FillRect(hdc, &subItemRect,brsh);
      }
      if(brsh) DeleteObject(brsh);

       TCHAR szText;
      ListView_GetItemText(hwnd, nItem, nSubItem, szText, 260);
      DrawText(hdc, szText, strlen(szText), &subItemRect, dwStyle);
    }
return nResult;
}

代码如上,始终无法进入CDDS_ITEMPREPAINT | CDDS_SUBITEM,能进入CDDS_PREPAINT消息。
CreateWindow时已经加入了LVS_REPORT样式。
希望大神指教一二。

电气学员 发表于 2016-6-2 08:56:41

怎么没人来指点一下啊???{:10_249:}

玉明星语123 发表于 2016-6-15 19:52:56

顶顶顶~
页: [1]
查看完整版本: win32 sdk listview自绘