我计划实现CListCtrl的所有者绘制。我认为绘制项目是在项目插入控件之后。所以我的方法是声明一个派生自CListCtrl并覆盖其DrawItem()方法的类。问题是插入项目后永远不会调用DrawItem。我的方法有什么问题吗?
谢谢!
答案 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;
}