ON_WM_MEASUREITEM_REFLECT到底是怎么用的?

wangbab 2003-08-04 10:05:48
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); }

这是为什么?创建都可以通过,改变大小就不行?
...全文
657 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zerphy 2003-08-08
  • 打赏
  • 举报
回复
局部变量在生命范围之外就不存在了,所以你的控件在使用font的时候,使用了无效的指针或者引用,所以导致异常。一定要用全局或者成员变量才行。
wangbab 2003-08-06
  • 打赏
  • 举报
回复
高手不愿回答吗?
wangbab 2003-08-05
  • 打赏
  • 举报
回复
自己up
wangbab 2003-08-04
  • 打赏
  • 举报
回复
是的我要改变行高。我需要根据CListCtrl的大小分配每行的高度。是每个Item的高度均匀,并且没有多余的空行。
因为控件在运行是大小要变化,Item的数量也要变化。

我跟踪了一下,发现MesureItem在控件创建是都要调用8次。可是在改变控件大小是是调用了6次就报错。如果CFont无效,那么应该一次也不能通过啊。为什么?
我确实是改变控件的字体。但局部变量有错吗?
zerphy 2003-08-04
  • 打赏
  • 举报
回复
我看出来啦,你是要改变控件的字体吧,必须声明一个全局的变量或者类的成员变量,CFont m_Font;这样创建的字体才正确,否则容易出错!
zerphy 2003-08-04
  • 打赏
  • 举报
回复
怎么改变大小?我怎么没遇到过?你是要改变行高吧?

15,980

社区成员

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

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