Что нового

Не работет получение номера строки в RichEdit

damien2008

Осваивающий
Сообщения
157
Репутация
30
Всем добрый вечер. Прошу помочь.
Столкнулся с такой проблемой:
С помощью функции
Код:
_GUICtrlRichEdit_GetLineNumberFromCharPos
пытаюсь получить номер строки в RichEdit.
При клике мышкой, выдает неправильный результат 0,1,2,2,2,2,2 каждый раз.
А при выборе стрелками ВВЕРХ/ВНИЗ вообще ничего не происходит.
Что делаю не так? подскажите...
код::
Код:
#cs ------------------------------------------------------------------------
    Версия AutoIt:  3.3.12.0
    Автор:          myName
    Описание:       Шаблон программы на языке AutoIt
#ce ------------------------------------------------------------------------

; Код программы

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiMenu.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <GUIRichEdit.au3>
#include <Misc.au3>

Global Const $VK_UP = 0x26
Global Const $VK_DOWN = 0x28

Global Enum $idOpen = 1000, $idSave, $idInfo

Global $hGUI = GUICreate("Test", 300, 200)

$Edit1 = _GUICtrlRichEdit_Create($hGUI, "", 10, 10, 280, 150, BitOR($WS_HSCROLL, $WS_VSCROLL, $ES_MULTILINE))

$hMenu = _GUICtrlMenu_CreatePopup()

_GUICtrlMenu_AddMenuItem($hMenu, "Open", $idOpen)
_GUICtrlMenu_AddMenuItem($hMenu, "Save", $idSave)
_GUICtrlMenu_AddMenuItem($hMenu, "Info", $idInfo)

GUISetState()

$wProcHandle = DllCallbackRegister("_WindowProc", "ptr", "hwnd;uint;wparam;lparam")

$wProcOld = _WinAPI_SetWindowLong($Edit1, $GWL_WNDPROC, DllCallbackGetPtr($wProcHandle))

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
	EndSwitch
WEnd


GUIDelete($hGUI)
DllCallbackFree($wProcHandle)


Func _WindowProc($hWnd, $Msg, $wParam, $lParam)
    Switch $hWnd
        Case $Edit1
            Switch $Msg
                Case $WM_RBUTTONUP
                    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd)
                    Return 0
				Case $WM_LBUTTONUP
					ConsoleWrite(_GUICtrlRichEdit_GetLineNumberFromCharPos($hWnd, 1) & @CRLF)
					;Return 0
				Case $VK_UP
					ConsoleWrite(_GUICtrlRichEdit_GetLineNumberFromCharPos($hWnd, 1) & @CRLF)
				Case $VK_DOWN
					ConsoleWrite(_GUICtrlRichEdit_GetLineNumberFromCharPos($hWnd, 1) & @CRLF)
                Case $WM_COMMAND
                    Switch $wParam
                        Case $idOpen
                            ConsoleWrite("-> Open" & @LF)
                        Case $idSave
                            ConsoleWrite("-> Save" & @LF)
                        Case $idInfo
                            ConsoleWrite("-> Info" & @LF)
                    EndSwitch
            EndSwitch
    EndSwitch

    Local $aRet = DllCall("user32.dll", "int", "CallWindowProc", "ptr", $wProcOld, _
            "hwnd", $hWnd, "uint", $Msg, "wparam", $wParam, "lparam", $lParam)

    Return $aRet[0]
EndFunc   ;==>_WindowProc
 

C2H5OH

AutoIT Гуру
Сообщения
1 473
Репутация
332
damien2008,
с Вашим то стажем...
Вы ж всё время проверяете строку первого символа!
Код:
ConsoleWrite(_GUICtrlRichEdit_GetLineNumberFromCharPos($hWnd, 1) & @CRLF)

Веренее позиции между первым и вторым символом.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
damien2008,
Попробуйте сделать примерно так.
Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hGui, $hRichEdit

$hGui = GUICreate(StringTrimRight(@ScriptName, 4), 420, 350, -1, -1)
$hRichEdit = _GUICtrlRichEdit_Create($hGui, 'Test line num 1', 10, 10, 400, 220, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
GUISetState()
For $i = 2 To 10
	_GUICtrlRichEdit_AppendText($hRichEdit, @CR & 'Test line num ' & $i)
Next
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
_GUICtrlRichEdit_SetEventMask($hRichEdit, $ENM_SELCHANGE)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_GUICtrlRichEdit_Destroy($hRichEdit)
			GUIDelete()
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iWparam, $iLparam)
	#forceref $iMsg, $iWparam
	Local $hWndFrom, $iCode, $tMsgFilter, $iCharPos
	$tMsgFilter = DllStructCreate($tagMSGFILTER, $iLparam)
	$hWndFrom = HWnd(DllStructGetData($tMsgFilter, 'hWndFrom'))
	$iCode = DllStructGetData($tMsgFilter, 'Code')
	Switch $hWndFrom
		Case $hRichEdit
			Switch $iCode
				Case $EN_SELCHANGE
					$iCharPos = DllStructGetData($tMsgFilter, 'msg')
					ConsoleWrite('CharPos: ' & $iCharPos & ' Line: ' & _GUICtrlRichEdit_GetLineNumberFromCharPos($hRichEdit, $iCharPos) & @LF)
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY
 

C2H5OH

AutoIT Гуру
Сообщения
1 473
Репутация
332
madmasles,
а
Код:
#forceref

это что?
:-[
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
C2H5OH [?]
Если мне память не изменяет, то это означает, что параметры, перечисленные после #forceref не используются в функции.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
madmasles [?]
Если мне память не изменяет, то это означает, что параметры, перечисленные после #forceref не используются в функции.
не совсем. это директива au3check'a чтобы он не выдавал предупреждение о неиспользуемой переменной.
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
157
Репутация
30
madmasles
спасибо, разобрался.
не подскажите, где есть руководство об этих: $tagMSGFILTER, $tMsgFilter.
и где можно прочитать, что в таких случаях нужно использовать структуру?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
damien2008 [?]
где есть руководство об этих: $tagMSGFILTER
Я смотрел в справке пример к функции _GUICtrlRichEdit_SetEventMask(), а потом описание структур в GuiRichEdit.au3. Так как английский я знаю очень плохо, то понял не больше 5 - 10%, так что пришлось мне изменять этот пример и смотреть, что эти структуры возвращают в разных ситуациях. ;D
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
157
Репутация
30
madmasles
понятно :smile:
 
Верх