C # Странная ошибка графического интерфейса в VS 2019 при использовании пользовательских элементов управления

#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.
Они работают, но отображаются с графическими элементами кнопок слева (которые являются обычными кнопками, созданными «мышью») и верхней панелью окна свойств. Внешний вид меняется при наведении курсора мыши на кнопку.

Скриншот ПРОТИВ 2019 года

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: требуется ли удаление области после установки ее в виде прямоугольника каждый раз?