【MFC】ツールバーをカスタムドローする方法を教えてください。


KAT  2013-08-10 14:09:08  No: 73777

業務でMFCを使ったソフト開発を行っております(開発環境 Visual Studio 2005)。
ツールバーの文字に色を塗ることになり色々調べてみたのですがうまくいきません。

プログラムを下の方に記載しています。
試した方法としては,OnNotify関数をオーバーライドしてNM_CUSTOMDRAWメッセージを捕まえることでカスタムドローでの描画を試みました。
CDDS_PREERASE のメッセージは来るのですが,その先のCDDS_ITEMPREPAINT メッセージが来てくれません。
また,wParamの値も「59392」というツールバーのコントロールIDとは違う数値が来てしまいます。
どうすればカスタムドローでツールバーの文字の色を変えられるのでしょうか?
MFCの知識に乏しいため説明不足な点があるかも知れませんが,宜しくお願いします。

以下,プログラム

/****************ヘッダ部分*******************/

CToolBar *m_pToolBar; //ツールバークラスポインタ 

/***************ツールバー作成****************/

  //ツールバークラスインスタンス生成
  m_pToolBar = new CToolBar();

  if( m_pToolBar->CreateEx( this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_CUSTOMERASE, WS_VISIBLE | CBRS_ALIGN_BOTTOM | CBRS_BORDER_ANY ) == FALSE ){
    return FALSE;
  }
  m_pToolBar->LoadToolBar(IDR_TOOLBAR1);
  m_pToolBar->SetButtons( NULL, TB_BTN_NUM + TB_BTN_SPRT_NUM );

  //BMP読み込み
  HINSTANCE hInstance = AfxGetInstanceHandle();
  HBITMAP hBmpTB = (HBITMAP)::LoadImage( hInstance, MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_VGACOLOR );
  CBitmap bmpTB;
  bmpTB.Attach( hBmpTB );
  
  // CImageList
  m_imgListTB.Create( 58, 54, ILC_COLOR8, 6, 0 );
  m_imgListTB.Add( &bmpTB, (CBitmap*)NULL );
  m_pToolBar->GetToolBarCtrl().SetImageList( &m_imgListTB );

/*************カスタムドロー*************************/

BOOL CXXXDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
  // TODO: ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。

  if( ((LPNMHDR)lParam)->code == NM_CUSTOMDRAW ){

    LPNMTBCUSTOMDRAW lpCustomDraw = (LPNMTBCUSTOMDRAW)lParam;

    if( CDDS_PREERASE == lpCustomDraw->nmcd.dwDrawStage ){
      *pResult = CDRF_NOTIFYITEMDRAW;
    }
    if( CDDS_ITEMPREPAINT == lpCustomDraw->nmcd.dwDrawStage ){
      lpCustomDraw->clrText = RGB(255, 255, 255);
      *pResult = TBCDRF_HILITEHOTTRACK; 
    }
    
  }

  return CDialog::OnNotify(wParam, lParam, pResult);
}


forty-five  2013-08-15 06:30:16  No: 73778

憶測ですが、CToolBarCtrl の親が CToolBar で、こちらに通知メッセージが送られているのではないでしょうか。CXXXDlg はさらにその親なので、そこまでメッセージが届いてないのだと思います。CToolBar の派生クラスを作って通知メッセージがハンドル出来るか調べてみてください。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加