размер элемента не изменяется после изменения шрифта в CTreeCtrl - PullRequest
0 голосов
/ 04 августа 2010

Я изменяю шрифт элементов дерева в 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;
    }
}

Однако конец текста обрезается в элементах, очевидно, он не
настраивается надлина текста с новым шрифтом.
Какое будет решение?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

У меня была такая же проблема, и я могу подтвердить, что 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;
  }
}
0 голосов
/ 04 августа 2010

Из моей копии MSDN, которую я не могу найти в Интернете:

Большинство общих элементов управления могут быть обработаны в по сути, так же. Тем не менее Элементы управления списком и деревом имеют некоторые функции, которые требуют несколько другой подход к индивидуальному розыгрышу.

Для версии 5.0 эти два элемента управления может отображаться обрезанный текст, если вы измените шрифт, возвращая CDRF_NEWFONT. Такое поведение необходимо для обратная совместимость с ранее версии общих элементов управления. Если Вы хотите изменить шрифт управление представлением списка или дерева, вы получит лучшие результаты, если вы отправите Сообщение CCM_SETVERSION с wParam значение, установленное на 5, перед добавлением любых элементов к контролю.

См. Также документацию для CCM_SETVERSION .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...