MEASUREITEM的有关问题
MEASUREITEM的问题
我自绘listctrl,想通过重写measureitem来改变行高,
void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lp)
{
lp->itemHeight=60;
}
为什么始终进入不了这里,行高也改变不了
------解决方案--------------------
CListCtrl改变行高
1. 表的修改
新建一个MFC类CMyListCtrl,其基类为CListCtrl,属性Owner Draw Fixed设置为TRUE;
添加变量CMyListCtrl m_List;MyListCtrl.h文件里,添加变量int m_nRowHeight;
2、重载DrawItem()实现自绘,实现请参照以下代码。
手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。
void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (m_nRowHeight>0)
{
lpMeasureItemStruct->itemHeight = m_nRowHeight;
}
}
3、添加ON_WM_MEASUREITEM,响应消息处理OnMeasureItem()
void CMyListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
4、void CMyListCtrl::SetRowHeigt(int nHeight) //高置行高(别忘了在.h里添加void SetRowHeigt(int nHeight) ;)
{
m_nRowHeight = 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);
}
5、重画列表控件,重载DrawItem,添加ON_WM_DRAWITEM();
(别忘了在.h里添加void DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) ;)
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct)
{
CDC* pDC = CDC::FromHandle(lpMeasureItemStruct->hDC);
LVITEM lvi = {0};
lvi.mask = LVIF_STATE;//
------解决方案--------------------
LVIF_IMAGE;
lvi.stateMask = LVIS_FOCUSED
------解决方案--------------------
LVIS_SELECTED ;
lvi.iItem = lpMeasureItemStruct->itemID;
BOOL bGet = GetItem(&lvi);
//高亮显示
BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)
------解决方案--------------------
((lvi.state & LVIS_SELECTED) &&
((GetFocus() == this)
------解决方案--------------------
我自绘listctrl,想通过重写measureitem来改变行高,
void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lp)
{
lp->itemHeight=60;
}
为什么始终进入不了这里,行高也改变不了
measureitem
行高
------解决方案--------------------
CListCtrl改变行高
1. 表的修改
新建一个MFC类CMyListCtrl,其基类为CListCtrl,属性Owner Draw Fixed设置为TRUE;
添加变量CMyListCtrl m_List;MyListCtrl.h文件里,添加变量int m_nRowHeight;
2、重载DrawItem()实现自绘,实现请参照以下代码。
手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。
void CMyListCtrl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (m_nRowHeight>0)
{
lpMeasureItemStruct->itemHeight = m_nRowHeight;
}
}
3、添加ON_WM_MEASUREITEM,响应消息处理OnMeasureItem()
void CMyListCtrl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
4、void CMyListCtrl::SetRowHeigt(int nHeight) //高置行高(别忘了在.h里添加void SetRowHeigt(int nHeight) ;)
{
m_nRowHeight = 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);
}
5、重画列表控件,重载DrawItem,添加ON_WM_DRAWITEM();
(别忘了在.h里添加void DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) ;)
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct)
{
CDC* pDC = CDC::FromHandle(lpMeasureItemStruct->hDC);
LVITEM lvi = {0};
lvi.mask = LVIF_STATE;//
------解决方案--------------------
LVIF_IMAGE;
lvi.stateMask = LVIS_FOCUSED
------解决方案--------------------
LVIS_SELECTED ;
lvi.iItem = lpMeasureItemStruct->itemID;
BOOL bGet = GetItem(&lvi);
//高亮显示
BOOL bHighlight =((lvi.state & LVIS_DROPHILITED)
------解决方案--------------------
((lvi.state & LVIS_SELECTED) &&
((GetFocus() == this)
------解决方案--------------------