如何实现使用LVS_ICON风格的CListCtrl自绘

simon_186 2007-03-12 11:52:35
已试过重载DrawItem函数,并设置LVS_OWNERDRAWFIXED,但没用,后来查到是LVS_OWNERDRAWFIXED只支持列表风格LVS_REPORT,所以DrawItem函数在LVS_ICON风格下没有被调用.
请问:要使用LVS_ICON,怎样实现CListCtrl的自绘
...全文
2237 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwt861103 2010-05-16
  • 打赏
  • 举报
回复
我之前试过,好像用CustomDraw和DrawItem都无法实现,
我是通过在OnPaint中自己绘制的,有需要可以到我的空间中去看一下!
simon_186 2007-07-25
  • 打赏
  • 举报
回复
To ghl3005(), 谢谢
结帖
lyg_zy 2007-07-03
  • 打赏
  • 举报
回复
关注中!我也考虑重新做一窗口算了.
ghl3005 2007-05-10
  • 打赏
  • 举报
回复
已经实现,
void CCAGENT::OnCustomdrawList ( NMHDR* pNMHDR, LRESULT* pResult )
{NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

*pResult = 0;

// Request item-specific notifications if this is the
// beginning of the paint cycle.

if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the beginning of an item's paint cycle.
LVITEM rItem;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
CDC* pDC = CDC::FromHandle ( pLVCD->nmcd.hdc );
COLORREF crBkgnd;
BOOL bListHasFocus;
CRect rcItem;
CRect rcText;
CString sText;
UINT uFormat;

bListHasFocus = ( m_agentList.GetSafeHwnd() == ::GetFocus() );

// Get the image index and selected/focused state of the
// item being drawn.
ZeroMemory ( &rItem, sizeof(LVITEM) );
rItem.mask = LVIF_IMAGE | LVIF_STATE;
rItem.iItem = nItem;
rItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
m_agentList.GetItem ( &rItem );

// Get the rect that holds the item's icon.
m_agentList.GetItemRect ( nItem, &rcItem, LVIR_ICON );

// Draw the icon.
uFormat = ILD_TRANSPARENT;

if ( ( rItem.state & LVIS_SELECTED ) && bListHasFocus )
uFormat |= ILD_FOCUS;

m_listImage.Draw ( pDC, rItem.iImage, rcItem.TopLeft(), uFormat );


// Get the rect that bounds the text label.
m_agentList.GetItemRect ( nItem, rcItem, LVIR_LABEL ); //把这行去掉就没有文字.


// Draw the background of the list item. Colors are selected
// according to the item's state.

if ( rItem.state & LVIS_SELECTED )
{
if ( bListHasFocus )
{
crBkgnd = GetSysColor ( COLOR_HIGHLIGHT );
pDC->SetTextColor ( GetSysColor ( COLOR_HIGHLIGHTTEXT ));
}
else
{
crBkgnd = GetSysColor ( COLOR_BTNFACE );
pDC->SetTextColor ( GetSysColor ( COLOR_BTNTEXT ));
}
}
else
{
crBkgnd = GetSysColor ( COLOR_WINDOW );
pDC->SetTextColor ( GetSysColor ( COLOR_BTNTEXT ));
}

// Draw the background & prep the DC for the text drawing. Note
// that the entire item RECT is filled in, so this emulates the full-
// row selection style of normal lists.
pDC->FillSolidRect ( rcItem, crBkgnd );
pDC->SetBkMode ( TRANSPARENT );


// Tweak the rect a bit for nicer-looking text alignment.
rcText = rcItem;
// Draw the text.
sText = m_agentList.GetItemText ( nItem, 0 );

pDC->DrawText ( sText, CRect::CRect(rcText.left+3,rcText.top,rcText.right,rcText.bottom+60), DT_VCENTER );



// Draw a focus rect around the item if necessary.
if ( bListHasFocus && ( rItem.state & LVIS_FOCUSED ))
{
pDC->DrawFocusRect ( rcItem );
}

*pResult = CDRF_SKIPDEFAULT; // We've painted everything.
}
}




m_agentList.SetIconSpacing(150, 150);
用他来调整图标距离 qq:1600564
simon_186 2007-03-20
  • 打赏
  • 举报
回复
没有人回了吗?分不够的话可以再加
simon_186 2007-03-19
  • 打赏
  • 举报
回复
关于这个问题,我开了个相关的帖子,大家有兴趣的话,可以去看看
http://community.csdn.net/Expert/topic/5401/5401723.xml?temp=.3764002
长尾巴的悟空 2007-03-17
  • 打赏
  • 举报
回复
加油,UP一下.
simon_186 2007-03-16
  • 打赏
  • 举报
回复
我试过了OnCustomDraw,但是还是存在问题。
已用方法:
在OnCustomDraw中只绘制图标,而不绘制文字。
结果:
文字是没有出现,但文字区域依然存在,项之间的间隙很大,而且鼠标左键单击该区域就选中了项。
我希望的效果是去掉文字区域,使各项紧密排列为一行,listctrl控件的高度就等于图标的高度。
菜牛 2007-03-13
  • 打赏
  • 举报
回复
不如自己重新做个窗口简单了。
happyness44 2007-03-13
  • 打赏
  • 举报
回复
LVS_REPORT经过重绘能达到LVS_ICON风格的效果
simon_186 2007-03-12
  • 打赏
  • 举报
回复
没有人知道怎样做吗?

15,981

社区成员

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

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