Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для cube2
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37

DirectDraw в Visual Basic.Net

31.05.2019, 17:12. Показов 1253. Ответов 0

Студворк — интернет-сервис помощи студентам
Работа с DirectDraw в VB.Net



Всем доброго времени суток! С этом посте я освящу работу с DirectDraw в VB.Net
Хотя DirectDraw уже давно устарел и его уже не разрабатывают, с ним будет интересно познакомиться начинающим программистам. И он всяко быстрее GDI+, который встроен в VB.Net по умолчанию .

Принцип работы:

У нас есть две поверхности:
  • Основная поверхность - поверхность, отображаемая на экране
  • Задняя поверхность - поверхность на который мы делаем наше рисовальное дело
Далее буду их называть PrimaryBuffer и BackBuffer соответственно.

Сначала некоторые действия делаются на BackBuffer, а потом содержимое BackBuffer переносится на PrimaryBuffer.
Для тех, кому непонятно принцип работы:
Code
1
2
3
4
5
6
7
Создать PrimaryBuffer;
Создать BackBuffer;
Бесконечный цикл:
    Рисовать на BackBuffer;
    .........;
    Перенести BackBuffer на PrimaryBuffer;
Конец цикла

Создание проекта:

Сам проект создаётся как обычно. Потом сохраняем его пустым, и в Проект -> Свойства %Имя проекта%

Далее Приложение -> Целевая платформа: Выбираем ".NET Framework 3.5 Client Profile"
Если такого нет, то устанавливаем его из Интернета (лень ссылку вставлять)
Название: DDS2.png
Просмотров: 49

Размер: 56.2 Кб
----------------------------
Потом подключаем DirectDraw библиотеки:
Заходим в Проект -> Свойства %Имя проекта%

Затем в Ссылки -> Добавить

Далее нажимаем "Обзор" и идём по пути: "C:\Windows\Microsoft.NET\DirectX for Managed Code\X.X.XXXX.X" (X.X.XXXX.X - минимальные цифры) и подключаем "Microsoft.DirectX.dll" и "Microsoft.DirectX.DirectDraw.dll"

Если бибилиотек или такого пути нет, то качаем DirectX SDK
----------------------------
Всё готово.
Однако если у вас x64 компьютер (а таких много), необходимо сменить разрядность проекта на x32:
Как сменить разрядность проекта на x32:

Заходим в Проект -> Свойства %Имя проекта%

Потом в Компиляция -> Целевой ЦП: Меняем на x86
Название: DDS3.png
Просмотров: 49

Размер: 35.5 Кб



Кодим:

Сначала создадим и инициализируем видео-устройство:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Imports Microsoft.DirectX.DirectDraw
Public Class Form1
    Public VideoDevice As Device
    'объект - наша видеокарта (пока пустой)
    Public PrimaryBuffer As Surface
    'PrimaryBuffer - объяснил в пункте "принцип работы"
    Public BackBuffer As Surface
    'BackBuffer - объяснил в пункте "принцип работы"
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        VideoDevice = New Device
        'инициализируем видео карту
        VideoDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
        'выбираем режим (в нашем случае - полноэкранный)
        VideoDevice.SetDisplayMode(1366, 768, 32, 0, False)
        'Выбираем разрешение (подставьте своё), глубину цвета, FPS экрана (0 - значение по умолчанию)
    End Sub
End Class


Затем инициализируем поверхности:
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
Imports Microsoft.DirectX.DirectDraw
Public Class Form1
    Public VideoDevice As Device
    'объект - наша видеокарта (пока пустой)
    Public PrimaryBuffer As Surface
    'PrimaryBuffer - объяснил в пункте "принцип работы"
    Public BackBuffer As Surface
    'BackBuffer - объяснил в пункте "принцип работы"
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        VideoDevice = New Device
        'инициализируем видео карту
        VideoDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
        'выбираем режим (в нашем случае - полноэкранный)
        VideoDevice.SetDisplayMode(1366, 768, 32, 0, False)
        'Выбираем разрешение (подставьте своё), глубину цвета, FPS экрана (0 - значение по умолчанию)
        Dim PrimaryDesc As New SurfaceDescription
        'создаём описание главной поверхности, чтобы потом по нему получить саму поверхность
        With PrimaryDesc.SurfaceCaps
            .PrimarySurface = True 'главная
            .Flip = True 'можем переводить изображение с BackBuffer на PrimaryBuffer
            .Complex = True 'главная (или корневая) поверхность
        End With
        PrimaryDesc.BackBufferCount = 1
        'один BackBuffer
        PrimaryBuffer = New Surface(PrimaryDesc, VideoDevice)
        'инициализируем PrimaryBuffer по его описанию
        Dim BackDesc As New SurfaceCaps With {.BackBuffer = True}
        'создаём описание BackBufferа и указываем, что это описание BackBufferа
        BackBuffer = PrimaryBuffer.GetAttachedSurface(BackDesc)
        'инициализируем BackBuffer по его описанию
    End Sub
End Class


Затем добавляем бесконечный цикл:
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
Imports Microsoft.DirectX.DirectDraw
Public Class Form1
    Public VideoDevice As Device
    'объект - наша видеокарта (пока пустой)
    Public PrimaryBuffer As Surface
    'PrimaryBuffer - объяснил в пункте "принцип работы"
    Public BackBuffer As Surface
    'BackBuffer - объяснил в пункте "принцип работы"
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        VideoDevice = New Device
        'инициализируем видео карту
        VideoDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.FullscreenExclusive)
        'выбираем режим (в нашем случае - полноэкранный)
        VideoDevice.SetDisplayMode(1366, 768, 32, 0, False)
        'Выбираем разрешение (подставьте своё), глубину цвета, FPS экрана (0 - значение по умолчанию)
        Dim PrimaryDesc As New SurfaceDescription
        'создаём описание главной поверхности, чтобы потом по нему получить саму поверхность
        With PrimaryDesc.SurfaceCaps
            .PrimarySurface = True 'главная
            .Flip = True 'можем переводить изображение с BackBuffer на PrimaryBuffer
            .Complex = True 'главная (или корневая) поверхность
        End With
        PrimaryDesc.BackBufferCount = 1
        'один BackBuffer
        PrimaryBuffer = New Surface(PrimaryDesc, VideoDevice)
        'инициализируем PrimaryBuffer по его описанию
        Dim BackDesc As New SurfaceCaps With {.BackBuffer = True}
        'создаём описание BackBufferа и указываем, что это описание BackBufferа
        BackBuffer = PrimaryBuffer.GetAttachedSurface(BackDesc)
        'инициализируем BackBuffer по его описанию
        Me.Show()
        'показываем форму
        While True
            '-----------------------------------------'
            '----------какие-то действия тут----------'
            '-----------------------------------------'
            PrimaryBuffer.Flip(BackBuffer, FlipFlags.DoNotWait)
            'совершаем тот самый перенос BackBuffer на PrimaryBuffer
            Application.DoEvents()
            'чтобы не было такого, что "Приложение не отвечает"
        End While
        'бесконечный цикл
    End Sub
End Class


Особенности:
  • При сворачивании формы появляется ошибка "SurfaceLostException"
  • Через ALT+F4 или Application.Exit() программа не завершается; форма пропадает, но сеанс отладки продолжается. Этого можно избежать ключевым словом End
  • Если у формы есть рамка (свойство "FormBorderStyle" в редакторе), тогда полноэкранного режима не будет. Форму можно "таскать", но рисуется всё странно. Для сохранения полноэкранного режима выставите свойство "FormBorderStyle" равное "None" в редакторе.


Свойства и методы у BackSurface для рисования


Цвет заливки

Определяет цвет заливки, как в Paint'е.
Пример:
VB.NET
1
BackBuffer.FillColor = Color.Red


Цвет обводки

Определяет цвет обводки, как в Paint'е.
Пример:
VB.NET
1
BackBuffer.ForeColor = Color.Red


Ширина обводки/рисования

Определяет ширину обводки, как в Paint'е.
Пример:
VB.NET
1
BackBuffer.DrawWidth = 7


Залить цветом

Заливает ВЕСЬ фон одним цветом.
Пример:
VB.NET
1
BackBuffer.FillColor(Color.Blue)


Нарисовать прямоугольник

Рисует прямоугольник.
Пример:
VB.NET
1
BackBuffer.DrawBox(10, 10, 30, 30)
Внимание! Первые два параметра = положение левой верхней точки прямоугольника, в вторые два - положение нижней правой точки прямоугольника.


Нарисовать круг

Рисует круг.
Пример:
VB.NET
1
BackBuffer.DrawCircle(45, 45, 15) 'X и Y центра, радиус


Нарисовать эллипс

Рисует эллипс.
Пример:
VB.NET
1
BackBuffer.DrawEllipse(10, 5, 25, 45)
Внимание! 4 параметра описывают прямоугольник (как в методе "Нарисовать прямоугольник"), который описывает (геометрически описывает) эллипс.


Нарисовать линию

Рисует линию.
Пример:
VB.NET
1
BackBuffer.DrawLine(12, 12, 56, 56)


Нарисовать скруглённый прямоугольник

Рисует скруглённый прямоугольник.
Пример:
VB.NET
1
BackBuffer.DrawRoundedBox(10, 10, 45, 45, 5, 5)
Внимание! Первые 4 параметра описывают сам прямоугольник, пятый - длина скругления по ширине, шестой - длина скругления по высоте.


Написать текст

Пишет текст.
Пример:
VB.NET
1
BackBuffer.DrawText(8, 8, "Hello, CyberForum!", False) 'Последний параметр подобрал экспериментально. Какой шрифт рисуется - не знаю.


Нарисовать из файла

Рисует рисунок из файла.
Пример:
VB.NET
1
2
3
4
Dim SurfaceToDraw As New Surface(НекоторыйBitmap, New SurfaceDescription, НашеВидеоУстройство) 'Первый вариант создания
Dim SurfaceToDraw As New Surface(НекоторыйIOStream, New SurfaceDescription, НашеВидеоУстройство) 'Второй вариант создания
Dim SurfaceToDraw As New Surface("C:/путь/имя_файла.bmp", New SurfaceDescription, НашеВидеоУстройство) 'Третий вариант создания
BackBuffer.DrawFast(12, 12, SurfaceToDraw, DrawFastFlags.DoNotWait) 'X, Y, поверхность, параметры
Дополнение: если вы хотите созданный SurfaceToDraw рисовать без фона, тогда заранее сделайте фон чёрным и используйте метод
VB.NET
1
2
SurfaceToDraw.SetColorKey(ColorKeyFlags.SourceDraw, New ColorKey)
'далее - рисуйте

2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.05.2019, 17:12
Ответы с готовыми решениями:

Visual Basic .Net и Visual Basic 6.0 - В чём разница
В общем возник вопрос: Visual Bisic.Net и Visual Basic - это два разных языка, или же .NET версия это лишь его улучшение. Я так понимаю что...

Visual Basic.Net и Visual Studio 2013 - в чем разница?
Visual Basic.Net и Visual Studio 2013 - в чем разница? Или это одно и тоже, просто называются по другому. Планирую перейти с VB6.0...

Visual Basic .NET vs Visual FoxPro 9.0 в рамках задач реляционной модели данных
Очень хочется обсудить следующую тему. Поставлена задача - написать некоторую программу обработки данных. Все данные, обрабатываемые...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2019, 17:12
Помогаю со студенческими работами здесь

Visual Basic net
Здравствуйте не могу найти как устранить ошибку при на писании кода Dim a() As Single = (25.25, 26.45) Цифры в скобках...

Исходники на Visual Basic .NET
Кто-то читает книжки. Кто-то ищет информацию в Google... А кто-то набирается знаний, разбирая чужие исходники. В этой теме предлагается...

Арктангенс в Visual Basic .NET?
Здравствуйте всем! Как? Как его получить? В классе Math его нет... https://msdn.microsoft.com/ru-ru/library/thc0a116%28v=vs.120%29.aspx

Visual Basic .NET в среде разработки
Всем привет, вопрос по применимости этого языка. Я знаю VBA Excel Вижу, что синтаксис достаточно схож. И вопрос, а что на...

Аналог TStringList в Visual Basic.NET
Здравствуйте все! Помогите разобраться мне надо строки в текстовом файле сохранять в виде списка строк ну и соответственно...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
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