2

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

谢谢!

4

4 回答 4

1

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

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

于 2008-10-24T10:40:23.393 回答
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;
}
于 2008-10-24T03:44:13.860 回答
0

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

例子:

m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
于 2008-10-24T01:32:27.527 回答
0

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

于 2008-10-24T01:37:01.727 回答