1 (2015-05-13 23:56:41 отредактировано swerg)

Тема: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Простой пример как нарисовать на форме графические элементы при помощи VCL.Shape:

https://quik2dde.ru/static-img/26/test-shape.gif

Для визуализации используется библиотека QVCLua, которую можно взять в отдельной теме.

Про просьбе участника форума добавлена возможность задавать угол поворота для фигур.
Новые свойства и методы для Shape:

  • Angle - задаёт угол поворота фигуры в градусах

  • RotateMinSize - если равно false, то фигура изменяется в размере так, чтобы занять аксимально доступную область, заданную размерами, если равно true - то фигура имеет постоянный размер такой, чтобы при любом угле поворота гарантированно умещаться в заданные её размеры

  • SendToBack() - переместить фигуру на задний план

  • BringToFront() - переместить фигуру на передний план

VCL = require "qvcl"

function OnFormClose(Sender, CloseAction)
  is_run = false
  mainForm:Release()
end

function OnTrackChange(Sender)
  graphRect.Angle = trackBar.Position
  graphElipse.Angle = trackBar.Position
  graphTriangle.Angle = trackBar.Position
  graphDiamond.Angle = trackBar.Position
  labelAngle.Caption = "Угол поворота: " .. tostring(trackBar.Position)
end

function OnChBoxChange(Sender)
  graphRect.RotateMinSize = chBox.Checked
  graphElipse.RotateMinSize = chBox.Checked
  graphTriangle.RotateMinSize = chBox.Checked
  graphDiamond.RotateMinSize = chBox.Checked
end

function SetRectFrom(elemTo, elemFrom)
  elemTo.top = elemFrom.top
  elemTo.left = elemFrom.left
  elemTo.height = elemFrom.height
  elemTo.width = elemFrom.width
  elemTo:SendToBack();
end


mainForm = VCL.Form("mainForm")
mainForm._ = { position="podesktopcenter", height=330, width=370, Caption="Shape test", OnClose = OnFormClose }

-- квадрат
graphRect = VCL.Shape(mainForm)
graphRect._ =
  {
     top=10, left=15, height=100, width=150,  -- положение и размеры
     Shape="stRectangle",                     -- тип: прямоугольник
     Pen={ Color=0x3333DD, Style="psDot" },   -- цвет рамки, тип линии "пунктир"
     Brush={ Color=0xDD99BB }                 -- цвет заливки
  }

-- элипс
graphElipse = VCL.Shape(mainForm)
graphElipse._ =
  {
     top=10, left=205, height=100, width=150,  -- положение и размеры
     Shape="stEllipse",                       -- тип: элипс
     Pen={ Color=0xDD9933 },                  -- цвет рамки, сплошная линия
     Brush={ Color=0x666666, Style="bsFDiagonal" }  -- цвет заливки диагональными линиями
  }

-- треугольник
graphTriangle = VCL.Shape(mainForm)
graphTriangle._ =
  {
     top=135, left=15, height=100, width=150,
     Shape="stTriangle",                      -- тип: треугольник
     Pen={ Color=0x00CC00, Width=5 },         -- зеленая рамка толщиной 5 писелей
     Brush={ Style="bsClear" }                -- без заливки
  }

-- ромб
graphDiamond = VCL.Shape(mainForm)
graphDiamond._ =
  {
     top=135, left=205, height=100, width=150,
     Shape="stDiamond",                        -- тип: ромб
     Pen={ Style="psClear" },                  -- без рамки
     Brush={ Color=0x00EEEE, Style="bsSolid" } -- сплошная заливка
  }

-- "рамки" вокруг элементов
frame1 = VCL.Shape(mainForm, {
     Shape="stRectangle", Pen={ Color=0xAAAAAA, Style="psDashDot" }, Brush={ Style="bsClear" }
 })
frame2 = VCL.Shape(mainForm, {
     Shape="stRectangle", Pen={ Color=0xAAAAAA, Style="psDashDot" }, Brush={ Style="bsClear" }
 })
frame3 = VCL.Shape(mainForm, {
     Shape="stRectangle", Pen={ Color=0xAAAAAA, Style="psDashDot" }, Brush={ Style="bsClear" }
 })
frame4 = VCL.Shape(mainForm, {
     Shape="stRectangle", Pen={ Color=0xAAAAAA, Style="psDashDot" }, Brush={ Style="bsClear" }
 })
SetRectFrom(frame1, graphRect)
SetRectFrom(frame2, graphElipse)
SetRectFrom(frame3, graphTriangle)
SetRectFrom(frame4, graphDiamond)

-- "двигунок" и отображение угла
labelAngle = VCL.Label(mainForm)
labelAngle._ =
 {
     top=250, left=15,
     Caption="0"
 }

trackBar = VCL.TrackBar(mainForm)
trackBar._ =
 {
     top=270, left=0, width=369,
     TickStyle="tsNone",
     OnChange = OnTrackChange,
     Min=0, Max=360
 }

chBox = VCL.CheckBox(mainForm)
chBox._ =
 {
     top=300, left=10, width=230, Caption="Постоянный размер",
     OnChange = OnChBoxChange
 }


mainForm:Show()

OnTrackChange()  -- вывести начальный угол с поясняющим текстом

is_run = true    
function main()
  while is_run do
    sleep(50)
  end
end

function OnStop()
 is_run = false
 mainForm:Free()
end

2

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

< reserved >

3 (2015-04-06 14:34:43 отредактировано GREEN_X5)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Подскажите пожалуйста как отправить квадрату из примера выше новый цвет заливки. Вот так по колхозному не получается )))

graphRect.Brush["Color"]=0x00EEEE

edit:
Ух ты, какие вопросы я задавал пол-года назад. )

graphRect.Brush.Color=RGB(0,255,0);

4

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

а где свечи? линии ? или stockchart lib?

5

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

ilk пишет:

а где свечи? линии ? или stockchart lib?

Они отсутствуют.
Но никто их и не обещал.

6

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

swerg пишет:
ilk пишет:

а где свечи? линии ? или stockchart lib?

Они отсутствуют.
Но никто их и не обещал.

так может и приделать?
http://plplot.sourceforge.net/examples.php

7

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Что именно из приведённых примеров вы хотите рисовать?
Есть свой чарт во всей этой приблуде, но люди, вы бы попробовали реально поиспользовать всё это, а не демо-скриншоты смотреть.
Первое на что наткнётесь - любой график рисуется только полностью. 100 свечей в него запихал - будь добр все 1000 и смотри ан экране.

8 (2015-04-06 14:31:47 отредактировано GREEN_X5)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Помогите пожалуйста перевернуть треугольник вверх-ногами. ) Не обнаружил такой контрол в документации...

TrSell= vcl.Shape(Form, {
Shape="stTriangle",
Pen={Style="psClear"},
Brush={Color=RGB(255,0,0), Style="bsSolid"}
})

9

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Стандартно ничего такого нет, увы

10 (2016-09-29 11:31:47 отредактировано sam063rus)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

-

11 (2015-04-29 13:06:54 отредактировано GREEN_X5)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

sam063rus пишет:

вместо заведомо тупикового пути поддержки vclua (во всех его "ипостасиях") - предлагаю уделить внимание детальному изучению GDI. В таком случае, вы сможете (после определённого времени) писать свои контролы (и "стрелочки", "треугольнички", чарты и пр. муть). В конечном итоге, получив тем самым полную свободу действий и значительное быстродействие.

Совершенно с Вами согласен. Ждём от Вас исчерпывающей инструкции по работе с GDI+qlua.
Пока сидим на qvcl.

12 (2015-04-29 13:19:26 отредактировано swerg)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

Строго говоря, vclua позволяет именно рисовать, используя готовую обёртку над GDI. Но я ума не приложу, как это можно полезно использовать в коде на Lua кроме как в целях саморазвития. Лучше нужный функционал в vclua добавить, будет проще и быстрее.

Кстати, я сделал повороты фигур. Ещё актуально?

13

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

swerg пишет:

Кстати, я сделал повороты фигур. Ещё актуально?

Да, конечно! )

14 (2016-09-29 11:31:55 отредактировано sam063rus)

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

-

15

Re: QVCLua: рисование графических элементов - круги, квадраты и т.д.

sam063rus пишет:

Совершенно с Вами согласен. Ждём от Вас исчерпывающей инструкции по работе с GDI+qlua.

почитайте книгу Феня Юаня (программирование графики для Windows) - там всё на вполне доступном уровне и с примерами, а qlua-прокладку, думаю, для вас не составит труда прикрутить.

Ради одного перевернутого треугольника пожалуй не стану читать. ) А вот когда захочется свечки и прочее рисовать, да, почитаю, конечно, спасибо.