簡體   English   中英

在CTreeCtrl中更改字體后未調整項目大小

[英]item size not adjusted after font change in CTreeCtrl

我使用以下代碼在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;
  }
}

從我似乎無法在線找到的MSDN副本中:

大多數常見控件可以用基本相同的方式處理。 但是,列表視圖和樹視圖控件具有某些功能,這些功能需要一些不同的方法來進行自定義繪制。

對於版本5.0,如果您通過返回CDRF_NEWFONT更改字體,則這兩個控件可能會顯示剪切的文本。 為了與早期版本的公共控件向后兼容,此行為是必需的。 如果要更改列表視圖或樹視圖控件的字體,則在向控件添加任何項目之前發送wParam值設置為5的CCM_SETVERSION消息,將會獲得更好的結果。

另請參閱CCM_SETVERSION文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM