[imgui] Трапецеидальная полоска вверху child

vladmany

Известный
Автор темы
117
8
Версия MoonLoader
.026-beta
У меня есть child-блок прямоугольной формы с закругленными углами. Задача отобразить внутри него вверху по центру трапецеидальную полоску, заполненную определенным цветом.
Накидал пример в пеинте, чтобы было лушче понятно:
imgui short beveled strip.png

Также хотелось бы узнать, как сделать сплошную полоску, которая будет нормально отображаться с закругленными углами:
imgui solid rounded strip.png
 

Tema05

Известный
1,442
402
У меня есть child-блок прямоугольной формы с закругленными углами. Задача отобразить внутри него вверху по центру трапецеидальную полоску, заполненную определенным цветом.
Накидал пример в пеинте, чтобы было лушче понятно:
Посмотреть вложение 73562
Также хотелось бы узнать, как сделать сплошную полоску, которая будет нормально отображаться с закругленными углами:
Посмотреть вложение 73563
Насчёт 2 рисунка. Это можно сделать 3 способами:
Lua:
--1 способ с помощью MenuBar

--Это пихаешь туда где ты устанавливаешь цвет всем объектам
imgui.GetStyle().Colors[imgui.Col.MenuBarBg] = imgui.ImVec4(0, 1, 0, 1) -- зелёный

imgui.BeginChild("", imgui.ImVec2(200, 100))
    imgui.PushStyleColor(imgui.Col.MenuBarBg, imgui.ImVec4(0, 1, 0, 1)) --Если ты уже где то используешь MenuBar можно задать цвет только для этого.
    if imgui.BeginMainMenuBar() then
        --тут можно добавлять различные кнопки с помощью imgui.MenuItem() и списки imgui.BeginMenu(), imgui.EndMenu() Список ОБЯЗАТЕЛЬНО нужно помещать в if как и imgui.BeginMainMenuBar(), imgui.EndMainMenuBar()
        imgui.EndMainMenuBar()
    end
    -- обязательно закрываем или всё к херам крашнится
    imgui.PopStyleColor()
imgui.EndChild()
Lua:
--2 способ тупо добавить ещё 1 child только без закругления краёв и другого цвета фона

imgui.BeginChild("##1", imgui.ImVec2(200, 100), true, imgui.WindowFlags.MenuBar) -- обязательно указать этот флаг. Если что 3 параметр определяет видна ли рамка.
    imgui.PushStyleVar(imgui.StyleVar.WindowPadding, imgui.ImVec2(0, 0)) -- убираем все отступы внутри child чтобы прибить 2 child к рамке первого
    imgui.PushStyleVar(imgui.StyleVar.ChildWindowRounding, 0) -- убираем закругления
    imgui.PushStyleColor(imgui.Col.ChildWindowBg, imgui.ImVec4(0, 1, 0, 1))
    imgui.BeginChild("##2", imgui.ImVec2(200, 20))
    imgui.EndChild()
    -- обязательно закрываем или всё к херам крашнится
    imgui.PopStyleColor()
    imgui.PopStyleVar(2)
imgui.EndChild()
Lua:
--3 списоб как я думаю самый сложный но и самый функциональный.

imgui.BeginChild("", imgui.ImVec2(200, 100))
    local draw_x, draw_y = imgui.GetCursorScreenPos().x, imgui.GetCursorScreenPos().y -- ОБЯЗАТЕЛЬНО в самом начале child
    imgui.GetWindowDrawList():AddRectFilled(imgui.ImVec2(draw_x, draw_y) --[[рисуем прямоугольник из левого верхнего угла]], imgui.ImVec2(draw_x + 200 --[[ширена child]], draw_y + 20) --[[до прапвой стороны и на 20 пикселей вниз]], imgui.ImColor(imgui.ImVec4(0, 1, 0, 1)):ToU32(), 0 --[[закругление, можно и не указывать]])
    --если нужно можно добавить линию снизу в цвет границ child
    imgui.GetWindowDrawList():AddLine(imgui.ImVec2(draw_x, draw_y + 21 --[[так как верхние 20 пикселей занимаем зелёная хрень рисуем с 21]]), imgui.ImVec2(draw_x + 200, draw_y + 21), imgui.ImColor(imgui.GetStyle().Colors[imgui.Col.Border] --[[берём цвет границ child]]):ToU32(), 1 --[[толщина линии, если указывать больше то и рисовать её нужно ниже]])
imgui.EndChild()
Насчёт 2 рисунка, это можно сделать только при помощи 3 способа и функции imgui.GetWindowDrawList():AddQuadFilled()
Она рисует произвольный закрашенный четырёхугольник (то есть это и квадрат, и трапеция, и прямоугольник).
Первые 4 параметра координаты углов. 5 параметр цвет. Чтобы сделать рамки отрисуй сначала трапецию в цвет рамок child, а потом рисуй такую же но зелёного цвета и от всех координат draw_y отними 1
Lua:
-- если отобразилось коряво попробуй 3 и 4 аргументы поменять местами
imgui.GetWindowDrawList():AddQuadFilled(imgui.ImVec2(draw_x + 75, draw_y), imgui.ImVec2(draw_x + 125, draw_y), imgui.ImVec2(draw_x + 85, draw_y + 20), imgui.ImVec2(draw_x + 115, draw_y + 20), imgui.ImColor(imgui.GetStyle().Colors[imgui.Col.Border]):ToU32())
imgui.GetWindowDrawList():AddQuadFilled(imgui.ImVec2(draw_x + 75, draw_y - 1), imgui.ImVec2(draw_x + 125, draw_y - 1), imgui.ImVec2(draw_x + 85, draw_y + 20 - 1), imgui.ImVec2(draw_x + 115, draw_y + 20 - 1), imgui.ImColor(imgui.ImVec4(0, 1, 0, 1)):ToU32())
 
Последнее редактирование:
  • Нравится
Реакции: LamberKeep