c++ - CTreeCtrl 中的字体更改后未调整项目大小

标签 c++ mfc treecontrol

我使用以下代码更改 CTreeCtrl 中树项的字体:

void CTreeCtrlEx::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
    *pResult = 0;

    switch(pNMCD->nmcd.dwDrawStage)
    {
        case CDDS_PREPAINT:
            *pResult = CDRF_NOTIFYITEMDRAW;
            return;
        case CDDS_ITEMPREPAINT:
        {
            CFont * pco_font = GetSomeFont();
            ::SelectObject(pNMCD->nmcd.hdc, pco_font->GetSafeHandle());
            *pResult = CDRF_NEWFONT;
        }
        return;
    }
}

然而,文本的末尾在项目中被剪裁,显然它没有被
调整为新字体的文本长度。
补救措施是什么?

最佳答案

我有同样的问题,可以确认 CCM_SETVERSION 没有工作。事实上,对我来说唯一可靠的方法是在绘制过程完成后 重新设置文本。我这样做的方法是捕捉 TVN_ITEMEXPANDING 消息并重新设置文本。这将在展开节点时更正所有子项的文本。当然,这不适用于粗体根节点。

这是我的代码草图:

BEGIN_MESSAGE_MAP(CTreeViewEx, CTreeView)
  ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemExpanding)
END_MESSAGE_MAP()

void CTreeViewEx::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult) 
{
  NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  if(pNMTreeView==NULL) {
    return;
  }
  HTREEITEM hTreeItem = pNMTreeView->itemNew.hItem;
  if(hTreeItem!=NULL) {
    ReevaluteItemTextOfChildren(hTreeItem);
    ...
  }
}

void CTdTreeViewEx::ReevaluteItemTextOfChildren(HTREEITEM hRootNode)
{
  if (hRootNode == NULL) {
    return;
  }
  CTreeCtrl& ctlTree = GetTreeCtrl();
  HTREEITEM hTreeItemCursor = ctlTree.GetNextItem(hRootNode, TVGN_CHILD);
  // Loop over all siblings
  while (hTreeItemCursor != NULL) {
    // Change the text of the current item
    CString csItemText(ctlTree.GetItemText(hTreeItemCursor));
    ctlTree.SetItemText(hTreeItemCursor, csItemText);
    // Get the next brother
    HTREEITEM hNextSibling = ctlTree.GetNextItem(hTreeItemCursor, TVGN_NEXT);
    hTreeItemCursor = hNextSibling;
  }
}

关于c++ - CTreeCtrl 中的字体更改后未调整项目大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408918/

相关文章:

c++ - CTreeCtrl 禁用拖放特定节点

c++ - 警告 C26454 : Arithmetic overflow: '-' operation produces a negative unsigned result at compile time (io. 5)

c++ - 调用父覆盖函数的成本

c# - void** 的含义是什么?

c++ - Linux,需要精确的程序时序。调度唤醒程序

mfc - 如何显示无模式对话框并立即在其中显示信息?

c++ - 在 HPUX 上以编程方式获取应用程序的 CPU 和内存使用情况

visual-c++ - 如何将MFC窗体的控件从底部移动到顶部?

c++ - MFC visual c++ LNK2019链接错误