CListCtrl 能同时加载不同大小的位图吗?

sjchao 2007-09-17 06:03:33
为一个CListCtrl添加几个item,设为report,如下:
组1
成员1
成员2
组2
成员3
成员4

组的那些item 加载的图标为16*16;
成员的那些item加载的图标为24*24;
能做到吗?
...全文
222 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjchao 2007-09-19
  • 打赏
  • 举报
回复
可以
你会揭贴吗?
-------------不带这样的吧,可以的话,请把实现写一下吧,写了就结帖。
covsno 2007-09-19
  • 打赏
  • 举报
回复
当然你也可以将16*16的图标转成24*24的,只不过有效区仍然是16*16,
JacksonFox 2007-09-19
  • 打赏
  • 举报
回复
楼上的问得好。。。。
顶楼上的。。。
covsno 2007-09-19
  • 打赏
  • 举报
回复
凑合着看吧
covsno 2007-09-19
  • 打赏
  • 举报
回复

.h

CImageList m_imglist,m_imglist2;
afx_msg LRESULT OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult );
virtual void PreSubclassWindow();

.cpp

ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList )

void CMyCustomDrawListCtrl::PreSubclassWindow()
{
CListCtrl::PreSubclassWindow();
}
LRESULT CMyCustomDrawListCtrl::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
static bool bHighlighted = false;

/*
pLVCD->nmcd.dwItemSpec//行号
pLVCD->iSubItem //列号
*/
*pResult = CDRF_DODEFAULT;
switch(pLVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
break;
}
case CDDS_ITEMPREPAINT:
{

*pResult = CDRF_DODEFAULT|CDRF_NOTIFYSUBITEMDRAW;
break;

}
case CDDS_ITEMPOSTPAINT :
{
*pResult = CDRF_DODEFAULT;
break;
}
case CDDS_SUBITEM|CDDS_ITEMPREPAINT :
{
if(pLVCD->iSubItem==1)
{
if(pLVCD->nmcd.dwItemSpec==2)
{
CString str=GetItemText(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem);
CRect mrc,mrc2;
this->GetSubItemRect(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem,0,mrc);
mrc2=mrc;
ScreenToClient(&mrc2);
POINT pt={mrc.left,mrc.top};
::SelectObject(pLVCD->nmcd.hdc,GetFont());
this->m_imglist2.Draw(CDC::FromHandle(pLVCD->nmcd.hdc),1,pt,ILD_TRANSPARENT);
mrc.left+=24;
::DrawText(pLVCD->nmcd.hdc,str,str.GetLength(),&mrc,0);
::InvalidateRect(m_hWnd,mrc2,TRUE);
*pResult=CDRF_DODEFAULT;
*pResult = CDRF_SKIPDEFAULT;
break;
}
if(pLVCD->nmcd.dwItemSpec==1)
{

CString str=GetItemText(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem);
CRect mrc,mrc2;
this->GetSubItemRect(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem,0,mrc);
mrc2=mrc;
ScreenToClient(&mrc2);


POINT pt={mrc.left,mrc.top};
::SelectObject(pLVCD->nmcd.hdc,GetFont());
this->m_imglist.Draw(CDC::FromHandle(pLVCD->nmcd.hdc),1,pt,ILD_TRANSPARENT);
mrc.left+=16;
::DrawText(pLVCD->nmcd.hdc,str,str.GetLength(),&mrc,0);
::InvalidateRect(m_hWnd,mrc2,TRUE);

*pResult=CDRF_DODEFAULT;
*pResult = CDRF_SKIPDEFAULT;
break;
}
}
*pResult=CDRF_DODEFAULT;
break;
}

}
return 1L ;
}

调用

m_SkinList.m_imglist.Create(16,16,ILC_COLOR24|ILC_MASK,0,0);
HBITMAP bmp=::LoadBitmap(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
CBitmap pBitmap;
pBitmap.m_hObject=bmp;
m_SkinList.m_imglist.Add(&pBitmap,RGB(0,255,0));
::DeleteObject(bmp);

bmp=::LoadBitmap(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
pBitmap.m_hObject=bmp;
m_SkinList.m_imglist.Add(&pBitmap,RGB(255,255,255));
::DeleteObject(bmp);


m_SkinList.m_imglist2.Create(24,24,ILC_COLOR24|ILC_MASK,0,0);
bmp=::LoadBitmap(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
pBitmap.m_hObject=bmp;
m_SkinList.m_imglist2.Add(&pBitmap,RGB(0,255,0));
::DeleteObject(bmp);

bmp=::LoadBitmap(::AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
pBitmap.m_hObject=bmp;
m_SkinList.m_imglist2.Add(&pBitmap,RGB(255,255,255));
::DeleteObject(bmp);

char pingdao[32]={0};//
LV_COLUMN lvcolumn;
CRect rect;

this->m_SkinList.GetWindowRect(&rect);
char* rgtsz[16]={"测试1","测试2","测试3"};
for(int i=0;i<3;i++)
{
lvcolumn.cx = rect.Width()/3;
lvcolumn.mask = LVCF_FMT|LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.iOrder=i;
m_SkinList.InsertColumn(i, &lvcolumn);
}

for(int nIndex=0;nIndex<3;nIndex++)
{
LV_ITEM lvitemAdd={0};
lvitemAdd.mask=LVIF_TEXT;
lvitemAdd.iItem=nIndex;
lvitemAdd.iSubItem=0;

lvitemAdd.pszText="ch";
if(-1!=m_SkinList.InsertItem(&lvitemAdd))
{
LV_ITEM lvitem={0};
lvitem.mask=LVIF_TEXT;
lvitem.iItem=nIndex;
lvitem.iSubItem=1;
lvitem.pszText=_T("nodeCPT");
m_SkinList.SetItem(&lvitem);

memset(&lvitem,0,sizeof(lvitem));

lvitem.mask=LVIF_TEXT;
lvitem.iItem=nIndex;
lvitem.iSubItem=2;
lvitem.pszText=_T("sdfsdf");
m_SkinList.SetItem(&lvitem);
}
}
ListView_SetExtendedListViewStyle(m_SkinList.m_hWnd, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP);

covsno 2007-09-18
  • 打赏
  • 举报
回复
可以
2个ImageList就行了
vocanicy 2007-09-18
  • 打赏
  • 举报
回复
CListCtrl肯定不行,你得找第三方写的List控件
Chivalry 2007-09-18
  • 打赏
  • 举报
回复
够呛
好像得使用ImageList,但是这个图像大小是固定好的
sjchao 2007-09-18
  • 打赏
  • 举报
回复
怎么又没人理睬啊,人丁渐少啊
covsno 2007-09-18
  • 打赏
  • 举报
回复
可以
你会揭贴吗?
sjchao 2007-09-18
  • 打赏
  • 举报
回复
可以
2个ImageList就行了
-----------------------
能给出实现代码吗?要同时能显示的。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧