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

Рисование в графическом окне

28.12.2016, 10:50. Показов 10864. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.
Мы нарисовали на PictureBox средствами GDI+ или API графический примитив.
Свернув-развернув форму мы получим чистое окно, наше рисование исчезнет.
Вставлять код в обработчик Paint не вариант, так-как это не статический блок кода.
Наверняка есть способ, позволяющий дублировать наше рисование в памяти и при перерисовке формы его восстанавливать.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.12.2016, 10:50
Ответы с готовыми решениями:

Как правильно задать толщину пера при рисовании в масштабируемом графическом окне?
Всем здравствуйте. Приведенный ниже код взят с нашего форума, заранее извиняюсь перед автором, так как не помню у кого его позаимствовал:...

Рисование линий в окне стороннего приложения
как можно нарисовать линию в окне стороннего приложения по его хендлу?

Рисование прямоугольника в графическом окне по двум кликам мыши
Задача такова: при нажатии правой клавиши миши первый раз должны записатся её координаты на экране, при повторном нажатии снова записуются...

30
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
04.01.2017, 21:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от jkrnd Посмотреть сообщение
скорость перерисовки при выводе графиков каких-либо параметров во времени, состоящих из десятков тысяч отрезков будет наверняка выше.
Это проверено или просто предположение? И если даже она окажется выше, то действительно ли прорисовка средствами фреймворка имеет недостаточную скорость и использование винапи решает эту проблему?
Цитата Сообщение от jkrnd Посмотреть сообщение
В NET исчезло понятие растровых операций (ROP2, DrawMode)
Что такое ROP2 - я не в курсе. Насчет режимов прорисовки, там вроде есть что-то. Посмотри свойства класса Graphics, там есть всякие режимы сглаживания, интреполяции и т. д. Возможно найдешь что нужно.
Цитата Сообщение от jkrnd Посмотреть сообщение
а как без XOR-рисования нарисовать, а затем стереть нарисованное не испортив фон я не знаю.
Об этом я и говорил
Цитата Сообщение от diadiavova Посмотреть сообщение
впечатав фигуру в изображение ты уже не сможешь в ней ничего изменить - только внести новые изменения во все изображение.
Если каждая фигура - отдельный объект, то ее можно редактировать, после чего все перерисовать, а так возникает именно эта проблема.
Цитата Сообщение от jkrnd Посмотреть сообщение
Когда-то програмируя на VB-6 я ушёл от функций рисования, предлагаемых студией и получил двукратный выигрыш в скорости перерисовки сложных графиков.
Не знаю, возможно и здесь будет также, а возможно и нет, надо пробовать. Но по использованию гди+ напрямую, я тебе не помощник, мне обычно хватает того что есть, так что я туда даже не заглядывал.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.01.2017, 18:43  [ТС]
diadiavova, не могли бы Вы переделать проект Painter (C#) без использования UserControl. Мои попытки перевести Ваш код на VB были безуспешны. Много непонятного и без строчки комментария. Взять хотя бы случай рисования мышью линии (нажал кнопку, протащил, отпустил). Неважно на форме или PictureBox. Тут уже я смогу транслировать на VB.
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
05.01.2017, 18:56
Цитата Сообщение от jkrnd Посмотреть сообщение
Мои попытки перевести Ваш код на VB были безуспешны.
А сервисы типа Code Converter не помогают?
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
05.01.2017, 18:59  [ТС]
diadiavova, Нет. Слишком большая разница особенно в коде дизайнера. Масса ошибок.
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
05.01.2017, 20:36
jkrnd, я переводить тот проект не хочу, проще новый написать. В общих чертах это выглядит так
Вложения
Тип файла: zip drawtobitmap.zip (73.1 Кб, 39 просмотров)
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
06.01.2017, 16:16  [ТС]
diadiavova, С перерисовкой понял, спасибо! Возник ещё один вопрос: Возможно ли в GDI+ рисовать с использованием различных растровых операций?
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
Public Class Form1
    Dim gr As Graphics
    Dim bmp As Bitmap
    Dim pen As Pen
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        gr = Graphics.FromImage(bmp)
        PictureBox1.Image = bmp
    End Sub
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'рисуем на Bitmap
        pen = New Pen(Color.Red, 10)
        Me.gr.DrawLine(pen, 20, 20, 200, 200)
        pen = New Pen(Color.Green, 10)
        Me.gr.DrawLine(pen, 200, 20, 20, 200)
        'Bitmap на PictureBox
        PictureBox1.Refresh()     'или:        PictureBox1.Image = bmp
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'рисуем на PictureBox
        Dim grPB As Graphics = PictureBox1.CreateGraphics
        pen = New Pen(Color.Red, 10)
        grPB.DrawLine(pen, 20, 20, 200, 200)
        pen = New Pen(Color.Green, 10)
        grPB.DrawLine(pen, 200, 20, 20, 200)
    End Sub
End Class
В примере одна линия пересекает другую. В месте пересечения линий остаётся цвет последней нарисованной линии. То есть пиксели одного цвета замещаются пикселями другого цвета. Существуют ли другие способы рисования при наложении цветов (смешивание, инвертирование, переключение в противоположное состояние (XOR-рисование),...)?
Миниатюры
Рисование в графическом окне  
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
08.01.2017, 19:10  [ТС]
Кто-нибудь сможет объяснить почему не работает команда SetROP2(hDC, 7) в приведенном ниже коде. Другие API- функции, как видим, работают как положено.
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
43
44
45
46
47
Imports System.Runtime.InteropServices
 
Public Class Form1
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
    End Structure
    Public Declare Function SetROP2 Lib "gdi32.DLL" Alias "SetROP2" (
       ByVal hdc As Integer,
       ByVal nDrawMode As Integer) As Integer
    Public Declare Function CreatePen Lib "gdi32.DLL" Alias "CreatePen" (
        ByVal nPenStyle As Integer,
        ByVal nWidth As Integer,
        ByVal crColor As Integer) As Integer
    Public Declare Function SelectObject Lib "gdi32.DLL" Alias "SelectObject" (
        ByVal hdc As Integer,
        ByVal hObject As Integer) As Integer
    Public Declare Function MoveToEx Lib "gdi32.DLL" Alias "MoveToEx" (
        ByVal hdc As Integer,
        ByVal x As Integer,
        ByVal y As Integer,
        ByRef lpPoint As POINTAPI) As Integer
    Public Declare Function LineTo Lib "gdi32.DLL" Alias "LineTo" (
        ByVal hdc As Integer,
        ByVal xEnd As Integer,
        ByVal yEnd As Integer) As Integer
    Dim prevPt As POINTAPI
    Dim bmp As Bitmap
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'XOR-рисование  не работает, но линия уже не стирается при перерисовке
        Dim gr As Graphics = Graphics.FromImage(bmp)
 
        Dim hDC As IntPtr = gr.GetHdc  'Получаем дескриптор контекста устройства, связанный с данным объектом Graphics.
        SetROP2(hDC, 7) 'Задаём режим рисования (Copy Pen, Xor Pen, ...)
        Dim pen As IntPtr = CreatePen(0, 10, ColorTranslator.ToWin32(Color.Green))
        SelectObject(hDC, pen)
        MoveToEx(hDC, 100, 100, prevPt)
        LineTo(hDC, 200, 350)
        gr.ReleaseHdc() 'Освобождаем дескриптор контекста устройства Windows.
 
        PictureBox1.Image = bmp
    End Sub
End Class
Кстати. если подставлять в функцию SetROP2 в качестве второго аргумента различные числа (0,1,18...) линия будет рисоваться иначе.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
15.01.2017, 20:31  [ТС]
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Решил проблему рисования средствами API с сохранением нарисованного в свойстве Image(BackGroundImage). Как самый наглядный вариант в примере рассматривается XORPEN-рисование. Может кому-то пригодится.
Вложения
Тип файла: rar Рисование с использованием API.rar (100.6 Кб, 53 просмотров)
2
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
17.01.2017, 05:09  [ТС]
diadiavova, при перестроении выложенного Вами в посте #17 решения Painter (Рисование в графическом окне) возникает 12 предупреждений:
"Доступ к члену в "Painter.PaintCanvas._startPoint" может вызвать исключение времени исполнения, поскольку он является полем класса, который упаковывается и передается по ссылке".
Как избавится от этих предупреждений?
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
17.01.2017, 12:17
jkrnd, насчет предупреждений можешь не беспокоиться, это не ошибки, а просто опасные места. Ошибка времени исполнения может возникнуть, если поле _canvas не инициируется или где-то в коде уничтожается. Поскольку инициализация происходит в конструкторе, а сам контрол нигде не уничтожается - ошибки не возникнет. Да и сам класс, в котором появляется предупреждение, привязан к контролу, то есть если даже контрол будет уничтожен, то все связанные с ним экземпляры класса тоже не будут доступны.
А вообще, этот проект - не образец для подражания, а просто пример, к тому же старый. Именно так все делать я бы не рекомендовал. А как лучше сделать я в этой теме уже показал: используй либо пример с классами фигур, либо с пикчербоксом и битмэпом.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
17.01.2017, 12:30  [ТС]
diadiavova, я убедился в том, что предупреждения можно игнорировать, когда перевёл код на VB. Там они почему-то исчезли сами собой. Спасибо! Ваш код очень помог мне понять как рисовать с сохранением нарисованного и без заморочек в основном коде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2017, 12:30

Рисование линии в графическом редакторе
СПАСИТЕ, ПРОШУ. Курсовой проэкт сдавать через 2 недели, а Я никак разобраться не могу. Я Пишу редактор, руководствуясь Учебным курсом...

Работа с массивом в графическом окне
Столкнулся с проблемой заполнения массива матрицы в новом окне (работал в CodeBlocks-EP). В файле Определитель - основное содержится...

Создать кнопки в графическом окне
Всем привет! Есть вопрос: как реализовать работающие кнопки-объекты в графическом окне? Нет, сейчас я имею ввиду не OnMouseDown, т.к. мне...

Ввод текста в графическом окне
Почему не получается ввести текст в графическом окне, используя read? Один раз получается, а при последующих попытках ввести текст строка...

В графическом окне колеса со спицами - C++
Написать следующее приложение: В графическом окне случайным образом размещается от 3 до 10 колес (количество определяется пользователем)...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru