Что нового

[Элементы GUI] скрыть каретку ввода в richedit

damien2008

Осваивающий
Сообщения
178
Репутация
34
всем привет, прошу помощи) не нашел на форуме, поэтому создаю тему.
собственно сабж:
не получается скрыть каретку ввода в richedit
окно создается, каретки нету. если нажать в поле richedit, то появляется. если 2 раза кликнуть, выделяется текст, а потом еще раз, то каретка пропадает. посмотрел "RichEditConstants.au3", кроме $ENM_MOUSEEVENTS ничего подходящего не нашел, подозреваю что при "$ENM_KEYEVENTS" каретка будет появляться. помогите)

пробую так (quick and dirty):
Код:
#cs ------------------------------------------------------------------------
    Версия AutoIt:  3.3.14.2
    Автор:          myName
    Описание:       Шаблон программы на языке AutoIt
#ce ------------------------------------------------------------------------

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

#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIRes.au3>

Global $hRichEdit
Global $hGui

Main()

Func Main()
    Local $iCp1, $lblMsg
    $hGui = GUICreate(StringTrimRight(@ScriptName, 4), 420, 350, -1, -1)
    $hRichEdit = _GUICtrlRichEdit_Create($hGui, 'Это тест.', 10, 10, 400, 220, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY))
    $lblMsg = GUICtrlCreateLabel("", 10, 235, 300, 60)

    _GUICtrlRichEdit_AutoDetectURL($hRichEdit, True)
    _GUICtrlRichEdit_AppendText($hRichEdit, @CR & "http://www.autoitscript.com")

	GUISetState()

	_WinAPI_HideCaret($hGui)
	_WinAPI_HideCaret($hRichEdit)
	_WinAPI_DestroyCaret()

	GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                _GUICtrlRichEdit_Destroy($hRichEdit)
                GUIDelete()
                Exit
        EndSwitch
    WEnd
EndFunc   ;==>Main


Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)

_WinAPI_HideCaret($hGui)
_WinAPI_HideCaret($hRichEdit)
_WinAPI_DestroyCaret()

    Switch $lParam
        Case GUICtrlGetHandle($hRichEdit)
            Switch $nNotifyCode
                Case $ENM_MOUSEEVENTS
					_WinAPI_HideCaret($hGui)
					_WinAPI_HideCaret($hRichEdit)
					_WinAPI_DestroyCaret()
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFUnc

P.S.
попробовал добавить:
Код:
While 1

	_WinAPI_HideCaret($hGui)
	_WinAPI_HideCaret($hRichEdit)
	_WinAPI_DestroyCaret()


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

все-равно небольшое мерцание появляется(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Пример для _WinAPI_CreateCaret() из справки не подходит? Сообщения для Input, Edit и RichEdit почти не различаются.
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
Yashied

пробовал. вот на примере из справки (input закоментирован),
так для него работает, а для richedit совсем нет.
Код:
#cs ------------------------------------------------------------------------
    Версия AutoIt:  3.3.14.2
    Автор:          myName
    Описание:       Шаблон программы на языке AutoIt
#ce ------------------------------------------------------------------------

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

#include <GuiRichEdit.au3>
#Include <APIConstants.au3>
#Include <EditConstants.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $Msg, $Input, $Button, $Duration = Default, $hBitmap = _WinAPI_CreateSolidBitmap(0, 0x00AEFF, 10, 14)

OnAutoItExitRegister('OnAutoItExit')

$hForm = GUICreate('MyGUI', 400, 400)

;~ $Input = GUICtrlCreateInput('', 20, 20, 360, 20)

$Input = _GUICtrlRichEdit_Create($hForm, 'Это тест.', 10, 10, 400, 220, _
            BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL, $ES_READONLY))
_GUICtrlRichEdit_AutoDetectURL($Input, True)
_GUICtrlRichEdit_AppendText($Input, @CR & "http://www.autoitscript.com")

$Button = GUICtrlCreateButton('Exit', 165, 240, 70, 23)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

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

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            Switch _WinAPI_LoWord($wParam)
                Case $Input
                    Switch _WinAPI_HiWord($wParam)
                        Case $EN_KILLFOCUS
                            _WinAPI_HideCaret($lParam)
                            _WinAPI_DestroyCaret()
                            _WinAPI_SetCaretBlinkTime($Duration)
                            $Duration = Default
                        Case $EN_SETFOCUS
                            $Duration = _WinAPI_SetCaretBlinkTime(-1)
							_WinAPI_HideCaret($lParam)
                            _WinAPI_DestroyCaret()
;~                             _WinAPI_CreateCaret($lParam, $hBitmap)
;~                             _WinAPI_ShowCaret($lParam)
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func OnAutoItExit()
    _WinAPI_DeleteObject($hBitmap)
    If Not IsKeyword($Duration) Then
        _WinAPI_SetCaretBlinkTime($Duration)
    EndIf
EndFunc   ;==>OnAutoItExit

P.S. наверно надо, чтобы функция удаления каретки вызывалась быстрее, чем в цикле While без паузы, и GUIRegisterMsg. ;)

ППС вот нашел, парни из CODEGURU.COM советуют регистрировать CALLBACK функцию, но я не силен.; а простая регистрация WM_SETCURSOR срабатывает с задержкой... е..
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Поиграйтесь с WM_SETCURSOR, это 100% поможет спрятать курсор. Пример есть в FAQ'е по ресурсам.
 
Верх