<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 4.8 菜單 在這一小節中,我們來介紹一下怎樣使用wxMenu,它用一種相對簡單的辦法來提供一組命令但是卻不占用大量的空間。在下一小節,我們會描述一下怎樣在菜單條上使用菜單。 wxMenu 菜單是指的一串命令,它可以從菜單條彈出,也可以從任何一個窗口上作為關聯菜單,通過通常是右鍵單擊來彈出。菜單項可以是一個普通的命令,也可以是一個復選框或者是一個單選框。菜單項可以被禁用,這是它將不能觸發任何命令。某些菜單項可以通過一下特殊的三角符號來帶出一個新的菜單,菜單中有可以有新的特殊菜單項,這種循環可以使用任意多次。另外一種特殊的菜單項是一個分割條,它只是簡單的顯示一行或者一段空白以便把兩組菜單項進行分割。 下圖顯示了一個典型的擁有普通菜單項,復選框,單選框以及子菜單的菜單: ![](img/mhtB552%281%29.tmp) 上面的例子還演示了兩種快捷操作方法:加速鍵和快捷鍵。加速鍵是通過前導符"&"指定的,使用下劃線表示,當菜單顯示的時候可以通過這個鍵來執行相應的命令。而快捷鍵則是一個組合鍵,它可以在菜單沒有顯示的時候執行菜單命令,它通過一個TAB加一個組合鍵被定義。例如,上圖中的 New菜單是通過下面的代碼實現的: ``` menu->Append(wxID_NEW, wxT("&New...\tCtrl+N")); ``` 更多通過菜單或者wxAcceleratorTable創建快捷鍵的方法將會在第6章說明。 菜單中的復選框和單選框的狀態是由菜單類自動維護的。它們會在單擊的時候自動將自己的狀態改變,并且在下一次菜單展示的時候以新的狀態展示。對于單選框來說,在改變自己狀態的同時,它還會將其它同一組中的單選框更改為未選中的狀態。你也可以在自己的代碼中設置它們的狀態(參考第9章)。 你可以通過wxWindow::PopupMenu函數將某個菜單在一個窗口的特定位置顯示,比如下面的代碼: ``` void wxWindow::OnRightClick(wxMouseEvent& event) { if (!m_menu) { m_menu = new wxMenu; m_menu->Append(wxID_OPEN, wxT("&Open")); m_menu->AppendSeparator(); m_menu->Append(wxID_EXIT, wxT("E&xit")); } PopupMenu(m_menu, event.GetPosition()); } ``` 菜單事件在發送給它的父窗口以及進行其它的事件表匹配之前會首先發送給菜單自己。PopupMenu函數會導致程序短暫堵塞,直到用戶關閉這個菜單。如果你愿意,你可以每次都釋放舊的并且重新創建新的菜單,也可以每次都使用同一個菜單。 你應該盡可能的使用系統預定義的菜單標識符,比如wxID_OPEN, wxID_ABOUT, wxID_PRINT等等,在第三章中有一個完整的列表。需要特別指出的是,在Mac OS X上,標識符為wxID_ABOUT, wxID_PREFERENCES和 wxID_EXIT的菜單項不是顯示在你定義的菜單中,而是顯示在系統菜單中,wxWidgets自動為你的菜單作了這個調整。但是你需要注意在調整以后不要留下類似空的幫助菜單,或者是兩個菜單分割條連在一起這樣的不專業的情況出現。 在wxWidgets的發行版的例子中的samples/menu例子演示了所有菜單的功能,而在另外一個samples/ownerdrw例子中,則演示了怎樣在菜單中使用定制的字體和圖片。 wxMenu的事件 wxMenu相關的事件類型總共有四種: wxCommandEvent, wxUpdateUIEvent, wxMenuEvent, 和 wxContextMenuEvent. 下表列出了處理函數使用wxCommandEvent作為參數類型的事件映射宏。可用其來處理菜單命令,無論是彈出菜單命令還是主菜單(來自類似Frame窗口的菜單條上的菜單)命令。這種事件宏和工具條上的事件映射宏是一致的,這使得菜單和工具條上的按鈕產生的事件可以通過同一個處理函數處理。 | EVT_MENU(id, func) | 用來處理wxEVT_COMMAND_MENU_SELECTED事件,某個菜單項被選中的時候產生. | |:--- |:--- | | EVT_MENU_RANGE(id1, id2, func) | 用來處理wxEVT_COMMAND_MENU_RANGE事件,在某個范圍內的菜單項被選中的時候產生. | 下表列出了處理函數使用wxUpdateUIEvent作為參數類型的事件映射宏。這種宏對應的事件是在系統空閑的時候產生的,以便給應用程序一個更新用戶界面的機會。例如,允許或者禁止一個菜單項等。盡管wxUpdateUIEvent可以被任何窗口產生,但是菜單產生的 wxUpdateUIEvent還是有一些不同的地方,在于在這個事件中可以調用Check函數,SetText函數和Enable函數等。Check函數用來選中或者不選某個菜單項,而SetText函數用來設置菜單項的標簽。如果菜單項的標簽需要根據某種條件動態改變的話會比較有用。例如: ``` BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_UPDATE_UI(ID_TOGGLE_TOOLBAR, MyFrame::OnUpdateToggleToolbar) END_EVENT_TABLE() void MyFrame::OnUpdateToggleToolbar(wxUpdateUIEvent& event) { event.Enable(true); event.Check(m_showToolBar); event.SetText(m_showToolBar ? wxT("Show &Toolbar (shown)") : wxT("Show &Toolbar (hidden)")); } ``` | EVT_UPDATE_UI(id, func) | 用來處理wxEVT_UPDATE_UI事件. 處理函數可以調用Enable, Check, 和SetText以及其它函數. | |:--- |:--- | | EVT_UPDATE_UI_RANGE(id1, id2, func) | 用來處理wxEVT_UPDATE_UI事件,以便同時處理一組標識符. | 關于界面更新的更多詳情請參考第9章。 下表列出另外一些事件映射宏,其中EVT_CONTEXT_MENU的參數類型為wxContextMenuEvent,這是一個從 wxCommandEvent繼承的事件類型,因此這個事件可以在父子窗口繼承關系中傳播。使用這個宏來攔截類似鼠標右鍵單擊以產生關聯菜單的事件,然后調用事件的GetPosition函數來獲得菜單應該顯示的準確位置。剩下的事件映射宏的處理函數采用wxMenuEvent對象作為參數,這些事件只從菜單條發送給其frame窗口,來告訴應用程序一個菜單已經被打開或者關閉了,或者某個菜單項正被高亮顯示,默認的EVT_MENU_HIGHLIGHT 的處理函數是在主程序的狀態欄顯示這個菜單項的幫助信息,不過你可以提供你自己的處理函數來作一些不同的事情。 | EVT_CONTEXT_MENU(func) | 用來處理由于用戶或者通過某個特殊按鍵(在windows平臺上),或者通過單擊鼠標右鍵產生的彈出一個上下文菜單的請求。處理函數的參數類型為wxContextMenuEvent. | |:--- |:--- | | EVT_COMMAND_CONTEXT_MENU(id, func) | 和EVT_CONTEXT_MENU相似,不過多了一個窗口標識符參數. | | EVT_MENU_OPEN(func) | 用來處理wxEVT_MENU_OPEN事件,在一個菜單即將被打開的時候產生。在windows平臺上主菜單上每次遍歷只會導致一次這個事件產生. | | EVT_MENU_CLOSE(func) | 用來處理wxEVT_MENU_CLOSE事件,它在某個菜單被關閉的時候產生. | | EVT_MENU_HIGHLIGHT(id, func) | 用來處理wxEVT_MENU_HIGHLIGHT事件,當某個菜單項被高亮顯示的時候產生,通常用來在主程序的狀態欄上產生關于這個菜單項的幫助信息。 | | EVT_MENU_HIGHLIGHT_ALL(func) | 用來處理wxEVT_MENU_HIGHLIGHT事件,在任何一個菜單項被高亮顯示的時候產生。 | wxMenu的成員函數 Append增加一個菜單項: 參數為標識符,菜單項標簽, 幫助信息和菜單項類型(wxITEM_NORMAL, wxITEM_SEPARATOR, wxITEM_CHECK 或 wxITEM_ RADIO). 你也可以使用AppendCheckItem和AppendRadioItem來避免手動指定wxITEM_CHECK或wxITEM_RADIO參數類型.例如: ``` // 增加一個普通菜單項 menu->Append(wxID_NEW, wxT("&New...\tCtrl+N")); // 增加一個復選框菜單項 menu->AppendCheckItem(ID_SHOW_STATUS, wxT("&Show Status")); // 增加一個單選框菜單項 menu->AppendRadioItem(ID_PAGE_MODE, wxT("&Page Mode")); Another overload of Append enables you to append a submenu, for example: // 增加一個子菜單 menu->Append(ID_SUBMENU, wxT("&More options..."), subMenu); ``` 還有一種Append的重載函數允許你直接使用一個wxMenuItem來增加一個菜單項,這是在菜單中增加圖片或者使用自定義字體唯一的方法: ``` // 初始化圖片和字體 wxBitmap bmpEnabled, bmpDisabled; wxFont fontLarge; // 創建一個菜單項 wxMenuItem* pItem = new wxMenuItem(menu, wxID_OPEN, wxT("&Open...")); // 設置圖片和字體 pItem->SetBitmaps(bmpEnabled, bmpDisabled); pItem->SetFont(fontLarge); // 增加到菜單中 menu->Append(pItem); ``` 使用Insert函數來在特定的位置插入一個菜單項。使用Prepend, PrependCheckItem, PrependRadioItem和PrependSeparator在菜單最開始的地方插入一個菜單項。 AppendSeparator插入一個分割條, InsertSeparator在特定位置插入一個分割條. ``` // 插入一個分割條 menu->AppendSeparator(); ``` Break函數在菜單里插入一個中斷點,導致下一個插入的菜單項出現在另外一欄。 使用Check函數是標記復選框或者單選框的狀態,參數為菜單項標識符和一個bool值。使用IsChecked函數來獲取當前狀態. Delete函數刪除并且釋放一個菜單項使用菜單項標識符或者wxMenuItem指針。如果這個菜單項是一個子菜單,則子菜單將不被刪除。如果你想刪除并且釋放一個子菜單,使用Destroy函數。Remove函數移除一個菜單項但是并不釋放它,而是返回指向它的指針。 使用Enable函數來允許或者禁止一個菜單項。但是比直接調用這個方法更好的作法是處理用戶界面更新事件(參考第9章)。IsEnabled函數返回當前的可用狀態。 使用FindItem函數根據標簽或者標識符找到一個菜單項,使用FindItemByPosition函數通過位置找到一個菜單項。 GetHelpString和SetHelpString函數用來訪問菜單項的幫助信息.當菜單是菜單條的一部分時,高亮顯示的菜單項的幫助信息將會顯示在狀態欄上。 GetLabel和SetLabel用來獲取或者設置菜單項的標簽. GetMenuCount返回菜單項的個數。 GetMenuItems返回一個wxMenuItemList類型的菜單項的列表。 GetTitle和SetTitle用來獲取或者設置菜單的可選標題,這個標題通常只在彈出菜單中有意義。 UpdateUI發送用戶界面更新事件到其參數只是的事件處理對象,如果參數為NULL則發往菜單的父窗口.這個函數在菜單即將顯示之前會被調用,但是應用程序也可以在自己認為需要的時候調用它。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看