# 9.4 一些更深入的話題
下面的這些提示可以讓你創建的對話框看上去更專業.
鍵盤導航
盡量給你的對話框上的控件的標簽增加"&"前導符,在某些平臺(特別明顯的是在windows和GTK+平臺上),這將使得用戶可以通過鍵盤在控件之間移動.
總是給你的對話框提供一個取消操作,最好是使用Escape鍵來執行這個操作.如果你的對話框有一個標識符為wxID_CANCEL的按鈕,那么默認情況下它的處理函數將在用戶按下Escape鍵的時候被執行,因此,如果你有一個單純用來關閉對話框的按鈕,最好將它的標識符定義為wxID_CANCEL.
提供一個默認按鈕(通常為OK按鈕),你可以通過wxButton::SetDefault函數指定一個默認按鈕,這個按鈕的處理函數將在用戶按下回車鍵的時候被調用.
數據和用戶界面分離
為了簡化例子,我們在PersonalRecordDialog中采用了把數據存放在對話框內部的方法.然而,一個更好的設計應該是讓用戶數據和對話框分離,在構造函數中進行賦值操作,這樣的話你就可以更方便的傳遞一組數據給這個對話框的構造函數,以及在用戶確認修改的時候(按下OK按鈕的時候)從對話框獲取一整組數據.這也是大多數標準對話框采用的方法.作為一個練習,你可以使用PersonalRecordData類作為 PersonalRecordDialog的數據成員重寫PersonalRecordDialog的代碼,以使得對話框的構造函數采用 PersonalRecordData的引用作為參數,而對話框的Getdata函數則返回其內部數據的引用.
一般說來,你應該盡可能的將界面功能和非界面功能分開.這通常會讓你的代碼顯得更緊湊.不要害怕增加新的類,它會讓你的設計更優雅,也不要懼怕在類中使用復制或者賦值之類的操作,如果一個對象能夠很容易的被賦值和賦值,應用程序可以少些很多底層的賦值代碼.
除非你的對話框提供了一個類似"Apply"功能的按鈕,否則,在對話框被取消之后,所有內部的數據應該保持原樣.使用數據和界面分離的原則也使得實現這一點變得相對容易,因為通常在這種情況下,你只是操作數據的一份拷貝而不是數據本身.
布局
如果你的對話框看上去好像顯得有些擁擠或者說有些丑陋,可能是因為你沒有給予足夠的空白區間.你可以嘗試單獨使用一個布局控件來增加一個大的邊界區域,就象我們在例子中作的那樣,在一組控件和另外一組控件之間增加空白,或者使用wxStaticBoxSizer和wxStaticLine 將邏輯上處于兩組的控件區隔開.使用wxGridSizer和wxFlexGridSizer布局控件來對齊控件及它們對應的標簽以便它們的位置顯得不那么零亂.在基于布局控件的布局中,還可以使用空白區域來實現對齊.比如,通常OK,Cancel按鈕和Help按鈕應該被設置為右對齊,你可以通過在水平 wxBoxSizer的水平方向上增加一個可以縮放的(縮放因子不為負數的)空白區域,然后再增加這些按鈕,以便在對話框的水平大小發生改變時實現按鈕的右對齊.
盡可能的讓你的對話框的邊框是可以改變大小的,通常windows系統上的對話框的大小是不能被改變的,但是這樣做實在是有些無厘頭. 在一個大的對話框上使用很少的控件通常都令用戶感到沮喪.在wxWidgets下通過布局控件創建可變大小的對話框是非常簡單的事情,你應該盡可能的使用布局控件以便你的對話框可以自適應字體和語言以及對話框大小的改變.當然,你要小心的選擇那些可以隨著對話框大小的改變而改變大小的控件,例如,多行文本框控件就是一個不錯的選擇,它的大小隨著對話框的大小一起增長可以給用戶更多實用的空間,另外,你還可以考慮把增加的空間分給空白區域以實現對齊.注意我們這里說的控件增大,不是只的縮放控件或者是讓控件的文本變的更大,而僅僅是指的增加控件的寬度和高度.參考第7章以得到更多關于布局控件的知識.
如果你發現你的對話框上放置了太多的控件,你應該考慮增加面板,并且使用wxNotebook, wxListbook或wxChoicebook來進行分頁.使用太多菜單來打開很多互不相干的對話框通常是非常令用戶感到不爽的,用分頁控件,用戶自己選擇查看哪個頁面,這樣就顯得方便多了.同時在面板里使用滾動條也是應該被避免的(除非你又充足的原因).這一方面是因為不是所有的平臺都支持滾動控件, 另外一方面,這也會給用戶一個印象:你對控件布局并沒有進行充分的設計.如果你有很多的屬性需要用戶編輯,你可以考慮使用基于wxGrid的屬性編輯器或者其它的第三方控件(參考wxPropertyGrid,在附錄E,"wxWidgets的第三方工具"中有提到這個控件).
美學
標簽的大小寫要保持一致.不要給對話框設置自定義的顏色和字體,這有時候會讓你的用戶感到抓狂而且也使得你的應用程序看上去有些特立獨行 (貶義),和系統當前的風格或者你的應用程序中的其它對話框不一致.要在各個平臺都取得不錯的效果,最好讓wxWidgets自己決定對話框的顏色或者字體.取而代之的,你可以把精力花費在設計一些新穎而緊湊的小圖片上,并且在合適的位置使用wxStaticBitmap控件顯式它.
對話框的替代品
最后,對于那些非模式的解決方案,你應該好好考慮是否要使用一個對話框,也許在應用程序的主窗口中使用TAB控件會是更好的選擇. 盡管我們前面所說的大部分原則都適用于非模式的對框框,但是它們確實有一些不同之處,比如你需要額外考慮布局(通常這種窗口擁有原少于它的大小的控件)以及數據同步(對于非模式窗口來說,它在顯示的時候不能以獨占的方式訪問它的數據了).
- 第一章 介紹
- 1.1 為什么要使用wxWidgets?
- 1.2 wxWidgets的歷史
- 1.3 wxWidgets社區
- 1.4 wxWidgets和面向對象編程
- 1.5 wxWidgets的體系結構
- 1.6 許可協議
- 第一章小結
- 第二章 開始使用
- 2.1 一個小例子
- 2.2 應用程序類
- 2.3 Frame窗口類
- 2.4 事件處理函數
- 2.5 Frame窗口的構造函數
- 2.6 完整的例子
- 2.7 wxWidgets程序一般執行過程
- 2.8 編譯和運行程序
- 第二章小結
- 第三章 事件處理
- 3.1 事件驅動編程
- 3.2 事件表和事件處理過程
- 3.3 過濾某個事件
- 3.4 掛載事件表
- 3.5 動態事件處理方法
- 3.6 窗口標識符
- 3.7 自定義事件
- 第三章小結
- 第四章 窗口的基礎知識
- 4.1 窗口解析
- 4.2 窗口類概覽
- 4.3 基礎窗口類
- 4.4 頂層窗口
- 4.5 容器窗口
- 4.6 非靜態控件
- 4.7 靜態控件
- 4.8 菜單
- 4.9 控制條
- 第四章小結
- 第五章繪畫和打印
- 5.1 理解設備上下文
- 5.2 繪畫工具
- 5.3 設備上下文中的繪畫函數
- 5.4 使用打印框架
- 5.5 使用wxGLCanvas繪制三維圖形
- 第五章小節
- 第六章處理用戶輸入
- 6.1 鼠標輸入
- 6.2 處理鍵盤事件
- 6.3 處理游戲手柄事件
- 第六章小結
- 第七章使用布局控件進行窗口布局
- 7.1 窗口布局基礎
- 7.2 窗口布局控件
- 7.3 使用布局控件進行編程
- 7.4 更多關于布局的話題
- 第七章小結
- 第八章使用標準對話框
- 8.1信息對話框
- 8.2 文件和目錄對話框
- 8.3 選擇和選項對話框
- 8.4 輸入對話框
- 8.5 打印對話框
- 第八章小結
- 第九章創建定制的對話框
- 9.1 創建定制對話框的步驟
- 9.2 一個例子:PersonalRecordDialog
- 9.3 在小型設備上調整你的對話框
- 9.4 一些更深入的話題
- 9.5 使用wxWidgets資源文件
- 第九章小結
- 第十章使用圖像編程
- 10.1 wxWidgets中圖片相關的類
- 10.2 使用wxBitmap編程
- 10.3 使用wxIcon編程
- 10.4 使用wxCursor編程
- 10.5 使用wxImage編程
- 10.6 圖片列表和圖標集
- 10.7 自定義wxWidgets提供的小圖片
- 第十章小結
- 第十一章剪貼板和拖放操作
- 11.1 數據對象
- 11.2 使用剪貼板
- 11.3 實現拖放操作
- 第十一章小結
- 第十二章高級窗口控件
- 12.1 wxTreeCtrl
- 12.2 wxListCtrl
- 12.3 wxWizard
- 12.4 wxHtmlWindow
- 12.5 wxGrid
- 12.6 wxTaskBarIcon
- 12.7 編寫自定義的控件
- 第十二章小結
- 第十三章數據結構類
- 13.1 為什么沒有使用STL?
- 13.2 字符串類型
- 13.3 wxArray
- 13.4 wxList和wxNode
- 13.5 wxHashMap
- 13.6 存儲和使用日期和時間
- 13.7 其它常用的數據類型
- 第十三章小結
- 第十四章文件和流操作
- 14.1 文件類和函數
- 14.2 流操作相關類
- 第十四章小結
- 第十五章內存管理,調試和錯誤處理
- 15.1 內存管理基礎
- 15.2 檢測內存泄漏和其它錯誤
- 15.3 構建自防御的程序
- 15.4 錯誤報告
- 15.5 提供運行期類型信息
- 15.6 使用wxModule
- 15.7 加載動態鏈接庫
- 15.8 異常處理
- 15.9 調試提示
- 第十五章小結
- 第十六章編寫國際化程序
- 16.1 國際化介紹
- 16.2 從翻譯說起
- 16.3 字符編碼和Unicode
- 16.4 數字和日期
- 16.5 其它媒介
- 16.6 一個小例子
- 第十六章小結
- 第十七章編寫多線程程序
- 17.1 什么時候使用多線程,什么時候不要使用
- 17.2 使用wxThread
- 17.3 用于線程同步的對象
- 17.4 多線程的替代方案
- 第十七章小結
- 第十八章使用wxSocket編程
- 18.1 Socket類和功能概覽
- 18.2 Socket及其基本處理介紹
- 18.3 Socket標記
- 18.4 使用Socket流
- 18.5 替代wxSocket
- 第十八章小結
- 第十九章使用文檔/視圖框架
- 19.1 文檔/視圖基礎
- 19.2 文檔/視圖框架的其它能力
- 19.3 實現Undo/Redo的策略
- 第十九章小結
- 第二十章完善你的應用程序
- 20.1 單個實例和多個實例
- 20.2 更改事件處理機制
- 20.3 降低閃爍
- 20.4 實現聯機幫助
- 20.5 解析命令行參數
- 20.6 存儲應用程序資源
- 20.7 調用別的應用程序
- 20.8 管理應用程序設置
- 20.9 應用程序安裝
- 20.10 遵循用戶界面設計規范
- 20.11 全書小結