我发现了一个问题。我无法更改CMFCListCtrl
标题中的默认排序箭头。
我在msdn上找到关于CMFCHeaderCtrl::OnDrawSortArrow
的帖子,但它没有帮助,因为那里没有例子。
我尝试了一种简单的方法,如何通过CListCtrl
和CimageList
将箭头设置为HDITEM
标题,但这些箭头只设置在左侧,因为右侧已经有箭头默认值。
Google在解决方案如何更改CMFCListCTrl
上的默认箭头方面是空的。
请帮帮我)
谢谢!
PS。请注意,这是CMFCListCtrl
而不是CListCtrl
我可以非常轻松地添加箭头。
答案 0 :(得分:2)
因为CMFCHeaderCtrl是CMFCListCtrl中的成员,所以无法覆盖它。
尝试使用您自己的CMFCHeaderCtrl类派生自己的CMFCListCtrl类,该类覆盖 OnDrawSortHeader OnDrawSortArrow。
将CMFCListCtrl :: InitHeader和子类覆盖到标题控件类。
如果使用CListCtrl启动表单临时,则可以直接对头控件进行子类化。 CMFCListCtrl中的完整内容不是那么复杂且易于重新实现。取决于您需要的功能。
答案 1 :(得分:0)
CMFCHeaderCtrl调用当前活动的Visual Manager来进行排序箭头的实际绘制。很容易实现一个自定义的Visual管理器,它覆盖了基类中的箭头绘制方法。
class CMyVisualManager:public CMFCVisualManagerOffice2007
{
virtual void OnDrawHeaderCtrlSortArrow(CMFCHeaderCtrl* pCtrl, CDC* pDC, CRect& rect, BOOL bIsUp);
};
void CMyVisualManager::OnDrawHeaderCtrlSortArrow(CMFCHeaderCtrl* pCtrl, CDC* pDC, CRect& rectArrow, BOOL bIsUp)
{
BOOL bDlgCtrl = pCtrl->IsDialogControl();
CPen penDark(PS_SOLID, 1, bDlgCtrl ? afxGlobalData.clrBtnDkShadow : afxGlobalData.clrBarDkShadow);
CPen* pPenOld = pDC->SelectObject(&penDark);;
ASSERT_VALID(pPenOld);
if (!bIsUp)
{
pDC->MoveTo(rectArrow.CenterPoint().x, rectArrow.bottom);
pDC->LineTo(rectArrow.CenterPoint().x, rectArrow.top);
pDC->MoveTo(rectArrow.CenterPoint().x-2, rectArrow.top+4);
pDC->LineTo(rectArrow.CenterPoint().x+3, rectArrow.top+4);
pDC->MoveTo(rectArrow.CenterPoint().x-1, rectArrow.top+3);
pDC->LineTo(rectArrow.CenterPoint().x+2, rectArrow.top+3);
pDC->MoveTo(rectArrow.CenterPoint().x-1, rectArrow.top+2);
pDC->LineTo(rectArrow.CenterPoint().x+2, rectArrow.top+2);
}
else
{
pDC->MoveTo(rectArrow.CenterPoint().x, rectArrow.top);
pDC->LineTo(rectArrow.CenterPoint().x, rectArrow.bottom);
pDC->MoveTo(rectArrow.CenterPoint().x-2, rectArrow.bottom-4);
pDC->LineTo(rectArrow.CenterPoint().x+3, rectArrow.bottom-4);
pDC->MoveTo(rectArrow.CenterPoint().x-1, rectArrow.bottom-3);
pDC->LineTo(rectArrow.CenterPoint().x+2, rectArrow.bottom-3);
pDC->MoveTo(rectArrow.CenterPoint().x-1, rectArrow.bottom-2);
pDC->LineTo(rectArrow.CenterPoint().x+2, rectArrow.bottom-2);
}
pDC->SelectObject(pPenOld);
}