Mfc 调用CListCtrl::InsertItem()方法会引发什么消息或事件?

Mfc 调用CListCtrl::InsertItem()方法会引发什么消息或事件?,mfc,listview,ownerdrawn,Mfc,Listview,Ownerdrawn,我正计划实现CListCtrl的所有者绘制。我认为在将项插入控件之后才绘制项。因此,我的方法是声明一个从CListCtrl派生的类,并重写其DrawItem()方法。问题是在插入项目后,DrawItem从未被调用。我的方法有什么问题吗 谢谢大家! 您需要在控件上设置LBS_OWNERDRAWFIXED样式。您可以在资源模板中执行此操作,也可以使用ModifyStyle()函数以编程方式执行此操作 例如: m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED,

我正计划实现CListCtrl的所有者绘制。我认为在将项插入控件之后才绘制项。因此,我的方法是声明一个从CListCtrl派生的类,并重写其DrawItem()方法。问题是在插入项目后,DrawItem从未被调用。我的方法有什么问题吗


谢谢大家!

您需要在控件上设置LBS_OWNERDRAWFIXED样式。您可以在资源模板中执行此操作,也可以使用ModifyStyle()函数以编程方式执行此操作

例如:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);

问题可能是您没有将窗口与类的实例相关联。这是通过对话框的DoDataExchange方法中的DDX_控件完成的。DDX_控件调用CWnd::Subclass Window,如果愿意,您可以自己调用。

可能还需要重写MeasureItem()和CompareItem()。有关更多详细信息,请参阅Microsoft文章

以下是我从自己的一个项目中剪切粘贴的一些代码,因此我知道它是有效的:

int CGraphicDroplist::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
    return 0;
}

void CGraphicDroplist::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    RECT r = lpDrawItemStruct->rcItem;
    CDC  pDC;
    pDC.Attach(lpDrawItemStruct->hDC);

// Put your code to draw the item here.

    pDC.Detach();
}

void CGraphicDroplist::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
    lpMeasureItemStruct->itemHeight = 100;
}
要在CListCtrl派生类中调用DrawItem()重写,需要设置样式LVS_OWNERDRAWFIXED,并将控件设置为“报告视图”模式。据我所知,ownerdraw只在报告模式下工作


还要检查变量在头文件中的类型是否正确(例如,CMyListCtrl而不是CListCtrl),并检查DDX分配是否如Mark Ransom建议的那样正确。

My class派生自CListCtrl,因此没有CompareItem或measureItem之类的可重写方法。你能给我解释一下在一个项目被插入到CListCtrl和显示在屏幕上之间发生了什么吗。DrawItem()方法可以绘制程序员指定的项吗?谢谢啊,我错了,我以为你在用CListBox。我将发布另一个答案。这是不正确的。LBS_OWNERDRAWFIXED是一种列表框样式。对于CListCtrl,适当的样式为LVS_OWNERDRAWFIXED。如果可能,请在创建新标记之前尝试查找现有标记。。。