<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 20.8 管理應用程序設置 大多數的應用程序都會給用戶一些選項,以便用戶自己決定一些應用程序的行為,比如是否顯示每日提示,文本應用什么字體,或者是否顯示啟動畫面等.而程序員需要作的決定是怎樣保存和顯示這些配置數據.關于怎樣存儲,通常我們需要使用wxConfig家族的類,這些類讓你可以直接處理類型化的配置數據.至于如何顯示,則是非常靈活的,我們將簡短的介紹一些可能的選項. 保存配置數據 所有wxWidgets提供的用于處理配置數據的類都是wxConfigBase的派生類,因此你可以在這個基類的手冊中找到相關的使用方法.而wxConfig則被定義為各個平臺上推薦使用的用于處理配置數據的類:在windows平臺,它被定義為wxRegConfig(這個類使用 windows的注冊表),在所有別的平臺上它被定義為wxFileConfig(它使用文本文件).另外還有wxIniConfig類,它使用一個 Windows 3.1風格的.ini配置文件,不過這個類很少被使用到.而wxFileConfig則可以支持各個平臺. wxConfig類提供了各種Read和Write函數的重載函數,用來直接讀寫各種數據類型,包括wxString, long, double和bool類型等. 配置文件中的每個項目都需要提供一個路徑,這個路徑由"/"分割并且最后必須是一個名稱,比如"/General/UseTooltips".你可以使用 wxConfig::SetPath函數設置一個當前路徑,這樣的話,在后續的讀寫中,如果沒有指定絕對路徑(以"/"開頭),所有的路徑都被認為是相對于這個路徑的路徑. 使用路徑的目的是為了對配置項進行分組. wxConfig的構造函數需要使用應用程序名和供應商名稱,這兩個名稱用來決定配置項的位置,比如: ``` #include "wx/config.h" wxConfig config(wxT("MyApp"), wxT("Acme")); ``` wxRegConfig將會從應用程序名和供應商名稱構造一個注冊表項,比如前面的例子中將會導致注冊表項 HKEY_CURRENT_USER/Software/Acme/MyApp被創建.而如果是Unix系統上的wxFileConfig類,配置文件默認被保存在文件~/.MyApp中. 而在Mac OSX上,則保存在/Library/Preferences/MyApp/Preferences中.這些缺省位置可以通過給wxConfig傳遞第三個參數來改變: 下面是一些wxConfig的用法: ``` // 讀取 wxString str; if (config.Read(wxT("General/DataPath"), & str)) { ... } bool useToolTips = false; config.Read(wxT("General/ToolTips"), & useToolTips)); long usageCount = 0; config.Read(wxT("General/Usage"), & usageCount)); // 寫入 config.Write(wxT("General/DataPath"), str)) config.Write(wxT("General/ToolTips"), useToolTips)); config.Write(wxT("General/Usage"), usageCount)); ``` 其它一些可以使用的操作包括比例組和選項條目,查詢某個組或者某個選項是否存在,刪除一個條目或者一個組等. 你可以臨時使用wxConfig來讀取一些存放在某個地方的數據,你也可以創建一個wxConfig的實例并且在應用程序的整個生命周期維持它.wxWidgets也有一個稱為默認wxConfig對象的機制,這個默認的對象可以通過wxConfig::Set函數設置.如果設置了這個默認對象,一些wxWidgets的內部實現將會使用這個對象,比如wxFontMapper類或者平臺通用的wxFileDialog實現. 編輯選項 如果你只有很少的選項,那么普通的對話框也許就足夠了.但是有時候,選項有很多,并且非常復雜,這時候,你可能需要很多對話框或者面板, 這種情況下最通常的作法是使用包含一個wxNotebook的模式對話框,這個對話框的底部應該有OK,Cancel或者Help按鈕.其中Help按鈕的處理函數將會查詢當前正在顯示的頁面并顯示一個相應的幫助文件主題.wxWidgets提供了一個叫做wxPropertySheetDialog的對話框來處理這種情形.wxWidgets自帶的samples/dialogs例子中演示了它的使用方法.在Pocket PC上,這個對話框里的notebook控件將顯示成屏幕底部標準的屬性頁面. 你也可以使用wxListbook和wxChoicebook來代替wxNotebook,它們是控制多頁控件的又一個選擇.尤其是 wxListbook,它的API和wxNotebook幾乎相同,但是它使用wxListCtrl而不是TAB來控制頁標簽,因此你可以使用圖標和標簽來代替TAB按鈕.這在你擁有很多頁面的時候也很有用.尤其是在Mac OSX平臺上,這個平臺的wxNotebook控件不能夠自己滾動標簽按鈕,因此標簽按鈕的數目受限于wxNotebook的寬度和標簽的寬度.另外你也可以下載第三方的awxOutbarDialog控件,它實現了一個類似Outlook外觀的那種多頁控件,使用圖標來在頁面間切換. 你也可以創建自定義的分頁管理對話框,比如你可以使用wxtreeCtrl控件,這可以讓你的各個頁面保持一種樹狀的繼承關系.要實現這個自定義控件,你可以維護一組面板列表,每一個都綁定一個名字.當用戶點擊樹狀控件上的某個子項的時候,隱藏當前正在顯示的面板,而顯示樹狀控件子項對應的面板.另外一個方案是使用Jorgen Bodde制作的wxTreeMultiCtrl控件,這個控件實現了上面所介紹的內容,因此你可以以更直觀的方法使用樹狀分頁控件,而不比自己處理每個單獨的頁面. 你也可以考慮使用一個屬性編輯框:這是一個擁有一系列子項,每個子項左邊擁有一個文本標簽,右邊擁有一個編輯框.這個控件的好處在于增加和刪除設置是非常容易的,并且不影響界面的布局.不好的地方在于,如果你要編輯多行文本或者編輯一個列表就比較困難,盡管你可以攔截子項的雙擊事件,使用定制的對話框來顯示其內容. 你可以實現自己的屬性編輯框,或者你可以考慮使用wxGrid.,或者使用第三方的屬性編輯控件比如Jaakko Salli的wxPropertyGrid.有些應用程序混合使用了對話框和屬性列表,比如DialogBlocks設置對話框的配置頁面. 你最好不要使用帶有滾動條的面板或者對話框來避免配置項控件超出范圍之外,因為這會是人感覺迷惑并且也是很丑陋的. 你應該考慮將你應用程序的所有設置保存在一個統一的類中,并且為這個類實現一個拷貝構造函數,一個等于操作以及一個賦值操作.通過這種方法,你可以很容易的創建一個所有配置項的副本,將其傳遞給你的配置對話框,并且僅僅在用戶點擊了配置對話框上的OK按鈕的時候,才將修改的數據保存回你的全局配置中. 如果你沒有單獨的保存各個配置項,你需要給你的用戶提供一種直接修改配置的方法.參考光盤中的 examples/chap20/valconfig例子.其中包含了一個類wxConfigValidator,這個類可以用來作為普通控件的驗證器, 它的參數包括配置項路徑,配置項類型以及一個指向wxConfig對象的指針.其中值類型可以是wxVAL_BOOL, wxVAL_STRING或者wxVAL_LONG.如下所示: ``` void MyDialog::SetValidators(wxConfig* config) { FindWindow( ID_LOAD_LAST_DOCUMENT )->SetValidator( wxConfigValidator(wxT("LoadLastDoc"), wxVAL_BOOL, config)); FindWindow( ID_LAST_DOCUMENT )->SetValidator( wxConfigValidator(wxT("LastDoc"), wxVAL_STRING, config)); FindWindow( ID_MAX_DOCUMENTS)->SetValidator( wxConfigValidator(wxT("MaxDocs"), wxVAL_LONG, config)); } ``` 第9章中介紹了更多關于驗證器的知識.本節提到的那些第三方控件可以在附錄E,"wxWidgets的三方控件"中找到.
                  <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>

                              哎呀哎呀视频在线观看