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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2015, 10:09
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Злость Смазывание текста при перемещение по Canvas Bitmap'а

Приветствую форумчане, в общем, грабли, не совсем понял в чем проблема, различные способы выставления прозрачности фона дают эффект смазывания текста при его скроллинге, в статическом положении все норм, подскажите, где ошибка?



Код:
procedure TForm1.FormResize(Sender: TObject);
begin
  InitDraw;
end;

procedure TForm1.InitDraw;
begin
  y := Height; 
  bm.Width := Width; // ширина как у формы
  bm.Height := Height; // высота как у формы
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  S: string;
begin
  bm := TBitmap.Create; // создаем объект TBitmap
  InitDraw;
  bm.Canvas.Font.Size := fontsize;
  bm.Canvas.Brush.Style := bsClear;
  //
  bm.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'bg.bmp');
  Timer1.Enabled := True; // включаем таймер
end;

procedure TForm1.OutText(Bmp: TBitmap; S: string; xoffset, yoffset: Integer);
var
  T: string;
  oldbkmode: Integer;
begin
  // InValidateRect(Bmp.Canvas.handle,NIL,True);
  with Bmp.Canvas do
  begin
    // oldbkmode := SetBkMode(Handle, Transparent);
    if Copy(S, 1, 1) = '#' then
    begin
      T := Copy(S, 2, Length(S));
      Font.Color := $000576DC; // делаем цвет оранжевым
      // SetBkMode(Handle, TRANSPARENT);
      TextOut((ClientWidth - maxlen { TextExtent(S).cx } ) div 2 - 10 - xoffset,
        yoffset { + fontsize } { TextExtent(S).cy } , T);
    end
    else
    begin
      Font.Color := clWhite;
      // SetBkMode(Handle, TRANSPARENT);
      TextOut((ClientWidth - maxlen { TextExtent(S).cx } ) div 2 - xoffset,
        yoffset { + fontsize } { TextExtent(S).cy } , S);
    end;
    // SetBkMode(Handle, oldbkmode);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  i, offset: Integer;
  S: string;
begin
  y := y - 1;
  if y = -maxh then
    y := Height;
  { else if y = 10 then
    Sleep(1000); }
  offset := y;
  //
  with bm.Canvas do
  begin
    // InValidateRect(handle, NIL, True);
    for i := 0 to ListBox1.Items.Count - 1 do
    begin
      S := ListBox1.Items[i];
      OutText(bm, S, 0, offset);
      Inc(offset, interval);//Можно изящнее, в ListBox1 есть соотв. свойства
    end;
    Canvas.Draw(0, 0, bm); // вырисовываем на форме объект Bitmap }
  end;
  //
  Application.ProcessMessages;
end;
Ответить с цитированием
  #2  
Старый 22.05.2015, 10:21
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Нужен временный битмап, где уже хранится картинка и куда будет дополнительно выводится текст.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 22.05.2015, 10:23
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от angvelem
Нужен временный битмап, где уже хранится картинка и куда будет дополнительно выводится текст.

В смысле, создать 2 битмапа, один чисто с картинкой, а другой для отрисовки текста?
Ответить с цитированием
  #4  
Старый 22.05.2015, 10:32
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Должен быть битмап с неизменяемой картинкой. Далее копируем этот битмап в другой, куда и выводим текст. А уже полученный битмап выводим куда нужно. На TImage, TPaint или непосредственно на канву формы.

Кстати, в таймере Application.ProcessMessages лишнее.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 22.05.2015, 10:40
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от angvelem
Должен быть битмап с неизменяемой картинкой. Далее копируем этот битмап в другой, куда и выводим текст. А уже полученный битмап выводим куда нужно. На TImage, TPaint или непосредственно на канву формы.

Кстати, в таймере Application.ProcessMessages лишнее.

1. Даже если просто без картинки текст смазывается при попытке сделать его фон прозрачным.
2. Почему ProcessMessages лишний, интересно ? (разницы, правда, что с ним, что без него не заметил)
Ответить с цитированием
  #6  
Старый 22.05.2015, 10:43
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

1. Именно из-за прозрачности так и происходит, 2 битмапа спасут отца Русской демократии.
2. Потому как бессмысленно. Как таймер может подвесить программу, что приходится использовать ProcessMessages?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 22.05.2015, 10:51
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от angvelem
1. Именно из-за прозрачности так и происходит, 2 битмапа спасут отца Русской демократии.
2. Потому как бессмысленно. Как таймер может подвесить программу, что приходится использовать ProcessMessages?

То ли не с той ноги встал, то ли что, но те же грабли, даже с 2 битмапами: гружу в отдельный битмап картинку, отрисовываю на канвасе, потом накладываю битмап с текстом, короче, таже ситуёвина
Ответить с цитированием
  #8  
Старый 22.05.2015, 10:54
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ещё раз.
1. Имеем два битмапа. В первом картинка, второй буферный.
2. С первого копируем во второй.
3. После копирования выводим текст (во второй!).
4. Второй выводим на канву формы.
5. Возвращаемся к пункту 2.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Alegun (22.05.2015)
  #9  
Старый 22.05.2015, 11:01
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от angvelem
Ещё раз.
1. Имеем два битмапа. В первом картинка, второй буферный.
2. С первого копируем во второй.
3. После копирования выводим текст (во второй!).
4. Второй выводим на канву формы.
5. Возвращаемся к пункту 2.

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
  S: string;
begin
  bm := TBitmap.Create; // создаем объект TBitmap
  fon := TBitmap.Create; 
  InitDraw;
  bm.Canvas.Font.Size := fontsize;
  bm.Canvas.Brush.Style := bsClear;
//
//********************************* ADDED
//Loading Background From File
  fon.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'bg.bmp');
//Draw Background To BM.Canvas
  bm.Canvas.Draw(0, 0, fon);
  //
//*********************************
  Timer1.Enabled := True; // включаем таймер
end;

Как то так, или отрисовку вставить в процедуру таймера, но, тогда, неизбежно мерцание.
Ответить с цитированием
  #10  
Старый 22.05.2015, 11:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Уф. Скинь проект.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 22.05.2015, 11:12
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
По умолчанию

Цитата:
Сообщение от angvelem
Уф. Скинь проект.

DOWNLOAD

.................................................. ..............................
Ответить с цитированием
  #12  
Старый 22.05.2015, 11:19
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Так пойдет?


З.Ы. Временный битмап нинужын!
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 22.05.2015 в 11:21.
Ответить с цитированием
  #13  
Старый 22.05.2015, 11:35
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Примерно так.
Вложения
Тип файла: rar vayrus.rar (2.5 Кбайт, 5 просмотров)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 22.05.2015 в 11:37.
Ответить с цитированием
  #14  
Старый 22.05.2015, 11:51
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от angvelem
Примерно так.
А я без второго битмапа обошелся, бе-бе-бе.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #15  
Старый 22.05.2015, 11:53
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну и прАздравляю, бе-бе-бе.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter