Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Пояснить код оптимизации прорисовки пользовательского контрола

30.11.2016, 14:22. Показов 1262. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.
Объясните пожалуйста следующий код (на контроле рисуется прямоугольник). Мерцание здесь отсутствует даже несмотря на отсутствие DoubleBuffered. Но почему всё так сложно и наворочено? В чём смысл? Ведь достаточно в конструктор вставить Me.DoubleBuffered = True и в обработчик Paint функцию DrawRectange... (Приведенный упрощённый код извлечён из C# контрола Analog Gauge).
VB.NET
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
Partial Public Class UserControl1
    Inherits UserControl
    Protected defaultRenderer As Renderer  'Внутренние переменные класса
    Private m_renderer As Renderer 'Переменные свойств
    'Конструктор класса
    Public Sub New()
        'Инициализация
        InitializeComponent()
        'Создание рендерера по умолчанию
        Me.defaultRenderer = New DefaultRenderer()
        Me.defaultRenderer.uctrl = Me
    End Sub
    'Делегат события "Перерисовка элемента управления"
    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim _rc As New Rectangle(30, 30, 300, 150)
        Me.defaultRenderer.DrawRectangle(e.Graphics, _rc)                  'рисуем прямоугольник
    End Sub
End Class
Public Class Renderer 'класс рендеринга элемента управления
    Private m_uctrl As UserControl1 = Nothing 'Внутренняя переменная свойства Управление прорисовкой
    Public Property uctrl() As UserControl1  'Свойство для управления прорисовкой
        Get
            Return Me.m_uctrl
        End Get
        Set(ByVal value As UserControl1)
            Me.m_uctrl = value
        End Set
    End Property
    'виртуальный метод
    Public Overridable Function DrawRectangle(ByVal gr As Graphics, ByVal rc As Rectangle) As Boolean
        Return False
    End Function
End Class
'Класс рендеринга элемента управления по-умолчанию 
Public Class DefaultRenderer
    Inherits Renderer
    'рисуем прямоугольник
    Public Overrides Function DrawRectangle(ByVal gr As Graphics, ByVal rc As Rectangle) As Boolean
        gr.DrawRectangle(Pens.Red, rc)
        Return True
    End Function
End Class
Вложения
Тип файла: rar Ver1.0 (DoubleBuffered).rar (89.2 Кб, 6 просмотров)
Тип файла: rar Ver2.0 (TestRendering).rar (21.4 Кб, 6 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2016, 14:22
Ответы с готовыми решениями:

Изменение размера пользовательского контрола
Есть пользовательский контрол NumberDecimalBox, состоящий из TextBox с фильтрацией разрешенных к вводу символов. namespace...

Инициализация атрибутов пользовательского контрола
Помогите, пожалуйста, разобраться. Есть собственный контрол, в котором атрибут: public string currency { get { ...

Как создать событие пользовательского контрола?
Как создать событие созданного пользовательского контрола?

4
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
30.11.2016, 18:35
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Дык у вас в первом варианте есть подписка на событие ValueChanged, которая в свою очередь при очередном такте перерисовывает весь контрол. Во втором этого нет, но если вставите, та же будет история как и в первом.
Повнимательней)
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
30.11.2016, 18:41  [ТС]
Sklifosofsky, Вы как всегда правы. Зевнул. Я был уверен что второй вариант не моргает из-за усложнения кода (делегатов и проч). Тем более непонятно на кой такие сложности, например ничего не делающий код
VB.NET
1
2
3
4
    'виртуальный метод
    Public Overridable Function DrawRectangle(ByVal gr As Graphics, ByVal rc As Rectangle) As Boolean
        Return False
    End Function
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
30.11.2016, 18:53
Лучший ответ Сообщение было отмечено jkrnd как решение

Решение

Цитата Сообщение от jkrnd Посмотреть сообщение
Тем более непонятно на кой такие сложности, например ничего не делающий код
Смотря что хотел сделать пользователь. Похоже что то на универсальный интерфейс рендеринга. При многочисленных вариация отображения в разы сокращает код. То есть Код контрола всегда один, а для отображения нужно требуемый класс рендеринга.

Кстати, есть у меня один контрол, альтернатива TrackBar, использующий схожую схему. Я там не стал заморачиваться и включил DoubleBuffered. Возможно скоро выложу на форуме исходники
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
30.11.2016, 18:58  [ТС]
Sklifosofsky, бум ждать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.11.2016, 18:58
Помогаю со студенческими работами здесь

Как обрабатывать сообщения с пользовательского контрола?
Добрый день. Форма содержит текстбокс и пользовательский контрол userControl11, который в свою очередь содержит checkbox. Как...

Получить ссылку на TextBox пользовательского контрола
Добрый день. Есть процедурно создаваемые кнопки: Response.Write(String.Format(@" <button name='edit' type='submit' value='{0}'>...

Обращение к элементам внутри пользовательского контрола
Всем привет! Вот создал "Пользовательский элемент управления", создал на нём 5 TextBox. Далее кинул его на форму и как теперь к нему...

Создание пользовательского контрола в ячейке DataGridView
Здравствуйте. Понадобилось мне создать свой контрол для редактирования значения в ячейке DataGridView. Данные в грид выбираются из базы,...

Перекинуть Label из окна в контейнер пользовательского контрола
Добрый день уважаемые форумчане сейчас самостоятельно разрабатываю компонент Спойлер.. исходники здесь модификация здесь: ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru