2013-03-08 142 views
1

這裏是代碼的摘錄。工具欄的 樣式創建之前:Windows :: toolbar :: NM_CUSTOMDRAW。更改工具欄背景顏色

DWORD styles = TBSTYLE_FLAT | WS_CHILD | TBSTYLE_TOOLTIPS; //| TBSTYLE_CUSTOMERASE;//| WS_BORDER ; 
DWORD cc_styles = CCS_VERT | CCS_NODIVIDER | CCS_NORESIZE; 

處理NM_CUSTOMDRAW:

case WM_NOTIFY: 
     switch (((LPNMHDR)lparam)->code) 
{ 
... 
     case NM_CUSTOMDRAW: 
     { 
      //LPNMHDR header_ptr = safe_ptr_cast<LPNMHDR>(&lparam); 
      //if (header_ptr->hwndFrom == m_ptr->get_operation_tab_toolbar_handle()) 
      LPNMTBCUSTOMDRAW data_ptr = (LPNMTBCUSTOMDRAW) lparam; 
      switch(data_ptr->nmcd.dwDrawStage) 
      { 
       case CDDS_ITEMPREPAINT: 
        SetWindowTheme(m_ptr->get_operation_tab_toolbar_handle(), _T(""), _T("")); 
        //data_ptr->hbrMonoDither = GetStockBrush(BLACK_BRUSH); 
        SetBkColor(data_ptr->nmcd.hdc, RGB(0,0,0)); 
        FillRect(data_ptr->nmcd.hdc, &data_ptr->nmcd.rc, RGB(0,0,0)); 
        //FillRect(data_ptr->nmcd.hdc, &data_ptr->nmcd.rc, GetStockBrush(BLACK_BRUSH)); 
        return CDRF_NEWFONT; 
       case CDDS_PREPAINT: 
       { 
        return CDRF_NOTIFYITEMDRAW; 
       } 
      } 
     } 
} 

我只接收CDDS_PREPAINT。在文檔MSDN Custom Drawing Doc. 據說在返回值CDRF_NOTIFYITEMDRAW CDDS_ITEMPREPAINT應該是下一個。

+0

顯示您對SetClassLong的調用,因爲如果您沒有正確連接控件(「超級分類」)(如您的帖子所示),則您的消息處理程序代碼不應該被調用.... – johnathon 2013-03-09 00:32:57

回答

1

當使用樣式TBSTYLE_FLATE或TBSTYLE_TRANSPARENT創建工具欄時,TBSTYLE_TRANSPARENT使用父級背景顏色。因此,要爲工具欄實現不同的背景顏色,應該爲父窗口使用SetClassLongPtr(兼容32x和64x)。這樣解決了問題。