自訂通用對話方塊

您可以使用標準格式的通用對話方塊,也可以自訂這些對話方塊。 從使用者的觀點來看,通用對話方塊的主要優點是從應用程式到應用程式一致的外觀和功能。 因此,只有在應用程式絕對必要時,您才必須自訂通用對話方塊。 否則,會遺失一致的外觀和簡單的編碼介面。 適當的自訂專案會盡可能保留許多原始控制項。 增加對話方塊的大小,或在對話方塊中已可用的空間中新增控制項是適當的自訂專案。 隱藏原始控制項,或變更原始控制項的預期功能是較不適當的自訂專案。

本節討論下列自訂通用對話方塊的方法:

自訂範本

常見的對話方塊具有預設範本,可定義對話方塊中標準控制項的數目、類型和位置。 您可以定義自訂範本,讓使用者存取應用程式專屬的其他控制項。

針對 [總管] 樣式 的 [開啟 ] 和 [ 另存 新檔] 對話方塊以外的所有通用對話方塊,您可以修改預設範本來建立取代預設範本的自訂範本。 自訂範本會定義標準控制項的類型和位置,以及任何其他控制項。

當您修改預設對話方塊範本來建立自訂對話方塊範本時,請確定任何新增控制項的識別碼都是唯一的,而且不會與標準控制項的識別碼衝突。 下表列出預設範本檔案的名稱,並包含每個通用對話方塊類型的檔案。

對話方塊類型 範本檔案 包含檔案
Color Color.dlg ColorDlg.h
Find Findtext.dlg Dlgs.h
字型 Font.dlg Dlgs.h
開啟 (多個選取範圍) Fileopen.dlg Dlgs.h
開啟 單一選取範圍 () Fileopen.dlg Dlgs.h
設定列印格式 Prnsetup.dlg Dlgs.h
Print Prnsetup.dlg Dlgs.h
列印安裝程式 (過時) Prnsetup.dlg Dlgs.h
Replace Findtext.dlg Dlgs.h

若要啟用自訂範本,您必須在對話方塊對應結構的 Flags 成員中設定旗標。 如果範本是應用程式或動態連結程式庫中的資源,請在Flags成員中設定ENABLETEMPLATE旗標,並使用 結構的hInstancelpTemplateName成員來識別模組和資源名稱。 如果範本已經在記憶體中,請在Flags成員中設定ENABLETEMPLATEHANDLE旗標,並使用hInstance成員來識別包含範本的記憶體物件。

在大部分情況下,您也必須啟用對話方塊的勾點程式,以支援和處理自訂範本中其他控制項的輸入。

針對 [總管] 樣式的 [開啟 ] 和 [ 另存新 檔] 對話方塊,預設範本無法修改。 相反地,您的自訂範本會定義子對話方塊,只包含要新增至標準對話方塊的專案。 自訂範本也可以定義靜態控制項,指定子對話方塊中標準控制項叢集的位置。 如需詳細資訊,請參閱 Explorer-Style 自訂範本

常見對話方塊的勾點程式

針對每個通用對話方塊,您可以啟用攔截程式來處理預設對話方塊程式中的訊息。 常見的對話方塊攔截程式有兩種一般類型:

  • 與最常見的對話方塊搭配使用的標準勾點程式
  • [開啟] 和 [另存新檔] 對話方塊支援的 Explorer 樣式勾點程式

當您為其中一個通用對話方塊提供標準勾點程式時,預設對話方塊程式會依照下列方式處理其訊息。

訊息 處理
WM_INITDIALOG 預設對話方塊程式會先處理訊息,再將訊息傳遞至攔截程式。 訊息的 lParam 參數是建立對話方塊時所指定的初始化結構的指標。
所有其他訊息 攔截程式會先接收訊息。 然後,攔截程式的傳回值會決定預設對話方塊程式是否處理訊息或忽略訊息。

針對 [總管] 樣式的 [開啟 ] 和 [ 另存新 檔] 對話方塊,攔截程式不會接收用於對話方塊中標準控制項的訊息。 相反地,它會從對話方塊接收通知訊息,以及您在自訂範本中定義之任何其他控制項的訊息。 如需詳細資訊,請參閱 Explorer-Style Hook Procedures

若要啟用攔截程式,請在對話方塊對應結構的Flags成員中設定ENABLEHOOK值。 如果已設定 ENABLEHOOK 旗標,結構的 lpfnHook 成員必須指定攔截程式的位址。

下表顯示為每個通用對話方塊提供的勾點程式類型。

對話方塊類型 勾點程式
Color CCHookProc
尋找取代 FRHookProc
字型 CFHookProc
開啟另存 新檔 (Explorer 樣式) OFNHookProc
開啟另存 新檔 (舊樣式) OFNHookProcOldStyle
Print PrintHookProc
設定列印格式 PageSetupHook

針對 [ 頁面設定 ] 對話方塊,您也可以指定 PagePaintHook 攔截程式。 這是特殊的攔截程式,可用來自訂 [ 頁面設定 ] 對話方塊所顯示之範例頁面的外觀。

注意

[ 列印安裝 ] 對話方塊已被 [ 頁面設定 ] 對話方塊取代。 應用程式應該使用 [頁面設定 ] 對話方塊。 不過,為了相容性, PrintDlg 函式會繼續支援顯示 [ 列印安裝 ] 對話方塊。 您可以提供 [列印安裝] 對話方塊的SetupHookProc攔截程式。

常見的對話方塊訊息

常見的對話方塊會使用訊息,在發生特定事件時通知您的視窗程式或攔截程式。 此外,還有一些訊息可以傳送至通用對話方塊,以擷取資訊,或控制對話方塊的行為或外觀。 本節描述 RegisterWindowMessage 函式所註冊的一般對話方塊訊息、 [字型 ] 對話方塊和 [ 頁面設定 ] 對話方塊所使用的訊息,以及 Explorer 樣式 的 [開啟 ] 和 [ 另存 新檔] 對話方塊所使用的訊息。

通用對話方塊程式庫會定義一組訊息字串。 您可以將與其中一個訊息字串相關聯的常數傳遞至 RegisterWindowMessage ,以取得訊息識別碼。 然後,您可以使用識別碼來偵測及處理從通用對話方塊傳送的訊息,或將訊息傳送至一般對話方塊。 下表顯示訊息常數,並描述其用法。

Contants 用途
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

說明支援

常見的對話方塊會提供對話方塊標準控制項的內容相關說明。 若要提供常見對話方塊的其他說明,您可以顯示 [ 說明 ] 按鈕,並在使用者按一下按鈕時處理產生的訊息。 [ 說明 ] 按鈕是預設內容相關說明的補充。 [ 說明 ] 按鈕適用于描述對話方塊的一般用途,因為它適用于您的應用程式。

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通知訊息傳送至攔截程式。