Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125

Как можно нарисовать элемент управления нестандартной формы?

05.10.2013, 20:58. Показов 2810. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ну не для кого не секрет, что такие выкрутасы проще и грамотнее будет сделать с помощью сравнительно новой технологии WPF. Но в WinForms должны же быть какие-то способы построения нестандартных элементов управления. Программисты должны же были как-то выкручиваться, когда дизайнер нарисовал одно, а язык традиционным способом такое реализовать не позволяет.

Сейчас подробнее сформулирую вопрос. Ну для примера возьмем самый простой и самый частый конфликт дизайнера и программиста - кнопки! Допустим дизайнер хочет видеть в программе такие кнопки, как во вложении к вопросу "Снимок.png", а VS позволяет традиционным способом нарисовать только квадратные и прямоугольные кнопки. Такие, как во вложении "Снимок2.png". Картинки взяты из интернета и применяется для наглядности. Затем дизайнера осиняет и он хочет, чтобы у кнопки был какой-нибудь сложноградиентный фон от центра например. После этого заурядный программист либо пошлет такого дизайнера на несколько букв русского алфавита, либо уйдет плакать к себе в отдел. Хороший же программист, хоть и ворча, попытается реализовать такой внешний вид.

До появления WPF программисты должны были как-то решать такой вопрос. Как они это делали? Стандартные и заурядные варианты, такие как использование PictureBox вместо кнопки или просто картинки в качестве фона кнопки, здесь не прокатят, т.к. кнопка все равно будет иметь прямоугольные формы, и если осуществить клик на краю кнопки, где происходит скругление, клик сработает, хотя этого быть не должно, ведь вы кликнули же не на саму кнопку.

Как программисты избавлялись от этих прямоугольных рамок, в которые их ставил WinForms?
Миниатюры
Как можно нарисовать элемент управления нестандартной формы?   Как можно нарисовать элемент управления нестандартной формы?  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2013, 20:58
Ответы с готовыми решениями:

Элемент нестандартной формы
Вопрос в следующем: есть необходимость создания круглого (или другой формы элемента), внутри которого помещается изображение. Думал как-то...

Как правильно удалить элемент управления формы и как правильно после этого переименовать элементы управления?
Еще раз доброе утро! В ходе работы возник вопрос. У меня на форме три Label: Label1, Label2, Label3. Я выделил на форме Label1 и нажал...

Перенос текста из элемента управления одной формы на элемент управления другой
Здрасте, нужна помощь!) Мне нужно чтобы когда я ввожу в поле Text какую либо запись в одной форме и при нажатии на кнопку оно...

4
116 / 116 / 42
Регистрация: 27.02.2013
Сообщений: 899
05.10.2013, 22:58
Самый легкий способ это поместить картинку в кнопку. Или же программно в коде создать ее, например вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// Данный метод для создания кнопки, которая будет программно отрисована
        private void button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            // Ссылка на кнопку button1
            Button button = (Button)sender;
            Graphics gr = e.Graphics;
            // Заполнениие и формирование кнопки
            gr.FillRectangle(brush, 0, 0, button.ClientSize.Width, button.ClientSize.Height);
            gr.FillEllipse(brushinside, 0, 0, button.ClientSize.Width, button.ClientSize.Height);
            gr.DrawEllipse(pen, 0, 0, button.ClientSize.Width, button.ClientSize.Height);
            // Создаём объект траектории
            GraphicsPath path = new GraphicsPath();
            // Добавляем в него эллипс и образуем регион, который будет использоваться для отсечения
            path.AddEllipse(0, 0, button.ClientSize.Width, button.ClientSize.Height);
            // Назначаем, полученный регион на нашу кнопку
            button.Region = new Region(path);
            
            // Создание шрифта и его настройка
            String text = "Round";
            
            Font font = new Font("Arial", 14);
            SolidBrush exbrush = new SolidBrush(Color.Black);
    
            
            RectangleF rect = new RectangleF(button.ClientSize.Width/2-30,button.ClientSize.Height/2-15,button.ClientSize.Width, button.ClientSize.Height);
            // Отображение надписи в кнопке
            gr.DrawString(text, font, exbrush, rect);
 
 
        }
        //Обработчик нажатия на кнопку 
        private void button1_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("Round Button Clicked","Message",MessageBoxButtons.OK,MessageBoxIcon.Information);
        }
 
        // Меняем цвет кнопки,ободка при наезде мышки на кнопку 
        private void button1_MouseEnter(object sender, System.EventArgs e)
        {
            pen = new Pen(Color.Red,10);
            brushinside = new SolidBrush(Color.Yellow);
            // Вызываем здесь перерисовку нашей кнопки
            button1.Invalidate();
        }
        // Меняем цвет кнопки,ободка при выходе мышки за пределы  кнопки 
 
        private void button1_MouseLeave(object sender, System.EventArgs e)
        {
            pen = new Pen(Color.Blue,10);
            brushinside = new SolidBrush(Color.Red);
            button1.Invalidate();
        }
0
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
08.10.2013, 04:28  [ТС]
Цитата Сообщение от blackstar Посмотреть сообщение
Самый легкий способ это поместить картинку в кнопку. Или же программно в коде создать ее, например вот так:
Что-то вообще не уловил смысл приведенного вами кода? Проблему-то он не решает! Нарисовать можно как угодно кнопку, но ФАКТИЧЕСКИ она по-прежнему является прямоугольной и при клике в той области, где визуально кнопки нет, вы кликните как раз на этот прямоугольник, в который вписана ваша кнопка и событие сработает!

Речь же идет о том, как бы так создать любой элемент управления, который бы не являлся вписанным в какую-то прямоугольную область!
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.10.2013, 08:01
Control.Region
0
4 / 4 / 1
Регистрация: 09.08.2010
Сообщений: 125
08.10.2013, 10:32  [ТС]
Да-да, все правильно. Я ночью смотрел, голова не варила! Все верно сказали.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2013, 10:32
Помогаю со студенческими работами здесь

Как наследовать/создать пользовательский элемент управления формы?
Занимаюсь довольно интересной для себя работой, по написанию одной утилиты для своего учебного учреждения. Я студент третьего курса,...

Как сделать окно нестандартной формы?
Полагаю, что для того, чтобы сделать окошко в форме рисунка из PNG, надо использовать UpdateLayeredWindow и WS_EX_LAYERED или как - то по...

Как сделать окно нестандартной формы
Мне надо сделать окно вот такое окно: ________ (________) где ( и )-полукруглые края

Посоветуйте как сделать resize нестандартной формы
У меня есть нестандартная форма и я хочу делать resize за правый-нижний угол, если кто уже делал подскажите как это удобнее реализовать? ...

Как удалить элемент управления с формы, если удаление "как есть" не представляется возможным
Главная форма MainWindow, которая у меня служит фоном, имеет поле, выходящее за пределы Canvas. На это поле я случайно затащил Media...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru