0

次のコードを使用して、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;
    }
}

ただし、テキストの末尾がアイテム内で切り取られて
おり、新しいフォントでテキストの長さに調整されていないようです。
対処法は何でしょう?

4

2 に答える 2

1

同じ問題があり、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;
  }
}
于 2011-02-17T11:02:41.873 に答える
0

オンラインで見つけられないように見えるMSDNのコピーから:

最も一般的なコントロールは、基本的に同じ方法で処理できます。ただし、リストビューとツリービューのコントロールには、カスタム描画に対して多少異なるアプローチを必要とするいくつかの機能があります。

バージョン5.0では、CDRF_NEWFONTを返してフォントを変更すると、これら2つのコントロールにクリップされたテキストが表示される場合があります。この動作は、以前のバージョンの共通コントロールとの下位互換性のために必要です。リストビューまたはツリービューコントロールのフォントを変更する場合は、コントロールに項目を追加する前に、wParam値を5に設定してCCM_SETVERSIONメッセージを送信すると、より良い結果が得られます。

CCM_SETVERSIONのドキュメントも参照してください。

于 2010-08-04T19:24:12.867 に答える