自訂通用對話框
您可以使用標準表單中的通用對話框,也可以自訂它們。 從用戶的觀點來看,通用對話框的主要優點是從應用程式到應用程式一致的外觀和功能。 因此,只有當應用程式絕對必要時,才必須自定義通用對話方塊。 否則,會遺失一致的外觀和簡單的編碼介面。 適當的自定化會盡可能保留原始的控制項。 增加對話框的大小,或在對話框中已可用的空間中新增新控件是適當的自定義。 隱藏原始控件或其他變更原始控件的預期功能是較不適當的自定義。
本節討論自定義通用對話框的下列方法:
自定義範本
通用對話框有預設範本,可定義對話框中標準控件的數目、類型和位置。 您可以定義自定義範本,讓使用者存取應用程式特有的其他控制件。
針對 [檔案總管] 樣式 [開啟] 和 [另存新檔] 對話方塊以外的所有通用對話框,您可以修改預設範本來建立取代默認範本的自定義範本。 自定義範本會定義標準控制件的類型和位置,以及任何其他控制件。
當您藉由修改預設對話框範本來建立自定義對話框範本時,請確定任何新增控件的標識碼是唯一的,而且不會與標準控件的標識符衝突。 下表列出預設範本檔案的名稱,並包含每個通用對話框類型的檔案。
對話框類型 | 範本檔案 | 包含檔案 |
---|---|---|
(色彩) | Color.dlg | ColorDlg.h |
尋找 | Findtext.dlg | Dlgs.h |
字型 | Font.dlg | Dlgs.h |
開啟 (多重選擇) | Fileopen.dlg | Dlgs.h |
開啟 (單選) | Fileopen.dlg | Dlgs.h |
頁面設定 | Prnsetup.dlg | Dlgs.h |
列印 | Prnsetup.dlg | Dlgs.h |
列印設定 (過時) | Prnsetup.dlg | Dlgs.h |
取代 | Findtext.dlg | Dlgs.h |
若要啟用自定義範本,您必須在對話框對應結構的 旗標 成員中設定旗標。 如果範本是應用程式或動態連結庫中的資源,請在 Flags 成員中設定 ENABLETEMPLATE 旗標,並使用 hInstance 和 lpTemplateName 結構的成員來識別模組和資源名稱。 如果範本已在記憶體中,請在 Flags 成員中設定 ENABLETEMPLATEHANDLE 旗標,並使用 hInstance 成員來識別包含範本的記憶體物件。
在大部分情況下,您也必須啟用對話框的鉤子程序,以支援和處理自訂範本中額外控制項的輸入。
針對 Explorer 樣式的 [開啟] 和 [另存新檔] 對話框,預設範本無法修改。 相反地,您的自定義範本會定義子對話方塊,其中只包含要新增至標準對話框的專案。 自定義範本也可以定義靜態控件,指定子對話框中標準控件叢集的位置。 如需詳細資訊,請參閱 Explorer-Style 自定義範本。
通用對話框的攔截程式
對於每個通用對話框,您可以啟用勾點程式來處理預設對話框程式中的訊息。 常見的對話鉤子程序有兩種通用類型:
- 與最常見對話框搭配使用的標準掛鉤程式
- 開啟 和 另存新檔 對話框所支援的 Explorer 風格的掛鉤程式
當您為其中一個通用對話方塊提供標準攔截程式時,預設對話框程式會處理其訊息,如下所示。
訊息 | 處理 |
---|---|
WM_INITDIALOG | 默認對話框程式會在將訊息傳遞至攔截程式之前處理訊息。 訊息的 lParam 參數是建立對話框時所指定初始化結構的指標。 |
所有其他訊息 | 掛鉤程序會先接收訊息。 然後,攔截程式的傳回值會決定默認對話程式是否處理訊息或忽略它。 |
針對檔案瀏覽器樣式的 「開啟」和 「另存新檔」 對話方塊,掛鉤函式不會接收用於對話方塊中標準控件的訊息。 相反地,它會從對話方塊接收通知訊息,以及您在自定義範本中定義的任何其他控制件的訊息。 如需詳細資訊,請參閱 Explorer-Style 鉤子程序。
若要啟用攔截程式,請在對話框對應結構的 旗標 成員中設定 ENABLEHOOK 值。 如果已設定 ENABLEHOOK 旗標,則結構的 lpfnHook 成員必須指定掛鉤程序的位址。
下表顯示要針對每個常見對話框提供的掛鉤程式類型。
對話框類型 | 掛鉤程序 |
---|---|
顏色 | CCHookProc |
尋找 或 取代 | FRHookProc |
字型 | CFHookProc |
開啟 或 另存新檔 (Explorer-style) | OFNHookProc |
開啟 或 另存新檔 (舊式) | OFNHookProcOldStyle |
列印 | PrintHookProc |
頁面設定 | PageSetupHook |
針對 [頁面設定] 對話框,您也可以指定 PagePaintHook 攔截程式。 這是一個特殊的掛勾程式,可用於自定義 [頁面設定] 對話框所顯示之範例頁面的外觀。
注意
頁面設定 對話框已取代 列印設定 對話框。 應用程式應該使用 [頁面設定] 對話框。 不過,為了相容性,PrintDlg 函式會繼續支持顯示 [列印安裝] 對話框。 您可以為 [列印設定] 對話框提供 SetupHookProc 掛勾程式。
一般對話框訊息
常見的對話框會使用訊息,在發生特定事件時通知您的視窗程式或攔截程式。 此外,您也可以傳送至通用對話框的訊息來擷取資訊,或控制對話框的行為或外觀。 本節描述 RegisterWindowMessage 函式所註冊的一般對話方塊訊息、字型 對話框和 頁面設定 對話框所使用的訊息,以及 Explorer 樣式 開啟 和 另存新檔 對話框所使用的訊息。
通用對話框連結庫會定義一組訊息字串。 您可以將與其中一個訊息字串相關聯的常數傳遞至 RegisterWindowMessage,以取得訊息標識碼。 然後,您可以使用標識符來偵測及處理從通用對話框傳送的訊息,或將訊息傳送至通用對話方塊。 下表顯示訊息常數,並描述其用法。
目錄 | 使用 |
---|---|
COLOROKSTRING | 當使用者選取色彩並按一下 [確定] 按鈕時,[色彩] 對話框會將此訊息傳送至攔截程式。 掛鉤程序可以接受色彩,也可以拒絕它並迫使對話框保持開啟。 |
FILEOKSTRING |
當使用者選取檔名並按一下 [ 確定] 按鈕時,[ 開啟或 另存新檔] 對話框會將此訊息傳送至攔截程式。 攔截程式可以接受檔名,或拒絕它,並強制對話框保持開啟。 針對檔案總管樣式 開啟 和 另存新檔 對話框,此訊息已被 CDN_FILEOK 通知訊息取代。 |
FINDMSGSTRING | 當使用者按兩下 [尋找下一個] 、[取代] 或 [取代全部] 或關閉對話框時,[尋找 或 取代] 對話框時,會將此訊息傳送至其父視窗的窗口程式。 訊息的 lParam 參數是包含使用者輸入之 FINDREPLACE 結構的指標。 |
HELPMSGSTRING | 當使用者按下 [說明] 按鈕時,所有常見的對話框都會將此訊息傳送至其父視窗的視窗程式。 針對檔案總管樣式的 開啟 和 另存新檔 對話框,該訊息已由 CDN_HELP 通知訊息所取代。 |
LBSELCHSTRING |
[開啟 或 存為新檔案] 對話方塊會在使用者於 檔名 清單框中變更選取時,傳送此訊息至掛鈎程序。 針對檔案總管樣式 開啟 和 另存新檔 對話框,CDN_SELCHANGE 通知訊息已取代此訊息。 |
SETRGBSTRING | 掛鉤程式可以將此訊息傳送至 [色彩] 對話框,以設定目前的色彩選擇。 |
SHAREVISTRING | 如果使用者按下 [ 確定] 按鈕時,當前選擇的檔案發生共用違規,開啟 或 [另存新檔] 對話框會將此訊息傳送至攔截程式。 針對檔案總管樣式 開啟 和 另存新檔 對話框,此訊息已被 CDN_SHAREVIOLATION 通知訊息取代。 |
某些常見的對話框會傳送和接收其他視窗訊息。 字型 對話框的攔截程式可以將任何 WM_CHOOSEFONT_* 訊息傳送至 字型 對話框。 如需詳細資訊,請參閱 字型對話框。 如果您已啟用 PagePaintHook 攔截程式,則 [頁面設定] 對話框會傳送 WM_PSD_* 訊息。 如需詳細資訊,請參閱 頁面設定對話框。
檔案總管樣式 開啟 和 另存新檔 對話框支援一組預先定義的訊息。 其中包括以 WM_NOTIFY 訊息的形式傳送至攔截程式的通知訊息,以及您的攔截程式可以傳送至對話框的訊息。 如需這些訊息的完整清單,請參閱 Explorer-Style Hook Procedures。
幫助與支援
一般對話框會提供對話框標準控制元件的上下文相關說明。 若要提供一般對話方塊的額外幫助,您可以顯示 說明 按鈕,並在使用者點擊按鈕時處理產生的訊息。 說明 按鈕是預設上下文相關說明的補充。 Help 按鈕適用於描述對話方塊在您的應用程式中的一般用途。
Context-Sensitive 說明
所有通用對話框都會提供對話框標準控件的上下文相關的說明。 用戶可以透過下列任何方法顯示個別控件的說明:
- 選取控件,然後按 F1 鍵。
- 按兩下 ?在標題列中 按鈕,然後按下控件。
- 在控制件上點擊滑鼠右鍵。
如果您藉由新增控制項來自訂對話方塊,您也必須藉由在掛鉤程式中處理說明請求來擴充這些控制項的協助支援。 當使用者要求協助時,攔截程式會收到下列訊息。
用戶動作 | 訊息 |
---|---|
按兩下控制件上的滑鼠右鍵。 | WM_CONTEXTMENU |
按下 F1 鍵。 | WM_HELP |
按兩下 ? 標題列上的按鈕,然後按下控件。 | WM_HELP |
您應該處理已新增之控件的這些訊息,但讓預設對話框程式處理標準控件的訊息。 如需如何處理這些訊息的詳細資訊,請參閱 說明。
說明按鈕
您可以在任何通用對話框中,通過在該對話框的初始化結構的 Flags 成員中設置 SHOWHELP 值,來顯示 說明 按鈕。 如果您顯示 [幫助] 按鈕,則必須處理使用者的求助要求。 您可以在應用程式的其中一個視窗程序或對話框的鉤子程序中完成處理。 一般而言,您會呼叫 WinHelp 函式來處理要求協助。
若要在其中一個視窗程式中處理說明訊息,您必須取得 HELPMSGSTRING 值所定義的字串訊息標識碼,並識別要接收訊息的視窗。 若要取得訊息標識碼,請在呼叫 registerWindowMessage 函式時,將 HELPMSGSTRING 指定為 參數。 當您建立對話框時,請使用 hwndOwner 對話框初始化結構的成員來識別要接收訊息的視窗。 每當使用者按兩下 [說明] 按鈕時,對話框程式就會將訊息傳送至視窗程式。
若要處理鉤子程序中的說明訊息,您應該處理 WM_COMMAND 訊息。 當此訊息的 wParam 參數顯示使用者按下 [幫助] 按鈕時,鉤子程序會提供幫助。 說明 按鈕的標識符是 Dlgs.h 檔案中定義的 pshHelp 常數。
檔案總管樣式 開啟 和 另存新檔 對話框的掛鉤程序不會收到 說明 按鈕的 WM_COMMAND 訊息。 相反地,當按下 說明 按鈕時,對話框會將 CDN_HELP 通知訊息傳送至攔截程式。