MFC ListView:开始项目编辑时崩溃(LVN_BEGINLABELEDIT)

时间:2015-11-25 16:33:33

标签: listview mfc access-violation ownerdrawn

我在报告模式下使用CListView和所有者绘制的项目,现在我想添加编辑项目的功能(然后将其扩展到子项目)。 CListView使用这些参数进行实例化(LVS_REPORT由程序的其他部分保证):

BOOL CMyListView::PreCreateWindow(CREATESTRUCT &cs){
    if (!CListView::PreCreateWindow(cs)) return FALSE;
    cs.style|= LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS | LVS_NOLABELWRAP | LVS_EDITLABELS;
    return TRUE;
}

显然,列表视图中的每个项目都是指向所有者用于在请求时绘制项目的结构的指针。为了捕获列表视图开始编辑项目的那一刻,我正在处理LVN_BEGINLABELEDIT通知:

// in list view message map
ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT,OnEditBegin)

问题是程序在离开相应的处理程序时崩溃了:

afx_msg void CMyListView::OnEditBegin(NMHDR *pNMHDR,LRESULT *pResult){
    ::Beep(1000,10); // just beep
    *pResult=TRUE; // and don't allow editing now
} // bonus feature: a crash

尝试处理LVN_GETDISPINFO通知,但是在没有设置指针的情况下接收了项目信息(可能LVS_OWNERDRAWFIXED不能与LVS_OWNERDATA结合使用;写这个问题时不能检查MSDN):

// the way item added to list view
LVITEM lvi={ LVIF_TEXT|LVIF_PARAM };
lvi.iItem=i++;
lvi.pszText=sr->jmeno; // for the "Large icons" mode
lvi.lParam=sr->param;

// LVN_GETDISPINFO notification handler
afx_msg void CMyListView::OnGetDispInfo(NMHDR *pNMHDR,LRESULT *pResult){
    NMLVDISPINFO *info=(NMLVDISPINFO *)pNMHDR;
    info->item.pszText=(LPSTR)info->item.lParam; // lParam received as unset
    *pResult=0;
}

尝试将列表视图切换为"大图标"模式(必须使用字符串表示项目,而不仅仅是指针),但结果相同 - 一个很好的大记忆读取违规。

将Visual Studio 2010 Express与旧版MFC6一起使用(也就是说,我无法追踪MFC源以轻松找出狗所在的位置)。

非常感谢任何帮助/建议,非常感谢!

亲切的问候,

托马斯

0 个答案:

没有答案