我打算实现 CListCtrl 的所有者绘制。我认为绘制一个项目是在将项目插入控件之后。所以我的方法是声明一个从 CListCtrl 派生的类并覆盖它的 DrawItem() 方法。问题是在插入项目后永远不会调用 DrawItem。我的方法有什么问题吗?
谢谢!
我打算实现 CListCtrl 的所有者绘制。我认为绘制一个项目是在将项目插入控件之后。所以我的方法是声明一个从 CListCtrl 派生的类并覆盖它的 DrawItem() 方法。问题是在插入项目后永远不会调用 DrawItem。我的方法有什么问题吗?
谢谢!
要在 CListCtrl 派生类中调用 DrawItem() 覆盖,您需要设置样式LVS_OWNERDRAWFIXED并将控件设置为“报表视图”模式。据我所知,ownerdraw 只在报告模式下工作。
还要检查头文件中的变量类型是否正确(例如 CMyListCtrl 而不是 CListCtrl),并按照 Mark Ransom 的建议检查 DDX 分配是否正确。
可能您还需要覆盖 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;
}
您需要在控件上设置 LBS_OWNERDRAWFIXED 样式。您可以在资源模板中执行此操作,也可以使用 ModifyStyle() 函数以编程方式执行此操作。
例子:
m_myListbox.ModifyStyle(0, LBS_OWNERDRAWFIXED, 0);
问题可能是您没有将窗口与您的类的实例相关联。这是通过对话框的 DoDataExchange 方法中的 DDX_Control 完成的。DDX_Control 调用 CWnd::SubclassWindow,如果你愿意,你可以自己做。