VC++環境下選單和工具欄的動態修改技術 (轉)
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 toolbarn");
return -1; // fail to create
}
//建立第二個工具欄;
if (!m_wndNewToolBar.Create(this) ||
!m_wndNewToolBar.LoadToolBar(IDR_NEWTOOLBAR))
{
TRACE0("Failed to create toolbarn");
return -1; // fail to create
}
//設定工具欄屬性;
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOL | 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_H);
return 0;
}
以上對選單和工具欄的動態修改方法可以按實際需要選擇使用。適當修改後同樣適合於Borland C++。實際程式設計中可以將以上動態修改方法結合選單項插入和選單項變灰等方法,使你的選單和工具欄更加簡單實用。
(上海 張景)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987979/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 技術乾貨 | jsAPI 方式下的導航欄的動態化修改JSAPI
- VC++的選單控制和自繪選單。 (轉)C++
- 根據介面動態修改應用底部選單欄
- c#選單欄menustrip工具欄toolstrip狀態列C#
- 工具欄選單
- Linux環境下建立靜態庫和動態庫Linux
- 在PyQt中構建 Python 選單欄、選單和工具欄QTPython
- PyQt5中的選單和工具欄QT
- .NET環境下Email的技術介紹AI
- VC++ 6.0下OpenGL開發環境配置C++開發環境
- VB環境下壓縮資料流播放技術(1) (轉)
- VB環境下壓縮資料流播放技術(2) (轉)
- VC++程式設計環境下的除錯步驟C++程式設計除錯
- "陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- 陷阱"技術探秘 ──動態漢化Windows技術的分析 (轉)Windows
- 動態漢化Windows技術的分析 (轉)Windows
- ORACLE RAC 環境下修改IPOracle
- React Router、And、Redux動態選單和動態路由ReactRedux路由
- start11,自定義win11的選單欄和桌面欄工具
- Launchey for Mac(選單欄上的熱鍵快速啟動工具)Mac
- wxPython中工具欄、狀態列、選單實現薦Python
- vue 動態載入路由,渲染左側選單欄Vue路由
- 軟體測試技術、方法和環境
- 選單技術
- 【surprise 】NET環境下Email的技術介紹AI
- 在Linux下檢視和修改環境變數Linux變數
- RAC 環境下修改歸檔模式模式
- Gtk /Glade程式設計(三) 選單和工具欄程式設計
- laravel生產環境下新增欄位Laravel
- RAC和Dataguard環境下修改sys使用者密碼密碼
- Win32環境下動態連結庫(DLL)程式設計原理 (轉)Win32程式設計
- Windows下的VC++動態連結庫程式設計WindowsC++程式設計
- LAMP架構部署和動態網站環境的配置LAMP架構網站
- 修改linux下mysql環境變數LinuxMySql變數
- DW+ASP 玩轉動態二級選單 (轉)
- 動態建立選單
- linux環境下的undelete(轉)Linuxdelete
- 從資料庫中動態選取下拉選單的方法 (轉)資料庫