Тема: QVCLua: рисование графических элементов - круги, квадраты и т.д.
Простой пример как нарисовать на форме графические элементы при помощи VCL.Shape:
Для визуализации используется [url=https://quik2dde.ru/viewtopic.php?id=111]библиотека QVCLua, которую можно взять в отдельной теме[/url].
Про просьбе участника форума добавлена возможность задавать угол поворота для фигур.
Новые свойства и методы для 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