VC++環境下菜單和工具欄的動態修改技術
發表于:2007-07-14來源:作者:點擊數:
標簽:
Visual C++是一種可視化很強的編程工具,其內置的向導AppWizard可以自 動生成程序的基本框架,減少了大量程序 開發 基本工作。比如利用的AppWizard 可以自動為應用程序生成菜單和工具欄,非常方便。如果是編寫一般的應用程 序,完全可以在其提供的菜單和工具
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_DYNA
MIC|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++。實際編程中可以將以上動態修改方法結合菜單項插入
和菜單項變灰等方法,使你的菜單和工具欄更加簡單實用。
原文轉自:http://www.kjueaiud.com