Win32自定义绘制树视图控件

埃弗里

我正在尝试使用NM_CUSTOMDRAW消息来自定义树视图控件。我只想用灰色绘制所有其他可见项目。这是绘制的代码:

INT CResourceOutliner::On_WM_NOTIFY( HWND hDlg, WPARAM wParam, LPARAM lParam )
{
    HWND hTree = GetDlgItem( hDlg, IDC_TREE1 ); 
    switch( ( ( LPNMHDR )lParam )->code )
    {
    ...
    case NM_CUSTOMDRAW:
            {           
                LPNMTVCUSTOMDRAW pCustomDraw = ( LPNMTVCUSTOMDRAW )lParam;
                switch( pCustomDraw->nmcd.dwDrawStage )
                {               
                case CDDS_PREPAINT:
                    return CDRF_NOTIFYITEMDRAW;
                case CDDS_ITEMPREPAINT:
                    {
                        switch ( pCustomDraw->iLevel )                  
                        {
                            // painting all 0-level items blue,                     
                            // and all 1-level items red (GGH)25.                       
                        case 0:
                            {
                            if( pCustomDraw->nmcd.uItemState == ( CDIS_FOCUS | CDIS_SELECTED ) )                            
                                pCustomDraw->clrTextBk = RGB( 255, 255, 255 );                          
                            else                                    
                                pCustomDraw->clrTextBk = RGB( 128, 128, 128 );                          
                                break;
                            }
                        case 1:                         
                            {
                                if( pCustomDraw->nmcd.uItemState == ( CDIS_FOCUS | CDIS_SELECTED ) )                            
                                    pCustomDraw->clrTextBk = RGB( 255, 255, 255 );                          
                                else    
                                    pCustomDraw->clrTextBk = RGB( 128, 128, 128 );
                                break;
                            }
                        default:
                            break;
                        }
                        return CDRF_SKIPDEFAULT;
                    }
                default:
                    break;
                }
            }
    ...
    }
}

这段代码是从这里开始的

问题在于,在CDDS_PREPAINT通知消息上返回CDRF_NOTIFYITEMDRAW之后,CDDS_ITEMPREPAINT消息再也不会出现...是否有设置选项以启用自定义绘图。我想不是因为CDDS_PREPAINT消息是由控件发送的...

...上面的代码也无意绘制其他所有项目...仅来自codeguru.com的演示

这是消息处理实现...

int CResourceOutliner::DoModal( int resID, RECT rct, HWND hParent )
{   
    // Set properties
    m_dwpSaveThis = ( DWORD_PTR )this; /// store this pointer
    m_nResId = resID;
    m_hParent = hParent;

    m_hWindow = CreateDialog( GetModuleHandle( NULL ), MAKEINTRESOURCE( m_nResId ), m_hParent, ( DLGPROC )MsgProcStatic );

    // Set window position
    SetWindowPos( m_hWindow, 0, rct.left, rct.top, rct.right, rct.bottom, 0 );

    ShowWindow( m_hWindow, SW_HIDE );

    if( m_hWindow )
        return 1;

    return 0; 
}
INT CALLBACK CResourceOutliner::MsgProcStatic( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    if( !m_hWindow )
        m_hWindow = hWnd;

    CResourceOutliner *pDlg = ( CResourceOutliner* )m_dwpSaveThis;
    if( pDlg )
        return pDlg->MsgProc( hWnd, uMsg, wParam, lParam );
    else
        return 0;
}
INT CALLBACK CResourceOutliner::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    switch( uMsg )
    {
    case WM_INITDIALOG:
        On_WM_INITDIALOG( hWnd, wParam, lParam );
        break;
    case WM_COMMAND:
        On_WM_COMMAND( hWnd, wParam, lParam );
        break;
    case WM_NOTIFY:
        {           
            return On_WM_NOTIFY( hWnd, wParam, lParam );
        }
    case WM_LBUTTONDOWN:
        On_WM_LBUTTONDOWN( hWnd, wParam, lParam );
        break;
    case WM_LBUTTONUP:
        On_WM_LBUTTONUP( hWnd, wParam, lParam );
        break;
    case WM_MOUSEMOVE:
        On_WM_MOUSEMOVE( hWnd, wParam, lParam );
        break;
    case WM_PAINT:
        On_WM_PAINT( hWnd, wParam, lParam );
        break;
    case WM_CLOSE:
        On_WM_CLOSE( hWnd, wParam, lParam );
        break;
    default:
        return 0;
    }
    return 0;
}
乔纳森·波特

对话过程的大多数返回码都需要通过设置DWLP_MSGRESULT,例如:

SetWindowLongPtr(hWnd, DWLP_MSGRESULT, CDRF_NOTIFYITEMDRAW);

此规则几乎没有例外(WM_CTLCOLORSTATIC直接返回的一个示例),因为通常将对话过程定义为返回TRUEFALSE取决于是否处理消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Caliburn Micro->从多个视图/用户控件/自定义控件组成视图

来自分类Dev

如何绘制自定义控件,然后传播事件?

来自分类Dev

对自定义MVC html控件使用部分视图

来自分类Dev

自定义绘制FMX控件位置错误

来自分类Dev

JavaFX-如何创建简单的自定义绘制控件?

来自分类Dev

在Doxygen中自定义树视图

来自分类Dev

如何在Win32桌面应用程序中使用自定义WinRT库?

来自分类Dev

Win32无法添加具有透明度的自定义工具栏图标

来自分类Dev

使用自定义绘图在Win32 API中设置按钮文本颜色

来自分类Dev

Android-在自定义控件外部更新视图(从自定义控件内部)

来自分类Dev

在WTL中的自定义绘制控件中实现滚动

来自分类Dev

如何在Win32 C ++中的工具栏按钮上动态添加自定义图像?

来自分类Dev

Caliburn Micro->从多个视图/用户控件/自定义控件组成视图

来自分类Dev

自定义视图未绘制

来自分类Dev

绘制多个自定义视图

来自分类Dev

在XML视图中使用自定义控件

来自分类Dev

自定义控件未绘制Windows窗体按钮

来自分类Dev

在Doxygen中自定义树视图

来自分类Dev

Win32应用程序,在调用Windows东西之前调用自定义类方法

来自分类Dev

xpages视图选择列表自定义控件

来自分类Dev

在自定义Eclipse视图中绘制

来自分类Dev

自定义视图不会绘制位图

来自分类Dev

在自定义WPF控件中强制重新绘制自定义绘制的UIElement

来自分类Dev

自定义分段控件不切换视图

来自分类Dev

自定义树视图

来自分类Dev

使用 Win32 API 向另一个应用程序添加自定义边框

来自分类Dev

自定义树视图的展开/折叠图标

来自分类Dev

绘制自定义视图的正确方法?

来自分类Dev

在已经绘制的自定义控件上绘制

Related 相关文章

热门标签

归档