列表框实现每个标题是图片。 我想做个列表框,可以实现背景有图片,每个标题不是文字的是图片的。希望大家给给提示。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 listCtrl重绘一下吧也可以通过自定义控件实现 listbox属性为onwedrawfixed,no strings,multicomn,。。效应WM_DRAWITEM。自绘。 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_DRAWITEM2。 LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS, 另外: 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) schlafenhamster你的很详细, 我想问下我用的LISTCONTROL,你提供的也适用吗?可以加你的qq问吗? 补充下,我用的是ListControl这个控件。我想实现的效果 我的qq47517680,希望大家能够帮帮忙!是不是 首先我建的类要继承CListctrl? 你说列表框。我以为listbox。listcontrol不是这样的。 shenme 东西啊 ListControl方面能不能给提示下。 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 我想背景用PNG的图 可是网上的基本都是bmp的 有没有能给解决下 有人告诉我ListCtrlEx这个比较强大,是否能实现我说的功能? 100分啊,竟然没人领啊,CSDN高人哪里去了啊?!!!!难道非得问些什么循环走不通啊这类的问题才有人解决?!!! 看来还是什么“程序员路在何方”啊,“我的程序员之路”啊这类的帖子有人跟,因为不需要技术,大家吹水,Happy啊! DLL定义几个类//每个类前面__declspec(dllexport) 请教一个编辑框控件输入数据的问题 今天真是晕了,怎么这么奇怪的问题 请问在VC中怎么修改工程名? 如何控制线程的运行时间? 请问窗口拖放是怎么实现的?? 电脑如何出牌(在线等) 在线程函数中声明CSocket对象,为何Create或Connect出错? 内存DC有何用处,如何和一个hbitmap关联,如何在屏幕上画出来? 请教一个很简单的问题,线程画矩形的问题 关于CreateMutex的第三个参数设置多用户启动一个进程的问题 神奇的消息。。。。。
也可以通过自定义控件实现
效应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,
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)
你的很详细, 我想问下我用的LISTCONTROL,你提供的也适用吗?可以加你的qq问吗?
我想实现的效果
是不是 首先我建的类要继承CListctrl?
listcontrol不是这样的。
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
难道非得问些什么循环走不通啊这类的问题才有人解决?!!!