VC++環境下選單和工具欄的動態修改技術 (轉)

worldblog發表於2007-12-04
VC++環境下選單和工具欄的動態修改技術 (轉)[@more@]

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章