我有一个
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);
}
仅当鼠标移至标题上方时,标题中的箭头才会显示。用户不知道他可以选择某些选择。如何永久显示这个箭头?
如果没有更多有关您的
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();
}