Visual C++是一種可視化很強(qiáng)的編程工具,其內(nèi)置的向?qū)ppWizard可以自 動(dòng)生成程序的基本框架,減少了大量程序開(kāi)發(fā)基本工作。比如利用的AppWizard 可以自動(dòng)為應(yīng)用程序生成菜單和工具欄,非常方便。如果是編寫(xiě)一般的應(yīng)用程 序,完全可以在其提供的菜單和工具欄上進(jìn)行修改,添加或刪除菜單項(xiàng)。但在實(shí) 際使用中,如果遇上些比較復(fù)雜的程序,僅用系統(tǒng)提供的菜單和工具欄是遠(yuǎn)遠(yuǎn)不 夠的。應(yīng)用程序應(yīng)該可以按照用戶的不同狀態(tài),顯示不同菜單項(xiàng)和工具欄,以 實(shí)現(xiàn)動(dòng)態(tài)的對(duì)菜單和工具欄進(jìn)行修改,加載新的菜單和工具欄。在編程過(guò)程中 實(shí)現(xiàn)菜單和工具欄的動(dòng)態(tài)修改基本上有兩種方法。 一是在程序運(yùn)行過(guò)程中利用Cmenu類的AppendMenu和Cmenu類的InsertMenu按 需在菜單上插入新的菜單項(xiàng),但此方法如果只是用在動(dòng)態(tài)改變少數(shù)菜單項(xiàng),其編 程工作量還是可以接收,但如果需要改變的部分較多則編程工作量就很大,而且 最大問(wèn)題是如果采用此法插入的菜單項(xiàng),CLASS WIZARD不能產(chǎn)生相應(yīng)的消息響 應(yīng)函數(shù),程序員必須自己編寫(xiě)消息響應(yīng)循環(huán)。 因此,提出第二種動(dòng)態(tài)修改方法。該方法的關(guān)鍵是不對(duì)菜單和工具欄進(jìn)行修 改,而是通過(guò)加載不同的菜單和工具欄實(shí)現(xiàn)對(duì)菜單和工具欄的動(dòng)態(tài)修改。該方 法的優(yōu)點(diǎn)在于不必編寫(xiě)大量的菜單項(xiàng)插入命令,只需事先在資源內(nèi)根據(jù)實(shí)際的 情況定義不同的菜單和工具欄,然后在程序中根據(jù)用戶狀態(tài)加載不同的菜單和 工具欄資源實(shí)現(xiàn)菜單和工具欄的動(dòng)態(tài)更新。而且此方法適用于CLASS WIZARD, 可以在CLASS WIZARD中直接產(chǎn)生各菜單項(xiàng)的消息響應(yīng)和其它相關(guān)函數(shù),大大減少 了程序的開(kāi)發(fā)工作量。 其具體步驟如下: 首先分析程序運(yùn)行過(guò)程中所出現(xiàn)的各種變化情況,按照不同的菜單狀態(tài)在資 源管理中創(chuàng)建不同的菜單資源和工具欄資源。然后在需要修改菜單和工具欄的地 方利用LoadToolBar函數(shù)和LoadMenu函數(shù)調(diào)入相應(yīng)的菜單資源和工具欄資源。 void CMainFrame::OnSwitch) //調(diào)入以IDR_NEWTOOLBAR表示的工具欄資源; m_wndToolBar.LoadToolBar(IDR_NEWTOOLBAR); //調(diào)入新的工具欄后,調(diào)用Invalidate函數(shù)以確保使用新的位圖圖象重畫(huà)工具欄; m_wndToolBar.Invalidate(); CMenu cMenu; //調(diào)用新的以IDR_NEWMENU表示的菜單資源; cMenu.LoadMenu(IDR_NEWMENU); //將cMenu設(shè)置為當(dāng)前菜單; SetMenu(&cMenu); //釋放菜單句柄 cMenu.Detach(); //重畫(huà)菜單條; DrawMenuBar(); //重新繪制窗口區(qū)域; RecalcLayout(TRUE); 在切換菜單時(shí)注意一定要在調(diào)用SetMenu函數(shù)設(shè)置當(dāng)前窗口菜單后立即調(diào) 用Detach函數(shù)從CMenu對(duì)象中釋放菜單句柄,這樣可以防止Cmenu在移出作用域 時(shí)新菜單被破壞,當(dāng)前的函數(shù)終止時(shí)回發(fā)生這種情況。最后要調(diào)用RecalcLayout 重新計(jì)算窗口大小重新繪制窗口。如果是僅僅替換一個(gè)工具欄可以不用該函數(shù), 但如果新的工具欄比原工具欄大小不同或者要調(diào)用多個(gè)工具欄則一定要使用該函 數(shù)重新計(jì)算客戶窗口的大小重新繪制客戶窗口。 還要補(bǔ)充一點(diǎn),如果僅修改工具欄,還有一種比較可行的方法是在OnCreate 中一次創(chuàng)建所有的工具欄對(duì)象,然后利用ShowWindow按需要決定其顯示與否。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) ...... //創(chuàng)建第一個(gè)工具欄; if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) TRACE0("Failed to create toolbar\n"); return -1; // fail to create //創(chuàng)建第二個(gè)工具欄; if (!m_wndNewToolBar.Create(this) || !m_wndNewToolBar.LoadToolBar(IDR_NEWTOOLBAR)) TRACE0("Failed to create toolbar\n"); return -1; // fail to create //設(shè)置工具欄屬性; 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); //不顯示第二個(gè)工具欄;如要顯示將參數(shù)設(shè)置為SW_SHOW; m_wndNewToolBar.ShowWindow(SW_HIDE); return 0; 以上對(duì)菜單和工具欄的動(dòng)態(tài)修改方法可以按實(shí)際需要選擇使用。適當(dāng)修改后 同樣適合于Borland C++。實(shí)際編程中可以將以上動(dòng)態(tài)修改方法結(jié)合菜單項(xiàng)插入 和菜單項(xiàng)變灰等方法,使你的菜單和工具欄更加簡(jiǎn)單實(shí)用。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!