www.codeguru.com上改变CListCtrl每行高度的例子是afx_msg void MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct );
ON_WM_MEASUREITEM_REFLECT( )
void CMyListCtrl::MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
{
   LOGFONT lf;
   GetFont()->GetLogFont( &lf );   if( lf.lfHeight < 0 )
lpMeasureItemStruct->itemHeight = -lf.lfHeight; 
   else
lpMeasureItemStruct->itemHeight = lf.lfHeight; }
可是在我用的时候,创建CListCtrl时可以用,但改变CListCtrl大小时就报错。
错误代码是
Unhandled expection in TSTON32.EXE(MFC42D.DLL):0xC0000005:Access Violation
程序在此处停下。
_AFXWIN_INLINE int CFont::GetLogFont(LOGFONT* pLogFont)
{   ASSERT(m_hObject != NULL);
    return ::GetObject(m_hObject, sizeof(LOGFONT), pLogFont); }这是为什么?创建都可以通过,改变大小就不行?

解决方案 »

  1.   

    我看出来啦,你是要改变控件的字体吧,必须声明一个全局的变量或者类的成员变量,CFont m_Font;这样创建的字体才正确,否则容易出错!
      

  2.   

    是的我要改变行高。我需要根据CListCtrl的大小分配每行的高度。是每个Item的高度均匀,并且没有多余的空行。
    因为控件在运行是大小要变化,Item的数量也要变化。我跟踪了一下,发现MesureItem在控件创建是都要调用8次。可是在改变控件大小是是调用了6次就报错。如果CFont无效,那么应该一次也不能通过啊。为什么?
    我确实是改变控件的字体。但局部变量有错吗?
      

  3.   

    局部变量在生命范围之外就不存在了,所以你的控件在使用font的时候,使用了无效的指针或者引用,所以导致异常。一定要用全局或者成员变量才行。