VC++環境下菜單和工具欄的動態修改技術

Visual C++使一種可視化很強的編程工具,其內置的嚮導AppWizard可以自動生成程序的基本框架,減少了大量程序開發基本工作。比如利用的AppWizard可以自動爲應用程序生成菜單和工具欄,非常方便。如果是編寫一般的應用程序,完 全可以在其提供的菜單和工具欄上進行修改,添加或刪除菜單項。但在實際使用中,如果遇上些比較複雜的程序,僅用系統提供的菜單和工具欄是遠遠不夠的。應用程序應該可以按照用戶的不同狀態,顯示不同菜單項和工具欄,以實現動態的對菜單和工具欄進行修改,加載新的菜單和工具欄。在編程過程中實現菜單和工具欄的動態修改基本上有兩種方法。

  

一是在程序運行過程中利用Cmenu類的AppendMenu和Cmenu類的InsertMenu按需在菜單上插入新的菜單項,但此方法如果只是用在動態改變少數菜單項,其編程工作量還是可以接收,但如果需要改變的部分較多則編程工作量就很大,而且最大問題是如果採用此法插入的菜單項,CLASS WIZARD不能產生相應的消息響應函數,程序員必須自己編寫消息響應循環。

  

因此,提出第二種動態修改方法。該方法的關鍵是不對菜單和工具欄進行修改,而是通過加載不同的菜單和工具欄實現對菜單和工具欄的動態修改。該方法的優點在於不必編寫大量的菜單項插入命令,只需事先在資源內根據實際的情況定義不同的菜單和工具欄,然後在程序中根據用戶狀態加載不同的菜單和工具欄資源實現菜單和工具欄的動態更新。而且此方法適用於CLASS WIZARD,可以在 CLASS WIZARD中直接產生各菜單項的消息響應和其它相關函數,大大減少了程序的開發工作量。

  

其具體步驟如下:

  

首先分析程序運行過程中所出現的各種變化情況,按照不同的菜單狀態在資源管理中創建不同的菜單資源和工具欄資源。然後在需要修改菜單和工具欄的地方利用LoadToolBar函數和LoadMenu函數調入相應的菜單資源和工具欄資源。

void CMainFrame::OnSwitch) { //調入以IDR_NEWTOOLBAR表示的工具欄資源; m_wndToolBar.LoadToolBar(IDR_NEWTOOLBAR); //調入新的工具欄後,調用Invalidate函數以確保使用新的位圖圖象重畫工具欄; m_wndToolBar.Invalidate(); CMenu cMenu; //調用新的以IDR_NEWMENU表示的菜單資源; cMenu.LoadMenu(IDR_NEWMENU); //將cMenu設置爲當前菜單; SetMenu(&cMenu); //釋放菜單句柄 cMenu.Detach(); //重畫菜單條; DrawMenuBar(); //重新繪製窗口區域; RecalcLayout(TRUE); }
  

在切換菜單時注意一定要在調用SetMenu函數設置當前窗口菜單後立即調用 Detach函數從CMenu對象中釋放菜單句柄,這樣可以防止Cmenu在移出作用域時新菜單被破壞,當前的函數終止時回發生這種情況。最後要調用RecalcLayout重新計算窗口大小重新繪製窗口。如果是僅僅替換一個工具欄可以不用該函數,但如果新的工具欄比原工具欄大小不同或者要調用多個工具欄則一定要使用該函數重新計算客戶窗口的大小重新繪製客戶窗口。

  

還要補充一點,如果僅修改工具欄,還有一種比較可行的方法是在OnCreate 中一次創建所有的工具欄對象,然後利用ShowWindow按需要決定其顯示與否。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ...... //創建第一個工具欄; if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } //創建第二個工具欄; if (!m_wndNewToolBar.Create(this) || !m_wndNewToolBar.LoadToolBar(IDR_NEWTOOLBAR)) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } //設置工具欄屬性; m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC|TBSTYLE_FLAT); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); m_wndNewToolBar.SetBarStyle(m_wndNewToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC|TBSTYLE_FLAT); m_wndNewToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndNewToolBar); //不顯示第二個工具欄;如要顯示將參數設置爲SW_SHOW; m_wndNewToolBar.ShowWindow(SW_HIDE); return 0; }
  

以上對菜單和工具欄的動態修改方法可以按實際需要選擇使用。適當修改後同樣適合於Borland C++。實際編程中可以將以上動態修改方法結合菜單項插入和菜單項變灰等方法,使你的菜單和工具欄更加簡單實用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章