0

我发现了一个问题。我无法更改CMFCListCtrl. 我在 msdn 上找到了关于CMFCHeaderCtrl::OnDrawSortArrow但没有帮助的帖子,因为那里没有示例。

我尝试了简单的方法,如何将箭头设置为CListCtrl标题CimageListHDITEM但这些箭头仅设置在左侧,因为右侧已经默认设置了箭头。

谷歌对如何更改默认箭头的解决方案一无所知CMFCListCTrl

请帮助我)谢谢!PS。请注意,这CMFCListCtrl不是CListCtrl我可以很容易添加箭头的地方。

4

2 回答 2

2

因为 CMFCHeaderCtrl 是 CMFCListCtrl 内部的成员,所以您不能覆盖它。尝试使用您自己的 CMFCHeaderCtrl 类派生您自己的 CMFCListCtrl 类,该类覆盖OnDrawSortHeader OnDrawSortArrow。将 CMFCListCtrl::InitHeader 和子类覆盖到您的标题控件类。

如果您从 CListCtrl 开始表单,您可以直接子类化标题控件。CMFCListCtrl 中的完整内容并不那么复杂且易于重新实现。看你需要什么功能。

于 2013-10-30T13:44:34.077 回答
0

CMFCHeaderCtrl 调用当前活动的可视化管理器来实际绘制排序箭头。很容易实现一个自定义的可视化管理器,它覆盖了基类中的箭头绘制方法。

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);
}
于 2015-05-18T14:19:15.227 回答