Ускорение вывода графики

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Ускорение вывода графики

Сообщение leaveIIIusion » 07.05.2006 (Вс) 13:31

Приветствую всех!
Использую вывод изображения с помощью System.Drawing
Возникла необходимость этот вывод ускорить. Отключил автоматическое обновление окна, включил двойную буфферизацию, но никак не могу подключить виртуальное окно.
На языке С++ создание виртуального окна выглядело примерно так:

Код: Выделить всё
   //объявление переменных
   HWND hWnd;
   HDC hDC, hVirtualDC;
   HBITMAP hBitmap;

   //инициализация
   hDC = GetDC (hWnd);
   hBitmap = CreateCompatibleBitmap (hDC, 650, 450);
   hVirtualDC = CreateCompatibleDC (hDC);
   SelectObject (hVirtualDC, hBitmap);
   
   //рисование изображения(линии)
   MoveToEx (hVirtualDC, 5, 5, NULL);
   LineTo (hVirtualDC, 20, 20);
 
   //вывод того что получилось на форму
   BitBlt (hDC, 0, 0, 650, 450, hVirtualDC, 0, 0, SRCCOPY);




На VB.NET раньше писал просто:
Код: Выделить всё
   Dim g As System.Drawing.Graphics
   g = Me.CreateGraphics()
   g.DrawLine(Pens.Blue, 5, 5, 20, 20)


Подскажите плизз, как написать тоже, но со всем тем ужасом из С++
Дико благодарен за помощь.
Basic .NET ruless world!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.05.2006 (Вс) 13:38

Виртуальное окно... не называй это так никогда, а то тебя не будут понимать.

http://bbs.vbstreets.ru/viewtopic.php?p=64611#64611
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 07.05.2006 (Вс) 14:35

GSerg писал(а):Виртуальное окно... не называй это так никогда, а то тебя не будут понимать.
http://bbs.vbstreets.ru/viewtopic.php?p=64611#64611

Просто боялся, что меня не поймут если назову виртуальным экраном. Я ведь на форме это все рисую :roll: . Ошибку понял. Огромное спасибо за помощь.


Да, еще одно хотел спросить..Понять не могу, а совесть мучает..Почему в коде ниже при прорисовке моргает весь экран? Вроде должно моргать только мое окно. Вначале думал, что это из-за Application.Doevents, но когда убрал эту строку, то глюк остался.

Код: Выделить всё
Public Class Form1
   Dim g As System.Drawing.Graphics
   Dim p() As Point
   Dim max As Long = -1
   Dim break As Boolean = False


   Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      break = True
   End Sub


   Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
      If e.KeyCode = Keys.Escape Then
         Me.Close()
      End If
   End Sub


   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      SetStyle(ControlStyles.UserPaint, True)
      SetStyle(ControlStyles.AllPaintingInWmPaint, True)
      SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
      g = Me.CreateGraphics()
      Console.WriteLine(g.DpiX)
      Console.WriteLine(g.DpiY)
      max = 13
      ReDim p(max)

      p(0).X = 38 : p(0).Y = 81
      p(1).X = 57 : p(1).Y = 46
      p(2).X = 103 : p(2).Y = 45
      p(3).X = 125 : p(3).Y = 77
      p(4).X = 122 : p(4).Y = 118
      p(5).X = 66 : p(5).Y = 163
      p(6).X = 63 : p(6).Y = 194
      p(7).X = 127 : p(7).Y = 196
      p(8).X = 130 : p(8).Y = 219
      p(9).X = 29 : p(9).Y = 216
      p(10).X = 40 : p(10).Y = 146
      p(11).X = 83 : p(11).Y = 107
      p(12).X = 81 : p(12).Y = 74
      p(13).X = p(0).X : p(13).Y = p(0).Y
   End Sub

    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
      While break = False
         Render()
         System.Windows.Forms.Application.DoEvents()
      End While
   End Sub


   Private Sub Render()
      Dim i As Long
      g.Clear(Color.Black)
      For i = 0 To max - 1
         g.FillEllipse(Brushes.Blue, p(i).X - 2, p(i).Y - 2, 4, 4)
         g.DrawLine(Pens.Blue, p(i).X, p(i).Y, p(i + 1).X, p(i + 1).Y)
      Next
   End Sub
End Class
Basic .NET ruless world!

leaveIIIusion
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 30.12.2005 (Пт) 19:01
Откуда: Днепропетровск

Сообщение leaveIIIusion » 07.05.2006 (Вс) 15:04

Сорри, последний топ не считается..Мучался, мучался я, потом перезапустил студию и глюк пропал..Бывает и такое :roll: ..
Basic .NET ruless world!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList