Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.04.2012, 00:54
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию Рисование поверх TImage

В TImage загружена bmp, поверх рисуется объект (постоянно перемещается). Свойство кисти NotXor теперь не помогает - траектория движения остается все равно (с пустым Image'м работало). Собственно вопрос: как от этого избавиться?

Загрузка картинки:
Код:
OpenPictureDialog1.InitialDir:=GetCurrentDir;
  if OpenPictureDialog1.Execute then
  begin
    Fname:=OpenPictureDialog1.FileName;
    with Form1 do
    begin
      img1.AutoSize:=True;
      img1.Picture.LoadFromFile(Fname);
      img1.Picture.Bitmap.Canvas.Brush.Style:=bsClear;
       ...
   end;

После различных вычислений и тд рисование:
Код:
//fld.Canvas.FillRect(Rect(0,0,wdth,hght));
  fld.Canvas.MoveTo(ship_back.X,ship_back.Y);
  fld.Canvas.LineTo(ship_front.X,ship_front.Y);
  fld.Canvas.Ellipse(ship_front.X-2,ship_front.Y-2,ship_front.X+2,ship_front.Y+2);

Без картинки можно было использовать филлрект, но теперь это вызовет белый прямоугольник. Нужно именно перерисовывать объект поверх картинки, удаляя его предыдущее положение.
Можно, конечно, каждый раз заново грузить картинку, но это ерунда
(fld и img1 - один и тот же TImage)
Ответить с цитированием
  #2  
Старый 01.04.2012, 00:58
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Более правильно иметь "задниий буфер". Создаются 2 битмапа, в первом хранится оригинальная картинка и копируется во-второй, в котором проводится нужная отрисовка. После этого 2 битмап присваивается в TImage.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 01.04.2012, 01:48
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

Так и сделал, спасибо.
Еще один вопрос: не меняется цвет рисования в битмапе (либо серый, либо черный)

Код:
bm_ship.Assign(bm_orig);
  bm_ship.Canvas.MoveTo(ship_back.X,ship_back.Y);
  bm_ship.Canvas.LineTo(ship_front.X,ship_front.Y);
  bm_ship.Canvas.Ellipse(ship_front.X-2,ship_front.Y-2,ship_front.X+2,ship_front.Y+2);
  fld.Picture.Bitmap:=bm_ship;

Код:
bm_ship.Canvas.Pen.Color:=clRed;
Ответить с цитированием
  #4  
Старый 01.04.2012, 01:57
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Выставляй цвет после присвоения битмапа.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 01.04.2012 в 01:59.
Ответить с цитированием
  #5  
Старый 03.04.2012, 00:40
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

Все равно никак не могу понять, в чем дело: не меняется цвет и все тут(. Куда только строчку с присвоением цвета не вставлял)

Код:
...
  bm_ship.Assign(bm_orig);
  bm_ship.PixelFormat:=pf32bit;
  bm_ship.Canvas.Pen.Color:=clRed;
  bm_ship.Canvas.MoveTo(ship_back.X,ship_back.Y);
  bm_ship.Canvas.LineTo(ship_front.X,ship_front.Y);
  bm_ship.Canvas.Ellipse(ship_front.X-2,ship_front.Y-2,ship_front.X+2,ship_front.Y+2);
  fld.Picture.Bitmap:=bm_ship;
...
Ответить с цитированием
  #6  
Старый 03.04.2012, 01:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Прекрасно рисуется нужным цветом:
Код:
procedure TForm2.FormCreate(Sender: TObject);
var
  bm1,
  bm2 :  TBitmap;
begin
  bm1 := TBitmap.Create;
  try
    bm1.LoadFromFile('1111.bmp');
    bm2 := TBitmap.Create;
    try
      bm2.Assign(bm1);
      bm2.PixelFormat := pf32bit;
      bm2.Canvas.Pen.Color:=clRed;
      bm2.Canvas.MoveTo(10, 10);
      bm2.Canvas.LineTo(50, 10);
      bm2.Canvas.Ellipse(20, 20, 80, 40);
      Image1.Picture.Bitmap := bm2;
    finally
      bm2.Free;
    end;
  finally
    bm1.Free;
  end;
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
MrBadge (04.04.2012)
  #7  
Старый 04.04.2012, 17:51
MrBadge MrBadge вне форума
Прохожий
 
Регистрация: 30.12.2009
Сообщения: 28
Репутация: 10
По умолчанию

Да, прошу прощения, по всей видимости, дельфи тупанул: красить не хотел, но после написания строчек кода, никаким боком к битмапу не относящихся, вдруг заработал)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:05.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025