2009-01-15 106 views
4

我想從MFC功能包中使用一些類來改善我MFC應用程序的外觀&。如何使用CMFCRebar產生可接受的外觀和感覺?

在我的應用程序中,我使用一個CReBar對象停靠三個不同的工具欄。我已經更新了此對象的類以使用CMFCReBar,但使用某些視覺樣式時看起來不太好。

看起來Feature Pack中存在問題,因爲即使在軟件包中部署RebarTest示例時也會發生此問題。

這只是改變了視覺樣式到Office 2007的示例應用程序的截圖(使用的應用程序菜單沒有代碼):

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

有沒有人成功地使用CMFCReBar?有沒有其他方式可以實現,而不使用它?

回答

1

Paul DiLascia寫了一個class來鎖定CToolBar,我用它來創建這個類,它將在CMFCToolbar上工作。你可以複製它來爲CMFCMenuBar做同樣的事情 - 只需將MFCToolBar更改爲MFCMenuBar即可。

alt text http://i40.tinypic.com/9sv3vm.jpg

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)); 
0

我注意到使用Office 2007樣式時也出現了一些視覺問題 - 它似乎是一個小錯誤。你可以使用其他人嗎? XP Luna似乎相當穩定...

+0

嘿斯圖!謝謝你的評論。其他樣式也會出現問題。這不是很明顯,但它也有一些視覺上的「缺陷」。 – 2009-01-15 16:28:09

+0

是的,我也看到了其他樣式的問題,但沒有一個像Office 2007那樣糟糕。看起來,主題主要是有效的,直到你嘗試做什麼事情,甚至有點不同尋常。 – 2009-01-15 17:00:00

2

基本上你不需要再使用鋼筋控制。通過簡單地創建您的CMFCToolbars和CMFCMenuBar,對它們調用EnableDocking,然後對它們使用DockPane,它們將停靠並採用Office 2007(或任何其他您使用的主題)外觀。查看WordPad Feature Pack示例,或者使用AppWizard創建一個新項目(其中所有默認設置均爲正常)以查看示例。

好的,從您的評論:如果你想停靠工具欄彼此相鄰,你可以在DockPane後使用DockPaneLeftOf。按照我的經驗,如果您先不使用DockPane這兩個工具欄,它會以奇怪的方式工作。

我還沒有找到一個很好的簡單的解決方案來停止拖動工具欄,而不是相互停靠時,您可以刪除CBRS_GRIPPER樣式,但不會停止工具欄被拖動。

您也可以在菜單欄或工具欄上調用EnableDocking。這將使他們成爲固定的地方。但是,DockPaneLeftOf在這種情況下似乎不起作用,因此您將丟失相互靠近的工具欄。

因此,如果您想要停止停靠或停靠工具欄,現在看起來就像是其中一個。

+0

嗨Alisdair沃克, 感謝您的答覆。也許你是對的,問題是我沒有使用正確的控制。但是我希望我的工具欄不會被用戶取消鎖定,並且我希望我的三個工具欄位於同一行。你能幫我實現嗎? – 2009-02-03 09:00:23