共用方式為


尋找和取代對話方塊

顯示無強制回應對話方塊,讓使用者指定要搜尋的字串,以及在檔中搜尋文字時要使用的選項。 [ 取代 ] 對話方塊可讓使用者指定要搜尋的字串和取代字串,以及控制作業的選項。

您可以藉由初始化FINDREPLACE結構,並將結構傳遞至FindText函式,來建立並顯示 [尋找] 對話方塊。 下圖顯示一般的 [尋找] 對話方塊。

尋找對話方塊

您可以藉由初始化FINDREPLACE結構,並將結構傳遞至ReplaceText函式,來建立並顯示[取代] 對話方塊。 下圖顯示一般 [取代 ] 對話方塊。

取代對話方塊

不同于其他常見的對話方塊, [尋找取代 ] 對話方塊是無模式的。 無強制回應對話方塊可讓使用者在對話方塊與建立對話方塊的視窗之間切換。 這適用于讓使用者搜尋字串、切換至應用程式視窗以處理字串,以及切換回對話方塊以搜尋另一個字串,而不重複開啟對話方塊所需的命令。

如果 FindTextReplaceText 函式成功建立對話方塊,則會傳回對話方塊的控制碼。 您可以使用這個控制碼來移動和與對話方塊通訊。 如果函式無法建立對話方塊,則會傳回 Null。 您可以呼叫 CommDlgExtendedError 函式來擷取擴充的錯誤值,以判斷錯誤的原因。

本節討論下列主題。

FINDMSGSTRING 已註冊的訊息

建立 [尋找取代 ] 對話方塊之前,您必須呼叫 RegisterWindowMessage 函式,以取得 FINDMSGSTRING 已註冊訊息的訊息識別碼。 然後,您可以使用識別碼來偵測及處理從對話方塊傳送的訊息。 當使用者按一下對話方塊中的 [尋找下一步]、[ 取代] 或 [ 全部取代 ] 按鈕時,對話方塊程式會將 FINDMSGSTRING 訊息傳送至擁有者視窗的視窗程式。 當您建立對話方塊時,FINDREPLACE結構的hwndOwner成員會識別擁有者視窗。

FINDMSGSTRING訊息的lParam參數是您在建立對話方塊時所指定的FINDREPLACE結構的指標。 傳送訊息之前,對話方塊會使用最新的使用者輸入來設定此結構的成員,包括要搜尋的字串、如果有任何) ,則取代字串 (,以及尋找和取代作業的選項。

FINDMSGSTRING訊息中,FINDREPLACE結構的Flags成員包含下列其中一個旗標,以指出造成訊息的事件。

旗標 意義
FR_DIALOGTERM 對話方塊正在關閉。 在擁有者視窗處理此訊息之後,對話方塊的控制碼就不再有效。
FR_FINDNEXT 使用者按一下 [尋找] 或 [取代] 對話方塊中的 [尋找下一步] 按鈕。 lpstrFindWhat成員指定要搜尋的字串。
FR_REPLACE 使用者按一下 [ 取代 ] 對話方塊中的 [ 取代 ] 按鈕。 lpstrFindWhat成員指定要取代的字串,而lpstrReplaceWith成員會指定取代字串。
FR_REPLACEALL 使用者按一下 [ 取代] 對話方塊中的 [全部 取代 ] 按鈕。 lpstrFindWhat成員指定要取代的字串,而lpstrReplaceWith成員會指定取代字串。

 

針對 [尋找下一個] 或 [ 全部取代] 訊息, Flags 成員可以包含下列旗標的任何組合,以指出搜尋選項。

旗標 意義
FR_DOWN 如果設定,則會選取方向選項按鈕的 [向下 ] 按鈕,表示使用者想要從目前位置搜尋到檔結尾。 如果未設定 FR_DOWN ,則會選取 [ 上一個] 按鈕,讓使用者想要搜尋檔的開頭。
FR_MATCHCASE 如果設定,則會選取 [ 比對大小 寫] 核取方塊,表示使用者希望搜尋區分大小寫。 如果未設定 FR_MATCHCASE ,則會取消選取核取方塊,讓搜尋不區分大小寫。
FR_WHOLEWORD 如果設定,則會選取 [僅比對整個Word] 核取方塊,表示使用者只想要搜尋符合搜尋字串的整字。 如果未設定 FR_WHOLEWORD ,則會取消選取核取方塊,因此您也應該搜尋符合搜尋字串的欄位。

 

自訂 [尋找或取代] 對話方塊

若要自訂 [尋找 ] 或 [ 取代 ] 對話方塊,您可以使用下列任何方法:

  • 當您建立對話方塊時,請在 FINDREPLACE 結構中指定值
  • 提供自訂範本
  • 提供攔截程式

當您建立[尋找取代] 對話方塊時,可以在FINDREPLACE結構的Flags成員中設定旗標,以隱藏或停用任何搜尋選項控制項。 例如,您可以設定FR_NOMATCHCASE旗標來停用 [比對大小 寫] 核取方塊,或設定FR_HIDEMATCHCASE旗標來隱藏它。

例如,如果您想要包含應用程式唯一的其他控制項,您可以提供 [ 尋找 ] 或 [ 取代 ] 對話方塊的自訂範本。 FindTextReplaceText函式會使用您的自訂範本取代預設範本。

提供 [尋找] 或 [取代] 對話方塊的自訂範本

  1. 修改 Findtext.dlg 檔案中指定的預設範本,以建立自訂範本。 預設 [尋找 ] 或 [ 取代] 對話方塊範本中使用的控制項識別碼定義于 Dlgs.h 檔案中。
  2. 使用 FINDREPLACE 結構來啟用範本,如下所示:
      • 如果您的自訂範本是應用程式或動態連結程式庫中的資源,請在 Flags 成員中設定FR_ENABLETEMPLATE旗標。 使用 結構的 hInstancelpTemplateName 成員來識別模組和資源名稱。

        -或-

      • 如果您的自訂範本已在記憶體中,請設定 FR_ENABLETEMPLATEHANDLE 旗標。 使用 hInstance 成員來識別包含範本的記憶體物件。

您可以為[尋找] 或 [取代] 對話方塊提供FRHookProc攔截程式。 攔截程式可以處理傳送至對話方塊的訊息。 如果您使用自訂範本來定義其他控制項,則必須提供勾點程式來處理控制項的輸入。

啟用 [尋找] 或 [取代] 對話方塊的勾點程式

  1. FINDREPLACE結構的Flags成員中設定FR_ENABLEHOOK旗標。
  2. lpfnHook 成員中指定攔截程式的位址。

處理其 WM_INITDIALOG 訊息之後,對話方塊程式會將 WM_INITDIALOG 訊息傳送至攔截程式。 此訊息的 lParam 參數是用來初始化對話方塊之 FINDREPLACE 結構的指標。

如果攔截程式傳回 FALSE 以回應 WM_INITDIALOG 訊息,除非攔截程式顯示對話方塊,否則不會顯示對話方塊。 若要這樣做,請先執行任何其他繪製作業,然後呼叫 ShowWindowUpdateWindow 函式。 下列程式碼提供一個範例:

// We've returned FALSE in response to WM_INITDIALOG. 
// We've performed any other paint operations. 
// Now we display the dialog box. 
ShowWindow(hDlg, SW_SHOWNORMAL); 
UpdateWindow(hDlg);