65.9K
CodeProject is changing. Read more.
Home

Painting of CToolbar's parent window (AfxControlBar).

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.38/5 (11 votes)

Mar 27, 2008

CPOL
viewsIcon

51552

downloadIcon

915

Background painting of CToolbar's parent window (AfxControlBar).

Introduction

I was trying to paint the background color (paint entire window) of CToolbar. In that, I could paint only the toolbar window and not the entire area of the toolbar window which is "AfxControlBar" (CToolbar's parent window). Then I found the solution for painting the "AfxControBar", and I thought I should share the solution with you all.

Using the code

In your application, override OnNotify member function in your CMainFrame to handle the WM_NOTIFY message for painting the AfxControlBar.

In MainFrm.h file, declare the following member variable and member function:

class CMainFrame : public CMDIFrameWnd 
{ 
    ..... 
    CBrush m_BrushDocBar;
    
    BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); 
    ..... 
}

In MainFrm.cpp, in constructor create a solid brush as follows,

CMainFrame::CMainFrame()
{
    m_BrushDocBar.CreateSolidBrush(RGB(0, 255, 255));
}

In MainFrm.cpp, provide the definition of OnNotify()function as follows,

BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LPNMHDR pnmh = (LPNMHDR) lParam; 
    if(pnmh->hwndFrom == m_wndToolBar.m_hWnd)
    {
        LPNMTBCUSTOMDRAW lpNMCustomDraw = (LPNMTBCUSTOMDRAW) lParam;
        CRect rect;
        CWnd* pWnd = m_wndToolBar.GetParent();
        TCHAR szClassName[200];
        GetClassName(pWnd->m_hWnd, szClassName, 200);
        CString strTemp = szClassName;
        if(strTemp.Find(_T("AfxControlBar")) >= 0)
        {
            SetClassLong(pWnd->m_hWnd, GCL_HBRBACKGROUND, (LONG)m_BrushDocBar.GetSafeHandle());
        }
    }
    return CMDIFrameWnd::OnNotify(wParam, lParam, pResult);
}