我使用以下代码更改了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;
}
}
然而,文本的末尾被剪切在项目中,显然它没有被调整为使用新字体的文本长度。
什么是补救措施?
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
从我的MSDN副本中,我似乎无法在网上找到它:
可以处理最常见的控件 基本上是一样的。然而 列表视图和树视图控件有 一些功能需要一些 不同的自定义绘制方法。
对于5.0版,这两个控件 如果更改,可能会显示剪切的文本 返回CDRF_NEWFONT的字体。 这种行为是必要的 向后兼容早期 常用控件的版本。如果 你想改变一个字体 列表视图或树视图控件,你 如果你寄出一个会得到更好的结果 带有wParam的CCM_SETVERSION消息 在添加任何项目之前将值设置为5 控制。