list control 自绘的问题。

blue12_sky322 2010-03-04 02:19:12
我为了调节没一行的高度。 从网上找了代码自己画了。 但是 行的高度的确是高的,可数据不显示了。 因为我在每一行加的有右键菜单,可以查看每一行的信息。 信息依然能查,就是看不到数据,就跟上边挡了块白板一样。

请问这个问题怎么解决? 下边是我找的代码。 请多指点。



添加 MeasureItem 消息响应函数,首先我们需要在类的头文件中添加:

afx_msg void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

来声明此消息响应函数;

然后在cpp的消息响应宏中添加:

ON_WM_MEASUREITEM_REFLECT()

最后自己建立 MeasureItem 的函数定义:

/////////////////////////////////////////////////////////////////////////////
// CListEx message handlers

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 );

......

}
...全文
249 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
blue12_sky322 2010-03-06
  • 打赏
  • 举报
回复
问题我自己解决了。我在 VC知识库里看了一片文章。
http://www.vckbase.com/document/viewdoc/?id=551

在CSDN 和 VC知识库学到很多东西。 多谢各位,分不多。请包涵。
M_S_D_N 2010-03-04
  • 打赏
  • 举报
回复
如果想保留list ctrl大部分原始功能,建议使用NM_CUSTOMDRAW通知消息。
blue12_sky322 2010-03-04
  • 打赏
  • 举报
回复
Item State你取出这些标志位,用不同的颜色字体画,
我不太理解, 能否举个例子之类的? 谢谢了
cdsnpeter 2010-03-04
  • 打赏
  • 举报
回复
ListCtrl有个Item State,用来标识是否选中,是否要高亮显示等等。
你取出这些标志位,用不同的颜色字体画就是了。
blue12_sky322 2010-03-04
  • 打赏
  • 举报
回复
请问楼上的 ,要 怎么在DrawItem 中画 ItemText, 还有就是能保证 list control本来的功能,如鼠标停留时字体变栏,选择后高亮显示等?
cpp2017 2010-03-04
  • 打赏
  • 举报
回复
贴出你DrawItem中的详细代码。
cdsnpeter 2010-03-04
  • 打赏
  • 举报
回复
DrawItem中要画ItemText啊。

另外注意前景色,是不是就是白色。可以使用SetTextColor设置前景色。
还有就是坐标要算正确。多Trace代码,找找原因吧。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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