list control 自绘的问题。
我为了调节没一行的高度。 从网上找了代码自己画了。 但是 行的高度的确是高的,可数据不显示了。 因为我在每一行加的有右键菜单,可以查看每一行的信息。 信息依然能查,就是看不到数据,就跟上边挡了块白板一样。
请问这个问题怎么解决? 下边是我找的代码。 请多指点。
添加 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 );
......
}