我想做个列表框,可以实现背景有图片,每个标题不是文字的是图片的。希望大家给给提示。

解决方案 »

  1.   

    listCtrl重绘一下吧
    也可以通过自定义控件实现
      

  2.   

    listbox属性为onwedrawfixed,no strings,multicomn,。。
    效应WM_DRAWITEM。自绘。
      

  3.   

    SDK: case WM_DRAWITEM:

    if((UINT) wParam==IDC_LISTBOX)
    {
    LPDRAWITEMSTRUCT pDI=(LPDRAWITEMSTRUCT) lParam;
    HBRUSH brsh=CreateSolidBrush(RGB(255-30*pDI->itemID, 128+40*pDI->itemID, 128+40*pDI->itemID));//yellow
    FillRect(pDI->hDC,&pDI->rcItem,brsh);
    DeleteObject(brsh);
    //
    if(pDI->itemID==0)
    {
    HDC hMemDC=CreateCompatibleDC(GetDC(hwnd));
    HBITMAP bmp=LoadBitmap(m_hInst,MAKEINTRESOURCE(IDB_NI_HAO));
    HBITMAP oldbmp=(HBITMAP)SelectObject(hMemDC,bmp);
    BitBlt(pDI->hDC,pDI->rcItem.left,pDI->rcItem.top,
    pDI->rcItem.right-pDI->rcItem.left,
    pDI->rcItem.bottom-pDI->rcItem.top,
    hMemDC,0,0,SRCCOPY);
    SelectObject(g_hMemDC,oldbmp);
    DeleteObject(bmp);
    DeleteDC(hMemDC);
    }
    else
    { // text 
    //
    SetBkMode(pDI->hDC,TRANSPARENT);
    char szText[260];
    SendMessage(m_hListBox,LB_GETTEXT,pDI->itemID,(LPARAM)szText);
    const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;
    DrawText(pDI->hDC, szText, strlen(szText), &pDI->rcItem, dwStyle);
    }
    }
    break;要点:
    1 。WM_DRAWITEM
    2。 LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS,
      

  4.   

    另外: case WM_MEASUREITEM://ODT_LISTBOX
    if((UINT) wParam==IDC_LISTBOX)
    {
    LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam;
    lpmis->itemWidth=100;
    lpmis->itemHeight=22;
    }
    break;WM_MEASUREITEM
    都在:
    LRESULT APIENTRY WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) 
      

  5.   

    schlafenhamster
    你的很详细, 我想问下我用的LISTCONTROL,你提供的也适用吗?可以加你的qq问吗?
      

  6.   

    补充下,我用的是ListControl这个控件。
    我想实现的效果
      

  7.   

    我的qq47517680,希望大家能够帮帮忙!
    是不是 首先我建的类要继承CListctrl?
      

  8.   

    你说列表框。我以为listbox。
    listcontrol不是这样的。
      

  9.   

    shenme   东西啊 
      

  10.   

    ListControl方面能不能给提示下。
      

  11.   

    SDK://////////////////////////////////////////////////////////////
    LRESULT ListViewCustomDraw(HWND hwnd, LPARAM lParam)
    {
    LPNMHDR pnmh = (LPNMHDR) lParam;
            
        if (pnmh->code != NM_CUSTOMDRAW) return 0;

    LPNMLVCUSTOMDRAW lpNMCustomDraw = (LPNMLVCUSTOMDRAW) lParam; int nResult = CDRF_DODEFAULT; 

    if (CDDS_PREPAINT == lpNMCustomDraw->nmcd.dwDrawStage)
    {
    nResult = CDRF_NOTIFYITEMDRAW;
    }
    else if (CDDS_ITEMPREPAINT == lpNMCustomDraw->nmcd.dwDrawStage)
    {
    nResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ((CDDS_ITEMPREPAINT | CDDS_SUBITEM) == lpNMCustomDraw->nmcd.dwDrawStage)
    {
    nResult = CDRF_SKIPDEFAULT;

    const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;

    HDC hdc = lpNMCustomDraw->nmcd.hdc; 
    SetBkMode(hdc,TRANSPARENT);
    int nItem = (int)lpNMCustomDraw->nmcd.dwItemSpec; 
    int nSubItem = lpNMCustomDraw->iSubItem; 

    BOOL bItemSelected = ListView_GetItemState(hwnd, nItem, LVIS_SELECTED);

    RECT subItemRect;
    ListView_GetSubItemRect(hwnd, nItem, nSubItem, LVIR_BOUNDS, &subItemRect);
    //
    HBRUSH brsh=0; 
    if (bItemSelected)
    {  //OutputDebugString("bItemSelected\n");
    brsh=CreateSolidBrush(RGB(255, 128, 128));
    FillRect(hdc, &subItemRect,brsh);
    }
    else
    {// not Selected
    brsh=CreateSolidBrush(RGB(51+nItem*30, 153, 255-nItem*30));
    FillRect(hdc, &subItemRect,brsh);
    }
    if(brsh) DeleteObject(brsh);
    //
    if(nSubItem==0)
    {//OutputDebugString("bmp\n");
    RECT iconRect;
    ListView_GetSubItemRect(hwnd, nItem, nSubItem, LVIR_ICON, &iconRect);
    OffsetRect(&iconRect, -1, 0);
    HBITMAP oldbmp=(HBITMAP)SelectObject(g_hMemDC,g_hbmNormal);
    BitBlt(hdc,iconRect.left, iconRect.top, 16, 16,g_hMemDC,0,0,SRCCOPY);
    SelectObject(hdc,oldbmp);
    }
    //
    TCHAR szText[260];
    ListView_GetItemText(hwnd, nItem, nSubItem, szText, 260);
            OffsetRect(&subItemRect, 18, 0);
    DrawText(hdc, szText, strlen(szText), &subItemRect, dwStyle);
    }
    return nResult;
    }
    winproc中:
    case WM_NOTIFY:
    if(wParam==IDC_LISTVIEW)
    {
    return (ListViewCustomDraw(m_hListView, lParam));
    }CustomDraw
      

  12.   

    我想背景用PNG的图 可是网上的基本都是bmp的 有没有能给解决下
      

  13.   

    有人告诉我ListCtrlEx这个比较强大,是否能实现我说的功能?
      

  14.   

    100分啊,竟然没人领啊,CSDN高人哪里去了啊?!!!!
    难道非得问些什么循环走不通啊这类的问题才有人解决?!!!
      

  15.   

    看来还是什么“程序员路在何方”啊,“我的程序员之路”啊这类的帖子有人跟,因为不需要技术,大家吹水,Happy啊!