Что нового

Вставка текста с LF без CR в поле Edit

GegeMON

Новичок
Сообщения
4
Репутация
0
Есть ли костыли, позволяющие вставленный текст в GUICtrlCreateEdit без CR (только с LF) переводить в CRLF на лету, дабы он не отображался в одну строку после вставки ?

Этот же текст в дальнейшем планируется в одной заготовке обрабатывать построчно (список ссылок), а в другом писать в файл (текст) в исходном виде. Хочется и корректного отображения в поле Edit и нормальной последующей обработки >_< Пока выходит что-то одно.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Можете попробовать установить расширенные стили для Edit.

EM_SETEXTENDEDSTYLE message Минимальная версия клиента - Windows 10, 1809
Edit Control Extended Styles

Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <GUIConstants.au3>
Opt("TrayAutoPause", 0)

;~ Минимальная версия клиента - Windows 10, 1809
Global Const $EM_SETEXTENDEDSTYLE = $ECM_FIRST + 10
Global Const $ES_EX_CONVERT_EOL_ON_PASTE = 0x0004

example()

Func example()
    ClipPut('Line 1' & @LF & 'Line 2' & @LF & 'Line 3' & @LF & 'Line 4' & @LF & '...')

    Local $hGui = GUICreate(@ScriptName, 400, 400)
    Local $idEdit = GUICtrlCreateEdit('', 0, 0, 400, 350, -1, 0)
    GUICtrlSendMsg(-1, $EM_SETEXTENDEDSTYLE, 0, $ES_EX_CONVERT_EOL_ON_PASTE)

    Local $idButton_Read = GUICtrlCreateButton('GUICtrlRead', 10, 360, 380, 30)
    GUISetState()

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idButton_Read
                MsgBox(0, Default, StringReplace(StringReplace(GUICtrlRead($idEdit), @CR, '{CR}'), @LF, '{LF}'), 0, $hGui)
        EndSwitch
    WEnd
EndFunc   ;==>example
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
А на 7-ке и XP вариантов нет ? По крайней мере на XP предложенный вариант точно не прокатил.
Обработайте WM_PASTE в подклассе.

Код:
;~ AutoIt Version: 3.3.14.5
;~ Author:         Tempo
#include <GUIConstants.au3>
#include <GuiEdit.au3>
#include <WinAPIShellEx.au3>

example()

Func example()
    ClipPut('Line 1' & @LF & 'Line 2' & @LF & 'Line 3' & @LF & 'Line 4' & @LF & '...')

    Local $hGui = GUICreate(@ScriptName, 400, 400)
    Local $idEdit = GUICtrlCreateEdit('', 0, 0, 400, 350, -1, 0)
    editEnableAddCR(-1)
    Local $idButton_Read = GUICtrlCreateButton('GUICtrlRead', 10, 360, 380, 30)
    GUISetState()

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idButton_Read
                MsgBox(0, Default, StringReplace(StringReplace(GUICtrlRead($idEdit), @CR, '{CR}'), @LF, '{LF}'), 0, $hGui)
        EndSwitch
    WEnd
EndFunc   ;==>example

Func editEnableAddCR($hEdit, $bEnable = True)
    Local Static $s_pEditProc = DllCallbackGetPtr(DllCallbackRegister(editSubclassProc, 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr'))
    Return ($bEnable ? _WinAPI_SetWindowSubclass : _WinAPI_RemoveWindowSubclass)(IsHWnd($hEdit) ? $hEdit : GUICtrlGetHandle($hEdit), $s_pEditProc, 5000)
EndFunc   ;==>editEnableAddCR

Func editSubclassProc($hWnd, $iMsg, $wParam, $lParam, $iSubclass, $pData)
    #forceref $iSubclass, $pData
    If $iMsg = $WM_PASTE Then
        _GUICtrlEdit_AppendText($hWnd, StringAddCR(ClipGet()))
        Return
    EndIf
    Return DllCall('comctl32.dll', 'lresult', 'DefSubclassProc', 'hwnd', $hWnd, 'uint', $iMsg, 'wparam', $wParam, 'lparam', $lParam)[0]
EndFunc   ;==>editSubclassProc
 
Последнее редактирование:
Автор
G

GegeMON

Новичок
Сообщения
4
Репутация
0
Tempo, спасибо. Второй вариант то, что нужно. Увы, но чтобы написать подобное, у меня скилл пока маловат, поэтому я пока могу только использовать чужой код, анализируя и дополняя его своим, так что не пинайте сильно за моё не знание тех или иных нюансов >_<

Основная часть кода более-менее понятна. За что отвечают функции editEnableAddCR и editSubclassProc пока не въехал :(
 
Верх