如何在CListCtrl的分割标题中永久显示箭头

问题描述 投票:0回答:1

我有一个

CListCtrl
并修改它的标题,例如带有箭头的拆分标题,允许从菜单项中进行选择:

CHeaderCtrl* pHeaderCtrl = m_cTree.GetHeaderCtrl();
if (pHeaderCtrl)
{
    //BOOL bb = pHeaderCtrl->ModifyStyle(0, pHeaderCtrl->GetStyle() | HDS_BUTTONS);
    // Modify the header item style to include the split button style
    HDITEM item;
    item.mask = HDI_FORMAT;
    //item.iItem = 0; // Index of the header item you want to modify
    pHeaderCtrl->GetItem(0, &item);
    item.fmt |= HDF_SPLITBUTTON;
    pHeaderCtrl->SetItem(0, &item);
}

仅当鼠标移至标题上方时,标题中的箭头才会显示。用户不知道他可以选择某些选择。如何永久显示这个箭头?

标准外观:
image

当鼠标移过时:
image

c++ visual-studio winapi mfc clistctrl
1个回答
0
投票

如果没有更多有关您的

CListCtrl
实施的上下文,就很难提供令人满意的完全就绪的解决方案,但我试图覆盖您测试它的方式。

我覆盖了

CHeaderList

 以重新绘制箭头并强制它始终出现。

class CCustomHeaderCtrl : public CHeaderCtrl { protected: afx_msg void OnPaint() { CPaintDC dc(this); CRect rect; GetClientRect(&rect); HDITEM item = { HDI_FORMAT | HDI_TEXT }; TCHAR szText[256]; item.pszText = szText; item.cchTextMax = 255; for (int i = 0; i < GetItemCount(); ++i) { GetItem(i, &item); CRect itemRect; GetItemRect(i, &itemRect); dc.DrawText(item.pszText, &itemRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); if (item.fmt & HDF_SPLITBUTTON) { itemRect.left = itemRect.right - 16; DrawFrameControl(dc, &itemRect, DFC_SCROLL, DFCS_SCROLLDOWN); } } } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CCustomHeaderCtrl, CHeaderCtrl) ON_WM_PAINT() END_MESSAGE_MAP()
如果太长,请跟踪 

DrawFrameControl(dc, &arrowRect, DFC_SCROLL, DFCS_SCROLLDOWN)

,它可以帮助您重写箭头。

从你的代码片段中,我添加了我的课程

if (CHeaderCtrl* pHeaderCtrl = m_cTree.GetHeaderCtrl()) { HDITEM item = { HDI_FORMAT }; int columnCount = pHeaderCtrl->GetItemCount(); for (int i = 0; i < columnCount; ++i) { pHeaderCtrl->GetItem(i, &item); item.fmt |= HDF_SPLITBUTTON; pHeaderCtrl->SetItem(i, &item); } pHeaderCtrl->Invalidate(); pHeaderCtrl->UpdateWindow(); }

© www.soinside.com 2019 - 2024. All rights reserved.