Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249

Панель с закругленными углами и цветным контуром

01.10.2015, 22:08. Показов 11169. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу немного украсить интерфейс программы панелями типа TPanel с закругленными углами и цветным контуром. Стандартная панель такого функционала предоставить не может. Пробовал что-то придумать с помощью фигур TShape, но во-первых эти фигуры всегда лежат под другими объектами, а во-вторых не понял как можно настроить радиус закругления (наверное никак).

Можно ли как-то простым способом решить мою задачу без использования сторонних компонентов?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2015, 22:08
Ответы с готовыми решениями:

Прямоугольник с закругленными углами
Нужно нарисовать в паскале знак. подскажите, как нарисовать прямоугольник с закругленными углами?) ну если не сложно можно нарисовать...

Edit с закругленными углами
Приветствую. Работаю c Delphi 7. Там есть компонент Edit. Так вот. Он не совсем красив для меня. Не очень современен. Можно конечно...

Фрейм с закругленными углами
Здравствуйте,с HTML знаком не так давно, и при создании своего сайта возникает много вопросов. А именно один из них. Как сделать фрейм с...

33
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33451 / 21551 / 8248
Регистрация: 22.10.2011
Сообщений: 37,003
Записей в блоге: 12
03.10.2015, 19:51
Студворк — интернет-сервис помощи студентам
Нитонисе, это не Дельфи, чтобы вызывать деструктор предка, тут все автоматически... 4-я строка не нужна.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
03.10.2015, 19:52  [ТС]
Цитата Сообщение от UI-Maker Посмотреть сообщение
А откуда у вас Gdiplus? По хорошему в коде не нужно делать ни GdiplusStartup ни GdiplusShutdown - это должно быть в модуле GDIP.
Я активирую GDI+ в конструкторе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class PACKAGE TMyPanel : public TPanel
{
private:
    // GDI+
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR  gdiplusToken;
public:
    __fastcall TMyPanel(TComponent* Owner);
};
 
 
__fastcall TMyPanel::TMyPanel(TComponent* Owner)
    : TPanel(Owner)
{
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
Если не так, то как иначе задействовать функционал GDI+ при отрисовке компонента?

Добавлено через 1 минуту
Цитата Сообщение от volvo Посмотреть сообщение
это не Дельфи, чтобы вызывать деструктор предка, тут все автоматически...
То есть просто убрать
C++
1
TPanel::~TPanel();
?
Убрал - вроде бы все работает нормально. Но не теряются ли при этом где-то выделенные ресурсы? CodeGuard ничего не ловит.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
03.10.2015, 19:58
Откуда вы взяли функции GDI+, заголовочные файлы? Руками подключили? Тогда при запуске программы GdiplusStartup при завершении пограммы GdiplusShutdown.
Если в модуле - то скорее всего там уже сделано GdiplusStartup и само вызовется GdiplusShutdown когда надо.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
03.10.2015, 21:11  [ТС]
Цитата Сообщение от UI-Maker Посмотреть сообщение
Откуда вы взяли функции GDI+, заголовочные файлы? Руками подключили?
Да. В заголовочном файле разрабатываемого компонента:
C++
1
#include <gdiplus.h>
Ну и далее в конструкторе компонента GdiplusStartup, а в деструкторе GdiplusShutdown.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.10.2015, 21:28
Цитата Сообщение от Нитонисе Посмотреть сообщение
Я активирую GDI+ в конструкторе:
Нельзя так делать, GDI+ должна открываться где-то из вне и там же закрываться.

Иначе что будет, если у вас несколько компонент?
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
03.10.2015, 21:47  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Иначе что будет, если у вас несколько компонент?
В каждом будет жить своя инициализация GDI+. Почему так нельзя?

Вообще в самой программе я могу использовать GDI+, а могу и не использовать. При этом в любом случае хотелось бы, чтобы панель рисовалась с помощью этой графической библиотеки.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
03.10.2015, 22:17
У меня в Делфи7 заголовочник под названием GdiPlus.pas и там сделано так:
Delphi
1
2
3
4
5
6
7
initialization
  TGPImageFormat.FInitialized := False;
  StartupInput.Intialize;
  GdiplusStartup(GdiplusToken, @StartupInput, nil);
 
finalization
  GdiplusShutdown(GdiplusToken);
То есть грубо говоря при подключённом модуле при включении программы само один раз инициализируется, при выключении само один раз освобождается.
Всё готово, можно просто использовать функции. Где угодно и когда угодно. Зачем много раз-то? Не нашёл сходу можно ли так вообще делать, но даже если - оно же поест ресурсы. Да и кстати инициализации/освобождения время как бы тратится.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
03.10.2015, 22:37  [ТС]
Ну, я не великий спец, но насколько я понимаю на С++ чтобы использовать gdi+ недостаточно подключить соответствующий заголовочный файл. Для пробы убрал функции активации GDI+ и завершения работы - в дизайн-тайме рисование GDI+ работает, но в ран-тайме выскакивает ошибка.

Добавлено через 2 минуты
Хотя взял инициализацию GDI+ перенес в программу, а в файлах компонента удалил - теперь все рисуется и в дизайн- и в ран-тайме.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
04.10.2015, 11:58  [ТС]
Цитата Сообщение от UI-Maker Посмотреть сообщение
Откуда вы взяли функции GDI+, заголовочные файлы? Руками подключили?
Да. В заголовочном файле разрабатываемого компонента:
C++
1
#include <gdiplus.h>
Ну и далее в конструкторе компонента GdiplusStartup, а в деструкторе GdiplusShutdown.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
04.10.2015, 12:02  [ТС]
Вобщем вот какая панелька получилась. Вцелом мне нравится, только есть небольшой графический дефект (утолщение) в месте стыковки дуги и прямой линии из-за чего нет плавности перехода. Не придумал как это победить.

Прикладываю группу проектов, включающую в себя пакет с компонентом и тестовое приложение. Посмотрите, если кому не сложно, на предмет очевидных несуразностей, которые могут выйти боком при массовом применении этих панелей.

И есть два вопроса.
1. При изменении моих новых свойств панели они применяются только после того, как я кликну на компонент. Неудобно.
2. Цвет clBtnFace почему-то рисуется черным, а не светло-серым.
Изображения
 
Вложения
Тип файла: zip MyPanel.zip (54.8 Кб, 16 просмотров)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33451 / 21551 / 8248
Регистрация: 22.10.2011
Сообщений: 37,003
Записей в блоге: 12
04.10.2015, 12:39
Цитата Сообщение от Нитонисе Посмотреть сообщение
При изменении моих новых свойств панели они применяются только после того, как я кликну на компонент. Неудобно.
Сделай правильно - будет удобно. Назначать новые значения свойству нужно через setter. На примере MyBorderWidth (остальные доработаешь по аналогии)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
private:
    // ...
    void __fastcall SetMyBorderWidth(float Value)
    {
        if(FMyBorderWidth != Value)
        {
        FMyBorderWidth = Value;
        Invalidate(); // Вот оно !!!
        }
    }
 
__published:
    __property float MyBorderWidth = {read=FMyBorderWidth, write=SetMyBorderWidth, default=true}; // заметил изменение?
1
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
04.10.2015, 12:47  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Сделай правильно - будет удобно. Назначать новые значения свойству нужно через setter.
К этому и сам пришел, только вместо Invalidate() использовал Repaint(). Писать на каждое свойство функцию-сеттер только из-за этой перерисовки - довольно трудоемко, если таких свойств будет много Думал может есть более простой способ.
0
39 / 39 / 11
Регистрация: 05.09.2015
Сообщений: 262
04.10.2015, 13:43
есть небольшой графический дефект (утолщение) в месте стыковки дуги и прямой линии
Не вижу на скриншоте подобного.
0
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249
04.10.2015, 13:49  [ТС]
Цитата Сообщение от UI-Maker Посмотреть сообщение
Не вижу на скриншоте подобного.
Масштаб в браузере 100%? У меня стоит 125% и дефект не сильно заметен, а на 100% - заметен. Впрочем, я в этом смысле перфекционист и мне режут глаз даже мельчайшие дефекты, которые другие просто не замечают
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2015, 13:49

Резиновый блок с закругленными углами
нужно сделать блок, вверху которого будут хеадер и подвал с закругленными углами. Чтоб этот блок растягивался по мере добавления текста....

Закрашенный прямоугольник с закруглёнными углами
Как нарисовать закрашенный прямоугольник с закруглёнными углами с помощью System.Drawing.Drawing2D? Буду благодарен за помощь ;)

Страуструп. Окно с закруглёнными углами
Доброго времени суток! Вопрос может показаться элементарным, но всё же, бьюсь над заданием из книги Страуструпа Программирование. Принцыпы...

Прямоугольник с закругленными углами Corel
Здравствуйте. Можно ли как-то нарисовать прямоугольник с закругленными углами через макрос? Простой прямоугольник рисую через...

Собственные окна с закругленными углами
Здравствуйте. Подскажите, пожалуйста. Каким способом делают свое оформление для окон с закругленными углами(Т.е. свое изображение)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru