Mfc 如何加载CTreeCtrl节点的默认图标

Mfc 如何加载CTreeCtrl节点的默认图标,mfc,load,icons,paint,treecontrol,Mfc,Load,Icons,Paint,Treecontrol,由于布局定制的需要,我扩展了CTreeCtrl类 我绝对需要使用CDC::DrawText()函数以友好方式(重新)写入单个节点的文本,而无需多次调用SetItemText()函数(必需) 然后,我编写了自己的OnPaint()方法的实现。 我还实现了一个DrawItems()方法,该方法在CTreeCtrl中绘制节点 由于我只想修改单个节点旁边的单个标签,因此我需要重新实现大部分原始CTreeCtrl::OnPaint()代码 我只有两个疑问: 如何显示默认的CTreeCtrl图标?我不需要/

由于布局定制的需要,我扩展了CTreeCtrl类

我绝对需要使用CDC::DrawText()函数以友好方式(重新)写入单个节点的文本,而无需多次调用SetItemText()函数(必需)

然后,我编写了自己的OnPaint()方法的实现。 我还实现了一个DrawItems()方法,该方法在CTreeCtrl中绘制节点

由于我只想修改单个节点旁边的单个标签,因此我需要重新实现大部分原始CTreeCtrl::OnPaint()代码

我只有两个疑问:

  • 如何显示默认的CTreeCtrl图标?我不需要/不想要 自定义图标
  • 如何恢复单个节点的默认选择模式布局 简单地说,当前选定的节点应该高亮显示

    下面是一些简化的自动解释代码:

    void MyDlg::OnPaint()
    {
        CPaintDC dc(this);
        CDC dc_ff;  
        CBitmap bm_ff;
        CBitmap *bm_old;
        CFont *font;
        CFont *old_font;
        CFont fontDC;
        int old_mode;
        GetClientRect(&m_Rect);
    
        dc_ff.CreateCompatibleDC( &dc );
        bm_ff.CreateCompatibleBitmap( &dc, m_Rect.Width(), m_Rect.Height() ); 
        dc_ff.SelectObject( &bm_ff ); 
        font = GetFont();
        old_font = dc_ff.SelectObject( font );
    
        // Could / Should be called here?
        CWnd::DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, 0);
    
        old_mode = dc_ff.SetBkMode(TRANSPARENT);
    
        dc_ff.FillSolidRect(m_Rect, dc_ff.GetBkColor());
    
        DrawItems( &dc_ff ); // DrawItems() member function draws single nodes of CTreeCtrl
    
        dc.BitBlt( m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), &dc_ff, 0, 0, SRCCOPY);
    
        dc_ff.SelectObject( old_font );
        dc_ff.SetBkMode( old_mode );
        dc_ff.SelectObject( bm_old ); 
    }
    
    void MyDlg::DrawItems( CDC *pDC )
    {
        // draw items
        HTREEITEM show_item, parent;
        CRect rc_item;
        CString name;
        DWORD tree_style;
        int count = 0;
        int state;
        bool selected;
        bool has_children;
    
        show_item = GetFirstVisibleItem();
        if ( show_item == NULL )
            return;
        color = pDC->GetTextColor();
        tree_style = ::GetWindowLong( m_hWnd, GWL_STYLE ); 
    
        do
        {
            state = GetItemState( show_item, TVIF_STATE );
            parent = GetParentItem( show_item );
            has_children = ItemHasChildren( show_item ) || parent == NULL;
            selected = (state & TVIS_SELECTED) && ((this == GetFocus()) || 
                    (tree_style & TVS_SHOWSELALWAYS));
    
            if ( GetItemRect( show_item, rc_item, TRUE ) )
            {
                if ( has_children  || selected )
                {
                    if ( selected )
                    {
                        // HERE i need to 
                    }
                    else
    
                    // do some stuff...
    
                    if ( has_children )
                    {
                        HICON icon;
                        // HERE I need to load CTreeCtrl nodes _DEFAULT_icon
                        icon = LoadIcon(NULL, IDI_ASTERISK);
                        if ( icon != NULL )
                            DrawIconEx( pDC->m_hDC, rc_item.left - 18, rc_item.top, icon, 16, 16,0,0, DI_NORMAL ); 
                    }
                }
                if ( !has_children )
                {
                    HICON icon;
                    *// HERE I need to load CTreeCtrl nodes _DEFAULT_icon*
                    icon = LoadIcon(NULL, IDI_ASTERISK);
                    if ( icon != NULL )
                        DrawIconEx( pDC->m_hDC, rc_item.left - 18, rc_item.top, icon, 16, 16,0,0, DI_NORMAL ); 
                }
                name = GetItemText( show_item );
                // ...
                if ( selected )
                {
                    pDC->DrawText( "Temp", rc_item, DT_LEFT );
                }
                else
                {
                    pDC->DrawText( "Temp", rc_item, DT_LEFT );
                }
                //if ( state & TVIS_BOLD )
                //  pDC->SelectObject( font );
            }
        } while ( (show_item = GetNextVisibleItem( show_item )) != NULL );
    }
    
    我所需要的是几乎标准的CTreeCtrl::OnPaint()实现的源代码。 感谢您的任何建议/帮助。:-)

    谢谢


    它。

    你不需要在油漆上超载。如果将树项目文本设置为LPSTR_TEXTCALLBACK,则CtreeCtrl将在每次显示该项目时触发消息TVN_GETDISPINFO以检索新文本。Regeister消息处理程序,如果在父窗口中,则使用ON_NOTIFY;如果正在子类化CTreeCtrl,则使用ON_NOTIFY_REFLECT。此消息处理程序可以指定所需的文本,但允许treeCtrl继续正常绘制

    如果你走父母的Cwnd路线,你需要

  • 因此,您需要在cpp文件中分配消息处理程序:

    开始消息映射(MyCWnd,CWnd)

    ON_NOTIFY(TVN_GETDISPINFO,tree_ctl_id,CustomTreeControl::OnGetdispinfo) 结束消息映射()

  • 标题中的函数原型

    afx_msg void OnGetdispinfo(NMHDR*pNMHDR,LRESULT*pResult)

  • 这在类定义的末尾

    声明消息映射()

  • 以及处理请求的实际函数

    void ColumnTreeControl::OnGetdispinfo(NMHDR*pNMHDR,LRESULT*pResult) { NMTVDISPINFO*pDispInfo=(NMTVDISPINFO)pNMHDR; tviitem item=&pDispInfo->item

    if(item->mask & TVIF_TEXT )
    {
             item->pszText " YOUR CODE HERE";
    }
    *pResult = 0;
    
    }