更改CMFCListCtrl的默认排序箭头

时间:2013-10-30 12:24:12

标签: c++ mfc

我发现了一个问题。我无法更改CMFCListCtrl标题中的默认排序箭头。 我在msdn上找到关于CMFCHeaderCtrl::OnDrawSortArrow的帖子,但它没有帮助,因为那里没有例子。

我尝试了一种简单的方法,如何通过CListCtrlCimageList将箭头设置为HDITEM标题,但这些箭头只设置在左侧,因为右侧已经有箭头默认值。

Google在解决方案如何更改CMFCListCTrl上的默认箭头方面是空的。

请帮帮我) 谢谢! PS。请注意,这是CMFCListCtrl而不是CListCtrl我可以非常轻松地添加箭头。

2 个答案:

答案 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);
}