Search code examples
mfc-feature-pack

How do I use CMFCRebar to produce an acceptable look and feel?


I am trying to use some classes from the MFC Feature Pack to improve the look & feel of my MFC application.

In my application, I use one CReBar object to dock three different toolbars. I have updated the class of this object to use CMFCReBar, but it doesn´t look good when using some visual styles.

It seems there's a problem in the Feature Pack because it happens even with the RebarTest example deployed with package.

This is a screenshot of the example application just changing the visual style to Office 2007 (using the app. menu not by code):

Screenshot of RebarTest example application http://img105.imageshack.us/img105/1057/rebartestep5.png

Has anybody successfully used CMFCReBar? Is there any other way to achieve the same without using it?


Solution

  • Paul DiLascia wrote a class to lock the CToolBar, I used it to create this class which will work on CMFCToolbar. And you can copy it to do exactly the same sort of thing for CMFCMenuBar - just change MFCToolBar to MFCMenuBar and you're done.

    alt text

    class CLockedMFCToolBar : public CMFCToolBar
    {
    public:
        CLockedMFCToolBar() : CMFCToolBar() {}
    
    protected:
        LRESULT CLockedMFCToolBar::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
        {
            if ((msg==WM_LBUTTONDOWN || msg==WM_LBUTTONDBLCLK))
            {
                // Got click or double-click and toolbar is locked: if mouse in "dead
                // zone" then ignore the message--don't pass to control bar
                CPoint pt(lp);
                if (OnToolHitTest(pt, NULL) == -1)
                    return 0; // return without handling: bypass control bar dragging!
            }
            // pass unhandled messages subclassed window--this is important!*/
            return CMFCToolBar::WindowProc(msg, wp, lp);
        }
    };
    
    
    //////////////////////////////
    // in CMainFrame declaration
    protected:
        CLockedMFCMenuBar m_wndMenuBar;
        CLockedMFCToolBar m_wndToolBar1;
        CLockedMFCToolBar m_wndToolBar2;
    
    
    ////////////////////////////
    // in CMainFrame::OnCreate
    if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar1.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }
    
    if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar2.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
    {
        TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    }
    
    EnableDocking(CBRS_ALIGN_ANY);
    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
    DockPane(&m_wndMenuBar);
    DockPane(&m_wndToolBar2);
    DockPane(&m_wndToolBar1);
    DockPaneLeftOf(&m_wndToolBar1, &m_wndToolBar2);
    
    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() &
                ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
    m_wndToolBar1.SetPaneStyle(m_wndToolBar1.GetPaneStyle() &
                ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));
    m_wndToolBar2.SetPaneStyle(m_wndToolBar2.GetPaneStyle() &
                ~(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT));