Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по TBitmap, и TImageBox 
V
    Опции темы
VingradFan
Дата 23.9.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



Всех приветствую и прошу помощи. Сразу скажу, что исходники в приложении.

Начинаю писать простейший графический редактор и для начала попробовал рисовать прямые.
"Работает" все так: нажимается кнопка мыши, определяются координаты начала луча. Пока кнопка нажата, на дополнительном битмапе (buffer) отрисовывается линия. Как только кнопка отпущена, результат переносится в основной имиджБокс.

Так вот два вопроса:

1. Почему пока я не отпущу мышь, начерченная линия не видна, т.е. не показывается результат работы buffer.Canvas.LineTo(x,y);
У меня было предположение, что имиджБокс лежит выше буфера на форме, поэтому последнего вообще никогда не видно. Соответственно, пытался дописыват image_box.Hide по нажатию кнопки и image_box.Show по ее "отжатию", но результатов это не принесло...


2. Почему после ресайза формы все, что было нарисовано на канве имиджБокса стирается???


Спасибо за помощь.


Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  paint.rar 185,60 Kb


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
Bitter
Дата 23.9.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Во первых. Не отображается потому, что ты рисуешь в объекте TBitmap, который размещен не на форме, а просто в памяти. Конечно его не видно. И появляется прямая только после копирования на PaintBox (кстати, не имиджБокс, а пэинтБокс).
Исчезает потому, что PaintBox не отслеживает изменение своих размеров. Для рисования используй не PaintBox, а TImage. эта проблема уйдет
А чтобы отображалась линия, ты должен как минимум копировать её в процедуре onMouseMove. 
PM MAIL ICQ Skype   Вверх
niteo
Дата 23.9.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 23.11.2006
Где: Брянск

Репутация: нет
Всего: 1



Цитата(VingradFan @  23.9.2009,  14:24 Найти цитируемый пост)
1. Почему пока я не отпущу мышь, начерченная линия не видна, т.е. не показывается результат работы buffer.Canvas.LineTo(x,y);

Не выводишь содержимое своего буфера в ПаинтБокс. Посмотри ты только по отпусканию кнопки мыши  это делаешь.
Решение: paint_box.Canvas.CopyRect(.....................) Но. У тебя не будут затираться линии после отрисовки, они будут оставаться на канве. Рисуй по ним снова цветом фона.

Цитата(VingradFan @  23.9.2009,  14:24 Найти цитируемый пост)
2. Почему после ресайза формы все, что было нарисовано на канве имиджБокса стирается???

Потому что при ресайзе твоим контролам приходит сообщение виндовс WP_PAINT. Контрол после этого перерисовывает себя. 
Решение: Выводи содержимое буфера в ПаинтБокс после WP_PAINT.

И конечно поиск
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
AntonN
Дата 23.9.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Цитата

они будут оставаться на канве. Рисуй по ним снова цветом фона.

решение не верное, перекрестные линии будут с дырками.

нужно иметь два буфера, на одном "закрепленное" изображение (т.е. когда мышка отпущена и линия нарисовалась), на втором: "закрепленное" изображение + рисование текущей ситуации (ткнули мышкой и тянем линию). Как только протянули линию и отпустли - она рисуется на первом буфере, и им обновляется второй.


--------------------
user posted image
PM MAIL WWW   Вверх
VingradFan
Дата 23.9.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



Спасибо всем за ответы  smile 

Цитата

TBitmap, который размещен не на форме, а просто в памяти

Хаха... Если бы вы знали, как я был удивлен, когда не нашел у него свойств width, height, visible, и т. п.  smile 
Теперь все ясно...



Цитата

 используй не PaintBox, а TImage.

Спасибо, помогло smile



Цитата

Решение: paint_box.Canvas.CopyRect(.....................)

За мышкой будет оставаться шлейф из линий, очень красивый, но не нужный smile



Про идею с двумя бУферами я читал, надеялся реализовать проще, похоже, нереально smile
Еще раз всем спасибо!

PS тему пока не закрываю...


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
VingradFan
Дата 23.9.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



С двумя буферами все получилось, спасибо за советы.  На всякий случай, выкладываю рабочие исходники.

И последний вопрос. 
AntonN, Вроде бы код идеален? Или можно что-то где-то оптимизировать?

Код

procedure Tmain_form.imageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  x0:=x;
  y0:=y;
  down := true;
  buffer_inv.Canvas.CopyRect( bounds(0,0,width,height), image.Canvas, bounds(0,0,width,height) );
end;

procedure Tmain_form.imageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if down then
    begin
      buffer_vis.Assign(buffer_inv);
      buffer_vis.Canvas.MoveTo(x0, y0);
      buffer_vis.Canvas.LineTo(x,y);
      image.Canvas.CopyRect( bounds(0,0,width,height), buffer_vis.Canvas, bounds(0,0,width,height) );
    end;
end;

procedure Tmain_form.imageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if down then
    begin
      down := false;
      buffer_vis.Canvas.MoveTo(x0,y0);
      buffer_vis.Canvas.LineTo(x,y);
      image.Canvas.CopyRect( bounds(0,0,width,height), buffer_vis.Canvas, bounds(0,0,width,height) );
    end;
end;


Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  paint.rar 176,20 Kb


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
AntonN
Дата 23.9.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



да вроде код как код...
но я бы сделал так:
Код

var bt1,bt_dinam:Tbitmap;
    down:boolean; xx,yy:integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bt1:=Tbitmap.Create;
  bt_dinam:=Tbitmap.Create;
  bt1.Width:=Width;
  bt1.Height:=Height;
  bt_dinam.Width:=Width;
  bt_dinam.Height:=Height;
  down:=false;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down:=true;
  xx:=x;
  yy:=y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if(down) then begin
     bt_dinam.Canvas.CopyRect( rect(0,0,bt1.width,bt1.height), bt1.Canvas, rect(0,0,bt1.width,bt1.height) );
     bt_dinam.Canvas.MoveTo(xx,yy);
     bt_dinam.Canvas.LineTo(x,y);
     FormPaint(nil);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if(down) then begin
     bt1.Canvas.MoveTo(xx,yy);
     bt1.Canvas.LineTo(x,y);
     bt_dinam.Canvas.CopyRect( rect(0,0,bt1.width,bt1.height), bt1.Canvas, rect(0,0,bt1.width,bt1.height) );
     FormPaint(nil);
  end;
  down:=false;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.CopyRect( rect(0,0,width,height), bt_dinam.Canvas, rect(0,0,bt_dinam.width,bt_dinam.height) );
end;



--------------------
user posted image
PM MAIL WWW   Вверх
VingradFan
Дата 23.9.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 477
Регистрация: 30.1.2006
Где: Москва

Репутация: нет
Всего: 3



AntonN, Спасибо!

Это сообщение отредактировал(а) VingradFan - 23.9.2009, 22:14


--------------------
Когда-нибудь я стану богатым и куплю себе столько Ролтонов, сколько захочу...
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1216 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.