我调用了什么消息或事件,我调用了CListCtrl :: InsertItem()方法?

时间:2008-10-24 01:29:19

标签: mfc listview ownerdrawn

我计划实现CListCtrl的所有者绘制。我认为绘制项目是在项目插入控件之后。所以我的方法是声明一个派生自CListCtrl并覆盖其DrawItem()方法的类。问题是插入项目后永远不会调用DrawItem。我的方法有什么问题吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

要在CListCtrl派生类中调用DrawItem()重写,需要设置样式 LVS_OWNERDRAWFIXED ,并将控件设置为“报表视图”模式。据我所知,ownerdraw只能在报告模式下工作。

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

答案 1 :(得分:0)

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

示例:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

这是我剪切的一些代码&粘贴在我自己的一个项目中,所以我知道它有效:

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;
}
相关问题