#c# #visual-studio #winforms #user-interface #custom-controls
#c# #visual-studio #winforms #пользовательский интерфейс #пользовательские элементы управления
Вопрос:
У меня странная визуальная ошибка в VS 2019 с проектом Windows forms:
Я начал переделывать примерный проект современного темного пользовательского интерфейса из видео YT: https://www.youtube.com/watch?v=vYDyGxoq9JU
Я хотел, чтобы на панелях и кнопках были закругленные углы, и для этого я добавил новый класс sButton:
namespace Dashboard
{
public class SButton : Button
{
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect,
int nWidthEllipse,
int nHeightEllipse
);
protected override void OnPaint(PaintEventArgs e)
{
Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 12, 12));
}
}
}
Я сделал то же самое с новым классом для панелей с закругленными углами.
Я использовал новый sButton обоими способами: сгенерировал некоторые просто с помощью кода, а некоторые — перетаскивая их из toolbox.
Они работают, но отображаются с графическими элементами кнопок слева (которые являются обычными кнопками, созданными «мышью») и верхней панелью окна свойств. Внешний вид меняется при наведении курсора мыши на кнопку.
3 элемента управления справа — это кнопка sButton. Два из них показывают странные дублированные графические элементы из elswhere.
Это поведение все еще сохраняется при компиляции приложения.
Когда я открываю этот проект на другом компьютере, у которого немного другая версия VS 2019, проблема та же. Вы можете загрузить проект (260 КБ) здесь, если вам интересно.
Я нахожу это действительно странным и не знаю, как ее решить, кроме как попытаться снова начать с нуля.
Комментарии:
1. Если вы получаете дубликаты, то одна из причин заключается в том, что они окрашиваются дважды.
2. Ты ничего не рисуешь.
3. Это плохая идея — удаляться
base.OnPaint(e)
изOnPaint()
метода. ПереместитеCreateRoundRectRgn()
вызов вOnResize()
переопределение метода (после вызоваbase.OnResize(e)
на этот раз). Кстати, вы устанавливаете Регион, поэтому внешние границы не сглаживаются. Это может выглядеть не так уж и здорово.4. Не забудьте удалить старое
Region
значение.5. Спасибо Jimi за ваше предложение. Я создал общедоступный пользовательский метод
makeRoundCorners()
в классе пользовательского элемента управления, который я вызываю в Form1_Load . Затем я делаюRegion = ... CreateRoundRectRgn( ...
Как бы мне сгладить внешние границы? @TnTinMn: требуется ли удаление области после установки ее в виде прямоугольника каждый раз?