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;
}
}
...
}
}
このコードはhereからです。
問題は、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;
}