Что нового

[Элементы GUI] Автоматическое изменение размера элемента RichEdit

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Как обеспечить Автоматическое изменение размера элемента RichEdit
при изменении размера окна GUI ?
 

madmasles

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

Global $hGui, $hRichEdit, $iMsg, $iW = 320, $iH = 420

$hGui = GUICreate("Example (" & StringTrimRight(@ScriptName, 4) & ")", $iW, $iH, -1, -1, $WS_SIZEBOX + $WS_SYSMENU)
$hRichEdit = _GUICtrlRichEdit_Create($hGui, "This is a test.", 10, 10, $iW - 20, $iH - 100, _
		BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_AppendText($hRichEdit, @CR & "This is more text")

GUIRegisterMsg($WM_SIZE, "WM_SIZE")
GUISetState()

While True
	$iMsg = GUIGetMsg()
	Select
		Case $iMsg = $GUI_EVENT_CLOSE
			GUIDelete()
			Exit
	EndSelect
WEnd

Func WM_SIZE()
	Local $iWinClientSize = WinGetClientSize($hGui)
	Local $iWinPos = WinGetPos($hGui)
	Local $i_W = $iWinClientSize[0] - 20
	Local $i_H = $iWinClientSize[1] - 100 + ($iWinPos[3] - $iWinClientSize[1])
	WinMove($hRichEdit, '', 10, 10, $i_W, $i_H)
EndFunc   ;==>WM_SIZE
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles,
Спасибо.
Т.е надо обращаться с ним , как с посторонним (не GUI) окном .
Можно использовать и :
Код:
ControlMove

А я рассчитывал, что в его библиотеке есть ф-ия , которая обеспечивает Resize
и дает возможность устанавливать необходимые параметры Resize. :beer:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz
Если поменять
Код:
;...
WinMove($hRichEdit, '', 10, 10, $i_W, $i_H)
;...
;на
;...
ControlMove($hGui, '', $hRichEdit, 10, 10, $i_W, $i_H)
;...
То тоже работает.:smile:
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
OffTopic:
Да я это и говорю ,еще раз спасибо
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
gregaz
Я использовал WinMove(), т.к. не знал, что ControlMove() работает и с Handle контрола (в справке об этом не понятно). Я сначала хотел определить ID через _WinAPI_GetDlgCtrlID(), но решил, что с WinMove() меньше движений. Теперь буду знать. :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
gregaz сказал(а):
А я рассчитывал, что в его библиотеке есть ф-ия , которая обеспечивает Resize и дает возможность устанавливать необходимые параметры Resize.

Автоматическое изменение размеров можно сделать только для нативных AutoIt GUI-элементов (GUICtrlCreate...) с помощью функции GUICtrlSetResizing(), RichEdit к ним не относится. Только так, как показал madmasles.

madmasles, хорошо, что вы предоставляете полностью готовые к запуску примеры. Очень радует. Да, и хороший пример.

P.S

Только заголовок функции-обработчика должен быть следующим:

Код:
Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)


Параметр $lParam уже содержит размеры клиентской области окна.

http://msdn.microsoft.com/en-us/library/ms632646(VS.85).aspx
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
А нет более изящного способа получить из $lParam low-order word, high-order word, а то у меня как-то коряво, хотя работает:
Код:
;...
Local $iWinClientSize_W = Dec(StringRight($lParam, 4))
Local $iWinClientSize_H = Dec(StringMid($lParam, 3, 4))
;...
Подозреваю, что можно как-то через структуру, но это для меня темный лес.
вы предоставляете полностью готовые к запуску примеры
Дело в том, что обычно я не уверен, что мой ответ правильный (работает), пока его не проверю, Поэтому проверяю свои теоретические догадки на практике. А потому и выкладываю уже готовый к запуску код.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
нет более изящного способа получить из $lParam low-order word, high-order word
Для этого есть _WinAPI_LoWord/_WinAPI_HiWord.

Low:
Код:
BitAND($lParam, 0xFFFF)


High:
Код:
BitShift($lParam, 16)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied,
CreatoR,
С помощью Ваших подсказок у меня получилось следующее:
Код:
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hGui, $hRichEdit, $iMsg, $iW = 320, $iH = 420

$hGui = GUICreate('Example (' & StringTrimRight(@ScriptName, 4) & ')', $iW, $iH, -1, -1, _
		BitOR($WS_SIZEBOX, $WS_SYSMENU, $WS_CLIPCHILDREN))
$hRichEdit = _GUICtrlRichEdit_Create($hGui, 'This is a test.', 10, 10, $iW - 20, $iH - 100, _
		BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
_GUICtrlRichEdit_AppendText($hRichEdit, @CR & 'This is more text' & @CR & $hRichEdit)

GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

While True
	$iMsg = GUIGetMsg()
	Select
		Case $iMsg = $GUI_EVENT_CLOSE
			GUIDelete()
			Exit
	EndSelect
WEnd

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hGui
			Local $iWinPos = WinGetPos($hGui)
			Local $iWinClientSize_W = BitAND($lParam, 0xFFFF)
			Local $iWinClientSize_H = BitShift($lParam, 16)
			Local $i_W = $iWinClientSize_W - 20
			Local $i_H = $iWinClientSize_H - 100 + ($iWinPos[3] - $iWinClientSize_H)
			;WinMove($hRichEdit, '', 10, 10, $i_W, $i_H)
			ControlMove($hGui, '', $hRichEdit, 10, 10, $i_W, $i_H)
	EndSwitch
Поправьте, пожалуйста, если есть ошибки.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Никто не хочет объекты использовать :'(
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
$oRP = ObjCreate('RICHTEXT.RichtextCtrl.1')
$hGUI = GUICreate('richtext object', 480, 640, -1, -1, BitOR($WS_OVERLAPPEDWINDOW, $WS_SIZEBOX))
$GUIActiveX = GUICtrlCreateObj($oRP, 5, 5, 470, 630)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
$oRP.Text = 'some text'

GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = -3
			Exit
	EndSelect
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Redline
Наверное, Ваш вариант самый оптимальный.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Redline
Что-то у меня объект не создается.
и выдается ошибка :
Код:
H:\AUTOIT WINOWS_7\MY REG EXP TESTER\Test.au3 (7) : ==> Variable must be of type "Object".:
$oRP.Text = 'some text'
$oRP^ ERROR

Вообще-то у меня система сбоить начала. может поэтому ?
Это рабочий вариант ?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
У меня на Windows XP SP3 отлично работает.

Проверьте кто-нибудь у кого 7-ка. (Кажется у Yashied -7 ?)
Если работает ,значит мне надо переустанавливать систему.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
gregaz [?]
Проверьте кто-нибудь у кого 7-ка. (Кажется у Yashied -7 ?)
Если работает ,значит мне надо переустанавливать систему.

Не надо переустанавливать, пускай работает.
Такая же ошибка.

Код:
$oRP = ObjCreate('RICHTEXT.RichtextCtrl.1')
MsgBox(0, '', @OSVersion & @CRLF & @OSType & @CRLF & @error)

---------------------------

---------------------------
WIN_7

WIN32_NT

-2147221005
---------------------------
OK
---------------------------
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
dwerf
OffTopic:
Спасибо , несколько обрадовал.
Это бы переполнило мое терпение.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Наверное, Ваш вариант самый оптимальный.

Самый правильный вариант и так, как говорит MSDN - WM_SIZE.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
у меня получилось следующее
В этом примере нехватает $WS_CLIPCHILDREN у Gui, иначе при изменений размера элемент Richedit “маргает”.
 
Верх