[求助]smallicon 样式 CListCtrl 虚拟列表如何设置图标的间距

jaeson83 2013-12-20 03:43:32
我按照网上的方法,做了一个CListCtrl 虚拟列表,设置图标排列方式为smallicon,在OnLvnGetdispinfo()中显示这些数据,现在我想自己设置图标之间的间距,该使用什么方法呢?
...全文
158 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2014-02-11
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
邓学彬 2013-12-23
  • 打赏
  • 举报
回复
CListCtrl行高的修改 http://blog.csdn.net/zp752963831/article/details/3173569 要修改CListCtrl的列表项高度,我们需要自己添加 MeasureItem 的消息响应函数,对应的消息是 WM_MEASUREITEM+WM_REFLECT_BASE, 而不是 WM_MEASUREITEM.在CListBox里我们可以直接在 ClassWizard 里将此消息响应添加进 class 里,但是 CListCtrl 默认是没有这个消息响应的,我们需要手动添加它(注意,这里不是 WM_MEASUREITEM. CListCtrl 仅有 WM_MEASUREITEM, 对应的函数为 OnMeasureItem). 为了响应这个消息,我们还需要给列表加上 LVS_OWNERDRAWFIXED 风格.可以在 Create 列表的时候添加,也可以在 PreCreateWindow 虚函数中添加. 添加 MeasureItem 消息响应函数,首先我们需要在类的头文件中添加: afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); 来声明此消息响应函数; 然后在cpp的消息响应宏中添加: ON_WM_MEASUREITEM_REFLECT() 最后自己建立 MeasureItem 的函数定义:

void CListEx::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if( m_nItemHeight > 0 )
   lpMeasureItemStruct->itemHeight = m_nItemHeight;
}
其中 m_nItemHeight 是我在头文件中声明的一个成员变量,用于从外部修改列表项高度. 然后我们添加一个方法,便于从外部直接修改列表项高度:
//设置行高
void SetItemHeight(UINT nHeight);

//设置行高方法的定义
void CListEx::SetItemHeight(UINT nHeight)
{
m_nItemHeight = nHeight;

CRect rcWin;
GetWindowRect(&rcWin);
WINDOWPOS wp;
wp.hwnd = m_hWnd;
wp.cx = rcWin.Width();
wp.cy = rcWin.Height();
wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;

SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
}
这个方法的最后,使用了 SendMessage 发送 WM_WINDOWPOSCHANGED 消息让 CListCtrl 进入 MeasureItem 的消息响应函数,对列表高度进行修改. 因为我们这里使用了列表的自绘风格,因此列表项需要自己绘制. 首先在类的声明中添加 DrawItem 虚函数声明: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); 然后自画 CListCtrl:
void CListEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
int    nItem = lpDrawItemStruct->itemID;
CDC*   pDC   = CDC::FromHandle(lpDrawItemStruct->hDC);

......

CRect   rcBound, rcLabel, rcIcon;
//获得列表项图标,标签,及项的区域
GetItemRect ( nItem, rcIcon, LVIR_ICON );
GetItemRect ( nItem, rcLabel, LVIR_LABEL );
GetItemRect ( nItem, rcBound, LVIR_BOUNDS );

......

}

现在这个 CListCtrl 的重载类就支持自定义列表项高度了.
jaeson83 2013-12-21
  • 打赏
  • 举报
回复
没有人帮忙吗,这个问题困扰一天了

15,979

社区成员

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

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