UDF > WinAPIEx > Dialog >


_WinAPI_FindTextDlg

Crée une boîte de dialogue Rechercher/Remplacer, de type modale, définie par le système, pour rechercher/remplacer du texte dans un document

#include <WinAPIDlg.au3>
_WinAPI_FindTextDlg ( $hOwner [, $sFindWhat = '' [, $iFlags = 0 [, $pFindProc = 0 [, $lParam = 0]]]] )

Paramètres

$hOwner Le handle de la fenêtre qui est propriétaire de la boîte de dialogue. La procédure de fenêtre de la fenêtre spécifiée reçoit des messages FINDMSGSTRING de la boîte de dialogue. Ce paramètre doit être le handle d'une fenêtre valide, mais il ne doit pas être 0.
$sFindWhat [optionnel] La chaîne à rechercher qui s'affiche lors de l'initialisation de la boîte de dialogue.
$iFlags [optionnel] Un jeu de flag de bits qui permet d'initialiser la boîte de dialogue.
La boîte de dialogue définit ces flags quand elle envoie le message enregistré FINDMSGSTRING pour indiquer l'entrée de l'utilisateur.
Ce paramètre peut prendre une ou plusieurs des valeurs suivantes:
    $FR_DIALOGTERM - La boîte de dialogue se ferme. Après le traitement de ce message par la fenêtre propriétaire, le handle de la boîte de dialogue n'est plus valide.
    $FR_DOWN - Si ce flag est levé, le bouton Bas des boutons radio directionnels est coché pour indiquer que l'utilisateur souhaite effectuer une recherche à partir de l'emplacement actuel jusqu'à la fin du document. Si FR_DOWN est baissé, le bouton Haut est coché pour indiquer que l'utilisateur souhaite rechercher au début du document.
    $FR_ENABLEHOOK - Active la fonction de hook spécifiée dans le membre Hook. Cet indicateur est utilisé uniquement pour initialiser la boîte de dialogue.
    $FR_ENABLETEMPLATE - Indique que les membres Instance et TemplateName spécifient un modèle de boîte de dialogue à utiliser à la place du modèle par défaut. Cet indicateur est utilisé uniquement pour initialiser la boîte de dialogue.
    $FR_ENABLETEMPLATEHANDLE - Indique que le membre Instance identifie un bloc de données contenant un modèle de boîte de dialogue préchargé. Le système ignore le membre TemplateName si cet indicateur est spécifié.
    $FR_FINDNEXT - L'utilisateur a cliqué sur le bouton Suivant dans la boîte de dialogue Rechercher ou Remplacer.
    $FR_HIDEUPDOWN - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher, masque les boutons radio de la direction de recherche.
    $FR_HIDEMATCHCASE - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à la casseSi ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à la casse.
    $FR_HIDEWHOLEWORD - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, masque la case à cocher relative à Mot entier.
    $FR_MATCHCASE - Si ce flag est levé, la case à cocher 'Respecter la casse' est cochée, indiquant que l'utilisateur souhaite que la recherche soit sensible à la casse. Si FR_MATCHCASE est baissé, la case à cocher n'est pas cochée, la recherche est insensible à la casse.
    $FR_NOMATCHCASE - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, décoche la case relative à la casse
    $FR_NOUPDOWN - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher, désactve les boutons radio relatifs à la direction
    $FR_NOWHOLEWORD - Si ce flag est levé lors de l'initialisation d'une boîte de dialogue Rechercher ou Remplacer, décoche la case Mot entier
    $FR_REPLACE - L'utilisateur a cliqué sur le bouton Remplacer dans la boîte de dialogue Remplacer.
    $FR_REPLACEALL - L'utilisateur a cliqué sur le bouton Remplacer Tout dans la boîte de dialogue Remplacer.
    $FR_SHOWHELP - Force la boîte de dialogue à afficher le bouton Aide. Le membre Owner doit spécifier la fenêtre pour recevoir les messages enregistrés HELPMSGSTRING que la boîte de dialogue envoie lorsque l'utilisateur clique sur le bouton Aide.
    $FR_WHOLEWORD - Si ce flag est levé, la case 'Mot entier' est cochée, indiquant que l'utilisateur souhaite rechercher uniquement les mots entiers correspondant à la chaîne de recherche. Si FR_WHOLEWORD est baissé, la case n'est pas cochée. Vous devez également rechercher les fragments de mot correspondant à la chaîne de recherche.
$pFindProc [optionnel] Pointeur sur une procédure hook qui peut traiter les messages destinés à la boîte de dialogue.
Ce paramètre est ignoré si le flag $FR_ENABLEHOOK n'est pas défini.
(Voir MSDN pour plus d'informations)
$lParam [optionnel] Données définies par l'application que le système passe à la procédure hook.

Valeur de retour

Succès: Retourne le handle de la fenêtre de la boîte de dialogue.
Échec: Retourne 0 et définit @error <> 0, @extended contient le code d'erreur de la boîte de dialogue.

Remarques

La fonction _WinAPI_FindTextDlg() ne lance pas une opération de recherche. Au lieu de cela, la boîte de dialogue envoie les messages enregistrés FINDMSGSTRING à la procédure fenêtre de la fenêtre propriétaire de la boîte de dialogue.

Avant d'appeler _WinAPI_FindTextDlg(), vous devez appeler la fonction _WinAPI_RegisterWindowMessage() pour obtenir l'identifiant du message FINDMSGSTRING. La procédure de boîte de dialogue utilise cet identifiant pour envoyer des messages lorsque l'utilisateur clique sur le bouton "Suivant", ou quand la boîte de dialogue est fermée. Le paramètre "lParam" du message de FINDMSGSTRING contient un pointeur sur une structure $tagFINDREPLACE. Le membre "Flags" de cette structure indique l'événement qui a déclenché le message. D'autres membres de la structure indiquent l'entrée de l'utilisateur.

La fonction _WinAPI_FindTextDlg() utilise une mémoire tampon interne pour y placer la chaîne que l'utilisateur a tapée dans le contrôle d'édition "Rechercher". Vous pouvez augmenter la taille de cette mémoire tampon en utilisant la fonction _WinAPI_SetFRBuffer(). De plus, pour libérer la mémoire allouée pour la mémoire tampon interne, vous devez appeler _WinAPI_FlushFRBuffer() en réponse au message FINDMSGSTRING avec le flag $FR_DIALOGTERM activé.

En relation

_WinAPI_FlushFRBuffer, _WinAPI_RegisterWindowMessage, _WinAPI_SetFRBuffer

Voir aussi

Consultez FindText dans la librairie MSDN.

Exemple

#include <APIDlgConstants.au3>
#include <FontConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiRichEdit.au3>
#include <MsgBoxConstants.au3>
#include <SendMessage.au3>
#include <WinAPIDlg.au3>
#include <WinAPIGdi.au3>
#include <WinAPIMisc.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Local Const $e_sText = 'AutoIt v3 is a freeware BASIC-like scripting language designed for automating the Windows GUI and general scripting. It uses a combination of simulated keystrokes, mouse movement and window/control manipulation in order to automate tasks in a way not possible or reliable with other languages (e.g. VBScript and SendKeys). AutoIt is also very small, self-contained and will run on all versions of Windows out-of-the-box with no annoying "runtimes" required!'& @CRLF & @CRLF & _
        'AutoIt was initially designed for PC "roll out" situations to reliably automate and configure thousands of PCs. Over time it has become a powerful language that supports complex expressions, user functions, loops and everything else that veteran scripters would expect.'

; Crée une GUI
Local $hForm = GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 800, 600)

; Crée un menu principal
Local $idMenu = GUICtrlCreateMenu('&File')
Local $idExitItem = GUICtrlCreateMenuItem('E&xit...', $idMenu)
$idMenu = GUICtrlCreateMenu('&Edit')
Local $idFindItem = GUICtrlCreateMenuItem('&Find...', $idMenu)
Local $idReplaceItem = GUICtrlCreateMenuItem('R&eplace...', $idMenu)

; Crée un contrôle Rich Edit avec la sélection de texte toujours visible, et définit la police "Courier New" dans le contrôle
Local $hRichEdit = _GUICtrlRichEdit_Create($hForm, $e_sText, 0, 0, 800, 600, BitOR($ES_AUTOVSCROLL, $ES_NOHIDESEL, $ES_MULTILINE, $WS_VSCROLL), 0)
Local $hFont = _WinAPI_CreateFont(17, 0, 0, 0, $FW_NORMAL, 0, 0, 0, $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $ANTIALIASED_QUALITY, $DEFAULT_PITCH, 'Courier New')
_SendMessage($hRichEdit, $WM_SETFONT, $hFont, 1)
_SendMessage($hRichEdit, $EM_SETSEL)

; Inscrit le message FINDMSGSTRING pour recevoir les messages de la boîte de dialogue
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('commdlg_FindReplace'), 'WM_FINDMSGSTRING')

; Affiche la GUI
GUISetState(@SW_SHOW)

Global $g_hDlg
Local $iMsg = GUIGetMsg(), $sText

While $iMsg <> $GUI_EVENT_CLOSE And $iMsg <> $idExitItem
    Switch $iMsg
        Case $idFindItem, $idReplaceItem
            $sText = _GUICtrlRichEdit_GetSelText($hRichEdit)
            If @error Then
                $sText = ''
            EndIf
            ; Désactive les éléments de menu "Find..." et "Replace...", sinon, le script peut se  bloquer
            GUICtrlSetState($idFindItem, $GUI_DISABLE)
            GUICtrlSetState($idReplaceItem, $GUI_DISABLE)
            Switch $iMsg
                Case $idFindItem
                    $g_hDlg = _WinAPI_FindTextDlg($hForm, $sText, $FR_DOWN, 0, $hRichEdit)
                Case $idReplaceItem
                    $g_hDlg = _WinAPI_ReplaceTextDlg($hForm, $sText, '', 0, 0, $hRichEdit)
            EndSwitch
        Case $idReplaceItem
    EndSwitch
    $iMsg = GUIGetMsg()
WEnd

GUIDelete()

Func _IsMatchSelection($hWnd, $sText, $iBehavior)
    Local $aPos = _GUICtrlRichEdit_GetSel($hWnd)
    If @error Then Return 0

    $aPos = _GUICtrlRichEdit_FindTextInRange($hWnd, $sText, $aPos[0], $aPos[1], BitAND($iBehavior, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iBehavior, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iBehavior, BitOR($FR_MATCHALEFHAMZA, $FR_MATCHDIAC, $FR_MATCHKASHIDA)))
    If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then
        Return 0
    Else
        Return 1
    EndIf
EndFunc   ;==>_IsMatchSelection

Func WM_FINDMSGSTRING($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam

    Local $tFINDREPLACE = DllStructCreate($tagFINDREPLACE, $lParam)
    Local $sReplace = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'ReplaceWith'))
    Local $sFind = _WinAPI_GetString(DllStructGetData($tFINDREPLACE, 'FindWhat'))
    Local $hRichEdit = Ptr(DllStructGetData($tFINDREPLACE, 'lParam'))
    Local $iFlags = DllStructGetData($tFINDREPLACE, 'Flags')
    Local $aPos, $iCur = -1

    Select
        ; L'utilisateur a cliqué sur le bouton "Replace" dans une boîte de dialogue Replace
        Case BitAND($iFlags, $FR_REPLACE)
            If _IsMatchSelection($hRichEdit, $sFind, $iFlags) Then
                _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace)
            EndIf
            ContinueCase
            ; L'utilisateur a cliqué sur le bouton "Find Next" dans une boîte de dialogue Find ou Replace
        Case BitAND($iFlags, $FR_FINDNEXT)
            $aPos = _GUICtrlRichEdit_GetSel($hRichEdit)
            If @error Then Return

            If BitAND($iFlags, $FR_DOWN) Then
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[1], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD)
            Else
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], 0, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD, BitAND($iFlags, $FR_DOWN))
            EndIf
            If @error Or ($aPos[0] = -1) Or ($aPos[1] = -1) Then
                Local $iError = @error
                MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Ne peut pas trouver "'& $sFind & '" ('& $iError & ')', 0, $g_hDlg)
                Return
            EndIf
            ; Ici et ci-dessous est utilisé le message EM_SETSEL directement parce que  _GUICtrlRichEdit_SetSel() définit le focus dans le contrôle Rich Edit
            _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1])
            ; _GUICtrlRichEdit_ScrollToCaret ($HRichEdit)
            ; L'utilisateur a cliqué sur le bouton "Replace All" dans une boîte de dialogue Replace
        Case BitAND($iFlags, $FR_REPLACEALL)
            Dim $aPos[2] = [0, -1]
            While 1
                $aPos = _GUICtrlRichEdit_FindTextInRange($hRichEdit, $sFind, $aPos[0], -1, BitAND($iFlags, $FR_MATCHCASE) = $FR_MATCHCASE, BitAND($iFlags, $FR_WHOLEWORD) = $FR_WHOLEWORD)
                If ($aPos[0] = -1) Or ($aPos[1] = -1) Then
                    If $iCur = -1 Then
                        MsgBox(BitOR($MB_ICONINFORMATION, $MB_SYSTEMMODAL), WinGetTitle($g_hDlg), 'Cannot find "'& $sFind & '"', 0, $g_hDlg)
                        Return
                    EndIf
                    ExitLoop
                EndIf
                If $iCur = -1 Then
                    _GUICtrlRichEdit_PauseRedraw($hRichEdit)
                EndIf
                _SendMessage($hRichEdit, $EM_SETSEL, $aPos[0], $aPos[1])
                If _GUICtrlRichEdit_ReplaceText($hRichEdit, $sReplace) Then
                    $iCur = $aPos[0] + StringLen($sReplace)
                Else
                    ExitLoop
                EndIf
            WEnd
            _SendMessage($hRichEdit, $EM_SETSEL, $iCur, $iCur)
            ; _GUICtrlRichEdit_ScrollToCaret ($HRichEdit)
            _GUICtrlRichEdit_ResumeRedraw($hRichEdit)
            ; La boîte de dialogue se referme
        Case BitAND($iFlags, $FR_DIALOGTERM)
            ; Détruit le tampon interne, et libère la mémoire allouée
            _WinAPI_FlushFRBuffer()
            ; Active les éléments de menu "Find..." et "Replace..."
            GUICtrlSetState($idReplaceItem, $GUI_ENABLE)
            GUICtrlSetState($idFindItem, $GUI_ENABLE)
    EndSelect
EndFunc   ;==>WM_FINDMSGSTRING