4

我正在尝试使用 MFC Feature Pack 中的一些类来改进我的 MFC 应用程序的外观。

在我的应用程序中,我使用一个 CReBar 对象来停靠三个不同的工具栏。我已经更新了这个对象的类以使用 CMFCReBar,但是在使用某些视觉样式时它看起来并不好。

Feature Pack 中似乎存在问题,因为即使使用 package.json 部署的 RebarTest 示例也会发生这种情况。

这是示例应用程序的屏幕截图,只是将视觉样式更改为 Office 2007(使用 app.menu 而不是代码):

RebarTest 示例应用程序的屏幕截图 http://img105.imageshack.us/img105/1057/rebartestep5.png

有人成功使用过 CMFCReBar 吗?有没有其他方法可以在不使用它的情况下达到同样的效果?

4

3 回答 3

2

基本上你不再需要使用钢筋控件了。通过简单地创建您的 CMFCToolbars 和 CMFCMenuBar,在它们上调用 EnableDocking,然后在每个上使用 DockPane,它们将停靠并采用 Office 2007(或您使用的任何其他主题)的外观和感觉。查看 WordPad Feature Pack 示例,或使用 AppWizard 创建一个新项目(使用所有默认设置即可)查看示例。

好的,从您的评论中可以看出:如果您想将工具栏停靠在彼此旁边,您可以在 DockPane 之后使用 DockPaneLeftOf。根据我的经验,如果您不先 DockPane 两个工具栏,它往往会在工具栏放置时出现奇怪的行为。

我还没有找到一个很好的简单解决方案来阻止工具栏被拖动,同时停靠在彼此旁边,您可以删除 CBRS_GRIPPER 样式,但这并不能阻止工具栏被拖动。

您也可以不调用菜单栏或工具栏上的 EnableDocking。这将使他们固定的地方。但是,DockPaneLeftOf 在这种情况下似乎不起作用,因此您会丢失彼此相邻的停靠工具栏。

因此,如果您想停止停靠,或者将工具栏停靠在彼此旁边,现在似乎是其中之一。

于 2009-01-30T16:24:46.053 回答
1

Paul DiLascia 写了一个来锁定 CToolBar,我用它来创建这个类,它将在 CMFCToolbar 上工作。你可以复制它来为 CMFCMenuBar 做同样的事情——只需将 MFCToolBar 更改为 MFCMenuBar 就可以了。

替代文字

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));
于 2009-02-06T00:20:42.763 回答
0

在使用 Office 2007 样式时,我也注意到了一些视觉问题——它似乎有点错误。你可以用其他的一个来代替吗?XP Luna 似乎相当稳定...

于 2009-01-15T16:08:41.737 回答