Что нового

Вопрос по _GUICtrlRichEdit_Create

viktor2120

Новичок
Сообщения
4
Репутация
1
Подскажите пример, как сделать аналогичный скрипт с использованием _GUICtrlRichEdit_Create
интересует именно Drag & Drop в окно и робота с файлом после
Спасибо!

Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
; Create a GUI with various controls.
Local $hGUI = GUICreate("Example", 400, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP), $WS_EX_ACCEPTFILES)

$Edit1 = GUICtrlCreateEdit("", 0, 86, 400, 315)
GUICtrlSetState(-1, $GUI_DROPACCEPTED) 

; Display the GUI.
GUISetState(@SW_SHOW, $hGUI)

; Loop until the user exits.
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $GUI_EVENT_DROPPED
			GUICtrlSetData($Edit1, "")
			MsgBox(0, '', @GUI_DragFile)
	EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
По идее должно бы так сработать:

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#include <WinAPIEx.au3>

OnAutoItExitRegister('OnAutoItExit')

Global $aDropFileList

$hGUI = GUICreate("Example", 400, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP))

$hEdit = _GUICtrlRichEdit_Create($hGUI, '', 0, 86, 400, 315)

Global $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $pDll = DllCallbackGetPtr($hDll)
Global $hProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $pDll)

_WinAPI_DragAcceptFiles($hEdit, True)
$nDropDummy = GUICtrlCreateDummy()

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $nDropDummy
			_ArrayDisplay($aDropFileList)
	EndSwitch
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_DROPFILES
			$aDropFileList = _WinAPI_DragQueryFileEx($wParam)
			_WinAPI_DragFinish($wParam)
			GUICtrlSendToDummy($nDropDummy)
			Return 0
	EndSwitch
	
	Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc

Func OnAutoItExit()
	_WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $hProc)
	DllCallbackFree($hDll)
EndFunc


но почему то не работает :scratch:.
 
Автор
V

viktor2120

Новичок
Сообщения
4
Репутация
1
CreatoR сказал(а):
По идее должно бы так сработать:
Работает, но только если поставить _GUICtrlRichEdit_Create стиль $ES_READONLY, но тогда нельзя редактировать текст :(
------------------------------------------------------------------------------------------------------------------
Есть решение, если закоментировать строку в GuiRichEdit.au3
Код:
;__GCR_SetOLECallback($hRichEdit)


то всё работает :smile:
спасибо CreatoR за пример
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Вот такой трюк можно сделать:

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#include <WinAPIEx.au3>

OnAutoItExitRegister('OnAutoItExit')

Global $aDropFileList

$hGUI = GUICreate("Example", 400, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP))

$hEdit = _GUICtrlRichEdit_Create($hGUI, '', 0, 86, 400, 315)

Global $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $pDll = DllCallbackGetPtr($hDll)
Global $hProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $pDll)

_WinAPI_DragAcceptFiles($hEdit, True)
$nDropDummy = GUICtrlCreateDummy()

GUISetState(@SW_SHOW, $hGUI)

$bFlag = False

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $nDropDummy
            _ArrayDisplay($aDropFileList)
	EndSwitch
	
	If $bFlag And WinActive($hGUI) Then
		$bFlag = False
		_GUICtrlRichEdit_SetReadOnly($hEdit, False)
	ElseIf Not $bFlag And Not WinActive($hGUI) Then
		$bFlag = True
		_GUICtrlRichEdit_SetReadOnly($hEdit, True)
	EndIf
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_DROPFILES
            $aDropFileList = _WinAPI_DragQueryFileEx($wParam)
            _WinAPI_DragFinish($wParam)
            GUICtrlSendToDummy($nDropDummy)
            Return 0
    EndSwitch
    
    Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc

Func OnAutoItExit()
    _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $hProc)
    DllCallbackFree($hDll)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
viktor2120 [?]
Есть решение, если закоментировать строку в GuiRichEdit.au3
Лучше тогда эту строку:
Код:
DllStructSetData($pCall_RichCom, 1, DllCallbackGetPtr($__RichCom_Object_GetDragDropEffect), 12)

чтобы не влияло на остальные события.

По идее всё это дело должно работать через _GUICtrlRichEdit_SetEventMask, но мне тоже не удалось заставить это работать, либо не знаю как, либо в библиотеке где то ошибка.
 
Автор
V

viktor2120

Новичок
Сообщения
4
Репутация
1
Думаю такой вариант будет самым лучшим, ещё раз спасибо за подсказку

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#include <WinAPIEx.au3>

OnAutoItExitRegister('OnAutoItExit')

Global $aDropFileList

$hGUI = GUICreate("Example", 400, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP))

$hEdit = _GUICtrlRichEdit_Create($hGUI, '', 0, 86, 400, 315)

_GUICtrlRichEdit_SetEventMask($hEdit, $ENM_DROPFILES)

Global $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $pDll = DllCallbackGetPtr($hDll)
Global $hProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $pDll)

_WinAPI_DragAcceptFiles($hEdit, True)
$nDropDummy = GUICtrlCreateDummy()

GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
$bFlag = False

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $nDropDummy
			_ArrayDisplay($aDropFileList)
	EndSwitch

WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_DROPFILES
			$aDropFileList = _WinAPI_DragQueryFileEx($wParam)
			_WinAPI_DragFinish($wParam)
			GUICtrlSendToDummy($nDropDummy)
			$bFlag = True
			Return 0
	EndSwitch
	Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc   ;==>_WinProc


Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	ConsoleWrite("Edit content changed - " & _WinAPI_HiWord($wParam) & @CRLF)
	If $lParam = $hEdit And _WinAPI_HiWord($wParam) = 512 Not WinActive($hGUI) Then
		_GUICtrlRichEdit_SetReadOnly($hEdit, True)
	ElseIf $bFlag = True Then
		$bFlag = False
		_GUICtrlRichEdit_SetReadOnly($hEdit, False)
	EndIf
EndFunc   ;==>_WM_COMMAND



Func OnAutoItExit()
	_WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $hProc)
	DllCallbackFree($hDll)
EndFunc   ;==>OnAutoItExit
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
viktor2120 [?]
Думаю такой вариант будет самым лучшим
Не совсем, если окно деактивировать, то до перетаскивания в него файлов RichEdit будет ReadOnly.

Так будет правильнее:

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#include <WinAPIEx.au3>

OnAutoItExitRegister('OnAutoItExit')

Global $aDropFileList

$hGUI = GUICreate("Example", 400, 400, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_POPUP))

$hEdit = _GUICtrlRichEdit_Create($hGUI, '', 0, 86, 400, 315)

Global $hDll = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
Global $pDll = DllCallbackGetPtr($hDll)
Global $hProc = _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $pDll)

_WinAPI_DragAcceptFiles($hEdit, True)
$nDropDummy = GUICtrlCreateDummy()

GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $nDropDummy
            _ArrayDisplay($aDropFileList)
    EndSwitch
WEnd

Func _WinProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
        Case $WM_DROPFILES
            $aDropFileList = _WinAPI_DragQueryFileEx($wParam)
            _WinAPI_DragFinish($wParam)
            GUICtrlSendToDummy($nDropDummy)
            Return 0
	EndSwitch
	
    Return _WinAPI_CallWindowProc($hProc, $hWnd, $iMsg, $wParam, $lParam)
EndFunc


Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $lParam = $hEdit Then
		Switch _WinAPI_HiWord($wParam)
			Case 256
				_GUICtrlRichEdit_SetReadOnly($hEdit, False)
			Case 512
				_GUICtrlRichEdit_SetReadOnly($hEdit, True)
		EndSwitch
	EndIf
EndFunc

Func OnAutoItExit()
    _WinAPI_SetWindowLong($hEdit, $GWL_WNDPROC, $hProc)
    DllCallbackFree($hDll)
EndFunc
 
Верх