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