- Версия AutoIt
- 3.3.16.0
- Версия
- 1.0
В скрипт потребовалось добавить график и изучая возможности GUICtrlCreateGraphic удивился что не поддерживается такая простая функция как вывод текста. Кроме этого имеются ограничения на порядок рисования графических объектов.
Из-за этого стал рассматривать другие варианты и успешным оказался перенос всего что касается графики в dll, которой скрипт предоставляет данные для рисования.
dll писал на PureBasic по нескольким причинам. В нем две графические библиотеки - 2DDrawing (GDI) и VectorDrawing (GDI+). Можно использовать любую или обе сразу.
Вывести картинку в окно позволяет ImageGadget (аналог GUICtrlCreatePic, но в параметре принимает hBITMAP а не путь к файлу ) и CanvasGadget.
В архиве несколько примеров того как в окне скрипта разместить гаждеты из dll.
Если в двух словах, в dll нужно передать дескриптор окна
В dll с дескриптором следует вызвать функцию UseGadgetList() чтобы гаждеты размещались в окне скрипта.
Функция BindGadgetEvent() похожа на GUICtrlSetOnEvent() в том плане что позвоялет назначить функцию обработки событий для гаждета.
С GDIPlus.au3 было больше вопросов чем ответов.Функция GUICtrlSetGraphic
Из-за конструктивных ограничений первыми нужно создать фигуры RECT (прямоугольник), ELLIPSE (эллипс) и PIE (сегмент). Например, LINE (линия) всегда рисуется поверх RECT (прямоугольника). Если важен порядок отображения фигур, тогда рекомендуется создать несколько элементов graphic, вместо одного элемента содержащего все фигуры.
Из-за этого стал рассматривать другие варианты и успешным оказался перенос всего что касается графики в dll, которой скрипт предоставляет данные для рисования.
dll писал на PureBasic по нескольким причинам. В нем две графические библиотеки - 2DDrawing (GDI) и VectorDrawing (GDI+). Можно использовать любую или обе сразу.
Вывести картинку в окно позволяет ImageGadget (аналог GUICtrlCreatePic, но в параметре принимает hBITMAP а не путь к файлу ) и CanvasGadget.
В архиве несколько примеров того как в окне скрипта разместить гаждеты из dll.
Если в двух словах, в dll нужно передать дескриптор окна
Код:
$hGUI = GUICreate("", 500, 500, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_CLIPCHILDREN))
$Gadget1 = DllCall($gui_dll, "HWND", "Canvas", "HWND", $hGUI, "int", 10, "int", 10, "int", 480, "int", 220)
$Gadget1 = $Gadget1[0]
В dll с дескриптором следует вызвать функцию UseGadgetList() чтобы гаждеты размещались в окне скрипта.
Код:
ProcedureDLL Canvas(hWnd, x.l, y.l, w.l, h.l)
Protected Canvas
UseGadgetList(hWnd) ; Окно в котором необходимо разместить гаджет.
Canvas = CanvasGadget(#PB_Any, x, y, w, h, #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)
BindGadgetEvent(Canvas, @CanvasEvent())
ProcedureReturn Canvas
EndProcedure
- Автор
- Prog