Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: System.Drawing2D.GraphicsState Добавлено: 29.12.08 16:07  

Автор вопроса:  diplay

Ответить

  Ответы Всего ответов: 43  

Номер ответа: 16
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #16 Добавлено: 30.12.08 19:07
А причем здесь FromImage?
Этот метод ведь тупо загружает в Graphics картинку и показывает ее.

Ответить

Номер ответа: 17
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #17 Добавлено: 30.12.08 19:24
Этот метод ведь тупо загружает в Graphics картинку и показывает ее.

Ты сам то понял что сказал? :-)
Во первых, в Graphics ничего загрузить нельзя..
Во вторых, Graphics ничего не показывает
В третьих, Graphics предоставляет методы для рисования на контексте.
В четвертых, рисовать с помощью Graphics ты можешь на чем угодно.. на кнопке, на ImageBox, на форме.. т.е. практически на любом объекте.
В пятых, метод FromImage создает объект Graphics чтобы ты мог рисовать на Bitmap, который создашь и который будешь отрисовывать на своем контроле в методе OnPaint
Что касается твоей софтины, то ты там изначально пошел по неверному пути(ну да спишем это на недостаток опыта) Но для учебного пособия тебе ее хватит..

Ответить

Номер ответа: 18
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #18 Добавлено: 30.12.08 19:32
Еще один факт тебе для раздумья.. включи в своей софтине координатную сетку и перетащи ее так,чтобы она на половину ушла за край экрана, а потом верни фориу назад.. Половины твоей сетки не будет, догадаешься почему?
То же самое касается и остальных нарисованных тобой фигур..

Ответить

Номер ответа: 19
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #19 Добавлено: 30.12.08 19:35
Если я все правильно понял, то надо в начале создать битмап. Но чтобы его создать нужно иметь какой-нибудь графический файл
Dim mapa As New Bitmap("Тут должен быть путь к файлу";)

Ответить

Номер ответа: 20
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #20 Добавлено: 30.12.08 19:37
EROS пишет:
Половины твоей сетки не будет, догадаешься почему?

Потому что в при изменениях размера врубается метод Paint, который перерисовывает заново контрол.

Ответить

Номер ответа: 21
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #21 Добавлено: 30.12.08 19:39
Вооот.. уже ближе к телу!!! Ты на правильном пути юный падован.. ))
На самом деле тебе лучше воспользоваться другим конструктором битмапа, например этим
public Bitmap(int width, int height)
    Member of System.Drawing.Bitmap

Summary:
Initializes a new instance of the System.Drawing.Bitmap class with the specified size.

Parameters:
width: The width, in pixels, of the new System.Drawing.Bitmap.
height: The height, in pixels, of the new System.Drawing.Bitmap.


где ширина и высота равны размерам твоего контрола

Ответить

Номер ответа: 22
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #22 Добавлено: 30.12.08 19:42
Я смотрел все 12 overloads конструктора, но этого не заметил. Так я ступил)

Ответить

Номер ответа: 23
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #23 Добавлено: 30.12.08 19:42
Потому что в при изменениях размера врубается метод Paint, который перерисовывает заново контрол.

Не совсем так.. к тому же мы размеры не меняем.. мы просто утащили форму за край экрана и вернули на место.. тоже самое будет если ты ее свернешь/развернешь
На самом деле это о чем я писал ранее - это последствия твоего использования CreateGraphics.. Если бы сделал это, как я говорил ранее в Paint, то этого бы не произошло..

Ответить

Номер ответа: 24
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #24 Добавлено: 30.12.08 19:46
А битмап как отрисовывать на контроле? Через свойство BackgroundImage можно? Или через Graphics.DrawImage()?

Ответить

Номер ответа: 25
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #25 Добавлено: 30.12.08 19:49
сейчас я перенес строчку a = me.Creategraphics в paint
Private Sub DrawingPlace_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        a = Me.CreateGraphics
    End Sub

Но ничего не изменилось

Ответить

Номер ответа: 26
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #26 Добавлено: 30.12.08 19:50
Лучше через Graphics.DrawImage().. но делай это в событии Paint
у тебя там будет что то типа e.Graphics.DrawImage ...

Ответить

Номер ответа: 27
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #27 Добавлено: 30.12.08 19:56
Не рисует теперь.
  1.   Private Sub DrawingPlace_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
  2.         a = Graphics.FromImage(mapa)
  3.         e.Graphics.DrawImage(mapa, point:=New Point(0, 0))
  4.     End Sub

Ответить

Номер ответа: 28
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #28 Добавлено: 30.12.08 20:09
я понял прикол
теперь он отбразит то,что ты нарисовал, когда ты вынудишь его вызвать метод Paint, например, изменением размера, утаскиванием за экран и т.п.

Ответить

Номер ответа: 29
Автор ответа:
 diplay



Вопросов: 4
Ответов: 69
 Профиль | | #29 Добавлено: 30.12.08 20:17
Надо вручную вызывать этот метод после каждого действия пользователя.
например, вставить вызов метода в btnDraw_Click, чтобы при рисовании он сам перерисовывался, но как передать в качестве аргумента e As System.Windows.Forms.PaintEventArgs так, чтобы все сработало?

Ответить

Номер ответа: 30
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #30 Добавлено: 30.12.08 20:20
Но ничего не изменилось

блин.. друг, ну не тормози уже,а :-(

  1.  
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Drawing.Drawing2D;
  5. using System.Windows.Forms;
  6.  
  7. namespace Orcas.PaintBrush
  8. {
  9.  
  10.     public class PaintControl : Control
  11.     {
  12.         //' это чтобы рисовать на картинке
  13.         Graphics graphics = null;
  14.  
  15.         //' это сама картинка на которой будем рисовать
  16.         Bitmap user_image = new Bitmap(500, 500);
  17.  
  18.         //' это стек чтобы сохранять промежуточные состояния битмапа
  19.         //' чтобы можно было откатиться назад
  20.         Stack<Bitmap> user_actions = new Stack<Bitmap>();
  21.  
  22.         //' тут будем запоминать положение мыши
  23.         Point old_location = Point.Empty;
  24.  
  25.         //' флаг чтоб знать нажата ли левая кнопка миши
  26.         bool is_pressed = false;
  27.  
  28.         //' конструктор
  29.         public PaintControl()
  30.         {
  31.             //' устанавливаем биты стиля, чтоб контрол не моргал при перерисовках
  32.             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
  33.             this.UpdateStyles();
  34.  
  35.             //' создаем Graphics для нашей картинки чтоб можно было рисовать
  36.             graphics = Graphics.FromImage(user_image);
  37.         }
  38.  
  39.         protected override void OnPaint(PaintEventArgs e)
  40.         {
  41.             base.OnPaint(e);
  42.  
  43.             //' рисуем нашу картинку на поверхности контрола
  44.             e.Graphics.DrawImage(user_image, 0, 0);
  45.         }
  46.  
  47.         protected override void OnMouseDown(MouseEventArgs e)
  48.         {
  49.             base.OnMouseDown(e);
  50.             /* добавляем в стек копию нашей картинки */
  51.             user_actions.Push((Bitmap)user_image.Clone());
  52.  
  53.             //' запоминаем положение мыши
  54.             old_location = e.Location;
  55.  
  56.             //' устанавливаем флаг в true, что говорит о том, что кнопка нажата
  57.             is_pressed = !is_pressed;
  58.         }
  59.  
  60.         protected override void OnMouseUp(MouseEventArgs e)
  61.         {
  62.             base.OnMouseUp(e);
  63.  
  64.             //' сбрасываем флаг в false
  65.             is_pressed = !is_pressed;
  66.         }
  67.  
  68.         protected override void OnMouseMove(MouseEventArgs e)
  69.         {
  70.             base.OnMouseMove(e);
  71.  
  72.             if (is_pressed)//' если левая кнопка мыши нажата
  73.             {
  74.                 //' рисуем на нашей картинки линию от старого положения мыши до текущего
  75.                 graphics.DrawLine(Pens.Red, old_location, e.Location);
  76.  
  77.                 //' запоминаем текущее положение мыши
  78.                 old_location = e.Location;
  79.  
  80.                 //' заставляем стработать метод OnPaint и перерисовать картинку
  81.                 this.Refresh();
  82.             }
  83.         }
  84.  
  85.  
  86.  
  87.         public void Undo()
  88.         {
  89.             //' убиваем старую картинку
  90.             user_image.Dispose();
  91.             
  92.             //' возвращаем на ее место из стека последнюю запомненную копию
  93.             user_image = user_actions.Pop();
  94.  
  95.             //' заставляем стработать метод OnPaint и перерисовать картинку
  96.             this.Refresh();
  97.         }
  98.  
  99.         public bool CanUndo
  100.         {
  101.             get
  102.             {
  103.                 //' проверяем количество сохраненныйх копий картинки
  104.                 return (user_actions.Count != 0);
  105.             }
  106.         }
  107.     }
  108. }

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам