Что нового

imWindow UDF - альтернатива GUI*

firex

AutoIT Гуру
Сообщения
943
Репутация
208
AutoIt: 3.3.12.0+
Версия: 0.1

Категория: Вспомогательные функции, Окна

Описание: Эта библиотека реализует возможность создания окон и контролов на своих обработчиках. Не все возможности вынесены в публичные функции / задокументированы.

Список функций:
Код:
; #CURRENT# 
;_imWnd_Init
;_imWnd_Create
;_imWnd_MsgBox ( _NotifyBox alternative )
;_imWnd_Destroy
;_imWnd_SetState
;_imWnd_AddMsg
;_imWnd_FreeMsg
;_imWnd_DefProc
;
; << Control
;_imCtrlEdit_Create
;_imCtrlButton_Create
;_imCtrlLabel_Create
;_imCtrlListbox_Create
;_imCtrlPic_Create
;_imCtrl_CreateEx
;_imCtrl_Destroy
;_imCtrl_FindMe
;
; << Control macroses
;_imCtrl_SetFont
;_imCtrl_SetText
;_imCtrl_SetBitmap
;_imCtrl_GetText
;_imEdit_Appbegin
;_imEdit_Append
;_imListBox_AddString
;_imListBox_BeginUpdate
;_imListBox_EndUpdate
;_imListBox_GetCurSel
;
; << Internal control macroses
;_imCtrl_SetColor

; #INTERNAL_USE_ONLY#
;__imWnd_Proc
;__imCtrl_Proc
;__imWnd_Hook
;__imWnd_DefParams

Пример:
Код:
#Include "imWindow.au3"

If _imWnd_Create( $Wnd, 300, 164 ) Then
	_imCtrlEdit_Create( $Wnd, 0x0000ff, 'Edit', 5, 5, 285, 85 )
	_imCtrlLabel_Create( $Wnd, 0x0000ff, 'Label', 110, 110, 160, 18, $SS_CENTER )
	_imCtrlButton_Create( $Wnd, 100, 'Button', 5, 100, 104, 36, 0x00034000 )
	; ---
	$Wnd[$im_fInit] = True
	_imWnd_SetState( $Wnd )
	While Sleep( 10 )
		Switch $Wnd[$im_iMsg]
			Case -3
				ExitLoop
			Case 100
				_imWnd_MsgBox( 64, '', 'Button', $Wnd[$im_hModule], $Wnd[$im_hWnd] )

			Case 0
				ContinueLoop
		EndSwitch
		_imWnd_FreeMsg( $Wnd )
	WEnd
EndIf
_imWnd_Destroy( $Wnd )

Снимок:
5924a46cf1.png

Файлы: imWindow.au3 imWindow.au3(зеркало)

Источник: autoit-script.ru
Автор(ы): Firex
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Пример не запускается
Код:
"D:\Scripts\imWindow.au3"(409,48) : warning: $tagCWPSTRUCT: possibly used before declaration.
		Local $tCWPS = DllStructCreate( $tagCWPSTRUCT,
		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
"D:\Scripts\imWindow.au3"(409,48) : error: $tagCWPSTRUCT: undeclared global variable.
		Local $tCWPS = DllStructCreate( $tagCWPSTRUCT,
		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI
Совсем забыл. Я ведь правил встроенные библиотеки:
Код:
; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name...........: $tagCWPSTRUCT
; Description ...: Defines the message parameters passed to a WH_CALLWNDPROC hook procedure
; Fields ........: lParam	- Additional information about the message
;                  wParam	- Additional information about the message
;                  iMsg		- The message
;                  hWnd     - A handle to the window to receive the message
; Author ........:
; Remarks .......:
; ===============================================================================================================================
Global Const $tagCWPSTRUCT = "lparam lParam;wparam wParam;uint iMsg;hwnd hWnd"


Исправил и перезалил UDF.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Просто интересно, какая была мотивация для написания альтернативного GUI движка? И еще любопытно, зачем здесь нужен хук?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
firex [?]
Win7 x86, AutoIt 3.3.12.0. При закрытии окна вашего примера (нажатие на "крестик") появляются подряд два окна с сообщением "Прекращена работа программы "AutoIt v3 Script". После чего в консоле SciTE видим ошибку
Код:
!>17:20:57 AutoIt3.exe ended.rc:-1073741819

возможность создания окон и контролов на своих обработчиках
Программирование - не моя профессия и данная фраза мне не очень понятна. Не могли бы вы рассказать о преимуществах "своих обработчиков" над... "другими"... "стандартными"... как они правильно называются?
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI [?]
Не могли бы вы рассказать о преимуществах "своих обработчиков" над... "другими"... "стандартными"... как они правильно называются?
Для рядового пользователя их не будет, что касается к примеру меня - удобство.

InnI [?]
Win7 x86, AutoIt 3.3.12.0. При закрытии окна вашего примера (нажатие на "крестик") появляются подряд два окна с сообщением "Прекращена работа программы "AutoIt v3 Script". После чего в консоле SciTE видим ошибку
Поищу проблему, если найду - исправлю.

Yashied [?]
зачем здесь нужен хук
http://autoit-script.ru/index.php?topic=17957
Таким образом я обхожу эту проблему ( могу обрабатывать необходимые сообщения ). Как выяснилось, в момент выполнения "Return DefWindowProc" все последующие Callback'и на этот обработчик AutoIt ставит в очередь, НО не вызывает при завершении текущего. В итоге получается странная цепочка ( причем на все зарегистрированные callback'и ) которая вызывается при получении нового.

какая была мотивация для написания альтернативного GUI движка?
Насколько помню - была необходимость в создании окна с динамическим классом, а там уже понеслись проблемы со встроенными библиотеками.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
firex
В теме [Элементы GUI] Контекстное меню элемента приведён пример замены стандартного меню Edit на собственное. Насколько я понимаю, там заменён стандартный обработчик на собственный. Можно ли сделать это же при помощи вашей UDF? И на сколько это будет проще? Или я всё неправильно понимаю? :-[
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
InnI
Вы все верно понимаете. Ваш вопрос даже касательно затрагивается в моей библиотеке в кач-ве примера:
6eb10a8922.png

Происходит перехват $WM_CONTEXTMENU для всех элементов "Edit". И тут вы можете поступить к примеру так:
1) Оставить fCatch = True ( не передавать это сообщение стандартному обработчику контрола Edit ) и вызвать функцию со своим меню ( но она не должна "блокировать" выполнение ).
2) Поступить аналогично первому варианту за исключением вызова функции, далее модифицировать __imCtrl_Proc и там уже отсеять это сообщение.

На мой взгляд менее правильным ( но более работоспособным ) будет первый вариант.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я в свое время экспериментировал с обработчиками для разных классов элементов GUI, и скажу одно, писать обработчик на AutoIt сродни мазохизму. Глюков и прочих удивительных моментов будет целый вагон. В качестве примера можно подменить стандартный обработчик для ListView на пустой, написанный на AutoIt, и сразу станет все понятно. Здесь пример с ListView, когда мне пришлось писать обработчик в виде DLL. Вот еще один пример, когда подмена обработчика ни к чему хорошему не приводит.

Если нужна безглючная работа скрипта, то советую писать обработчики как для элементов GUI, так и для самого окна, на компилируемых ЯП и оформлять в виде DLL.
 
Верх