![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Начём нарисовать? [D7, WinXP]
clampo © (2006-01-23 02:18:00)Здрасте. Подскажите, пожалуйста начём лучше рисовать визуализатор звука(очень быстро меняется картинка), и как рисовать без мерцания
Набережных С. (2006-01-29 07:58:00) [21]
> antonn © (28.01.06 20:09) [14]
Да, действительно глючит:( Спасибо за информацию. А что, нашли в той ветке решение? Она уже умерла, посмотреть не могу.
clampo (2006-01-29 05:26:00) [22]Почему ч\з random(34) у всех пиков разная высота, а ч\з др пост. меняющеюся велечину все одинаковые. (др велечина меняецца с той же частотой(примерно)и в тех же пределах)?
clampo (2006-01-29 03:38:00) [23]Именно то, чАво надо. :) С меня стакан красного!
clampo (2006-01-29 03:33:00) [24]Пасиба.
> но не надо использовать в кач. элементов контроллы, это
> идиотизм.
Это ты про прогресс бар.
antonn (2006-01-28 21:21:00) [25]кстати, а что за "визуализатор"?
это не эквалайзер со столбцами?
тогда лучше, имхо, создать 2 битмапа, на первом нарисовать полностью заполненый эквалайзер, а на второй копировать (хотя бы через canvas.copyrect()) вырезанные столбики из первого. и выводить потом его.
но не надо использовать в кач. элементов контроллы, это идиотизм.
вот, примерчик накидал:
type
TBandOut = array[0..15] of byte; //это массив уровней эквалайзера, не знаю как у тебя, переделай...
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
BT,BTOut:Tbitmap;
BandOut:TBandOut;
procedure DrawBufferBitmap(var BandOut:TBandOut);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DrawBufferBitmap(var BandOut:TBandOut);
var i:integer;
begin
btout.Canvas.Brush.Color:=clblack;
btout.Canvas.FillRect(rect(0,0,150,33));
for i:=0 to 15 do
btout.Canvas.CopyRect(rect( i*10, 33-BandOut[i] ,(i+1)*10-1,33 ) , bt.Canvas , rect( i*10, 33-BandOut[i] ,(i+1)*10-1,33 ) );
BitBlt(canvas.Handle,10,10,btout.width,btout.height,btout.Canvas.Handle,0,0,SRCCOPY);
end;
procedure TForm1.FormCreate(Sender: TObject);
var i,R,G,B:integer;
begin
BT:=Tbitmap.Create;
BTOut:=TBitmap.Create;
bt.Width:=150;
bt.Height:=33;
btout.Width:=150;
btout.Height:=33;
R:=255;
G:=0;
B:=0;
for i:=0 to bt.Height-1 do begin
if i>bt.Height/2 then Dec(R, Trunc(256/bt.Height))
else Inc(G, Trunc(768/bt.Height));
if R<0 then R:=0;
if G>255 then G:=255;
bt.Canvas.Brush.Color:=TColor(RGB(R,G,B));
bt.Canvas.FillRect(Rect(0,i,150,i+1));
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
for i:=0 to 15 do
BandOut[i]:=random(34);
DrawBufferBitmap(BandOut);
end;
Clampo (2006-01-28 20:20:00) [26]
> Glex © (27.01.06 17:17) [13]
> Я такую штуку придумал. Создаёшь N image'эй, где N-кол-во
> столбиков. Перекрываешь их такими же image'ами, но с картинкой
> цвета фона. РанТайм: регулируешь высоту вторых image'эй.
>
ага и занимает море оперативы и процца
antonn (2006-01-28 20:09:00) [27]Набережных С. © (27.01.06 16:27) [12]
А позвольте полюбопытствовать, в чем выражается "корявость"?
я когда то ветку создавал по этой проблеме http://www.delphimaster.ru/cgi-bin/forum.pl?id=1125285055&n=3
оттуда:
выявился баг в Дельфи, вследствии чего возникла необходимость в патчах. Но прежде хотелось бы узнать у тех, кто уже пропатчил Дельфи. Баг следующий: при подключении WindowsXP.res(или использования TXPManifest) и включенном doublebuffered у формы, все панели на форме не перерисовываются. Т.е. при обновлении показывают то, что находится под ними(и под формой). Без панелей обойтись не могу и без поддержки стиля ХР тоже. Без doublebuffered все мерцает страшно(гораздо сильнее, чем без Манифеста). Скриншот(13Kb): http://an-files.narod.ru/_image/gluckkkk.GIF
Обращаюсь к уже пропатчившим, скажите пожайлуста, не наблюдается ли подобное? А может кто знает, как исправить это дело?
У самого Delphi 7.0 (build 4.453)
Выяснилось, что на 2005 дельфи такое еще присутствует. На 2006 еще никто из спрашиваемых не ответил:)
PS В системе нужно выставить неклассичекую тему.
Glex (2006-01-27 17:17:00) [28]Я такую штуку придумал. Создаёшь N image'эй, где N-кол-во столбиков. Перекрываешь их такими же image'ами, но с картинкой цвета фона. РанТайм: регулируешь высоту вторых image'эй.
Набережных С. (2006-01-27 16:27:00) [29]
> antonn © (24.01.06 09:55) [6]
> Gero © (23.01.06 19:58) [4]
> DoubleBuffered именно это и делает.
> коряво оно это делает
А позвольте полюбопытствовать, в чем выражается "корявость"?
antonn (2006-01-27 15:14:00) [30]да это и была процедура рисования, тебе виднее, как ее переписать:)
clampo (2006-01-26 21:51:00) [31]У меня сразу в процедуре рисования, сначала рисуется на FOutBufferBitmap,
потом
> BitBlt(canvas.Handle,0,0,width,height,FOutBufferBitmap.Canvas.
> Handle,0,0,SRCCOPY);
antonn (2006-01-25 20:05:00) [32]clampo © (25.01.06 1:57) [7]
и чё за процедура : > DrawBufferBitmap
вот эту процедуру и вызываешь, когда нужно нарисовать. В самой этой процедуре код рисования.
Loginov Dmitry (2006-01-25 10:05:00) [33]А какими методами канвы пользовался при рисовании?
clampo (2006-01-25 01:57:00) [34]Мерцания нет, но порга ни сворачивается и на 30% проц грузит.
Если чего: я нарисовал на канве паинт вохса.
и чё за процедура : > DrawBufferBitmap
antonn (2006-01-24 09:55:00) [35]Gero © (23.01.06 19:58) [4]
DoubleBuffered именно это и делает.
коряво оно это делает(делало? на D7 по крайней мере...)
рисовать на буфферном TBitmap, выводить его через BitBlt()
для примера:
TMainForm = class(TForm)
private
FOutBufferBitmap:TBitmap;
....
procedure TMainForm.FormCreate(Sender: TObject);
begin
FOutBufferBitmap:=TBitmap.Create;
FOutBufferBitmap.width:=MainForm.width;
FOutBufferBitmap.height:=MainForm.height;
end;
procedure TMainForm.DrawBufferBitmap;
begin
//рисуешь, как тебе надо на FOutBufferBitmap
BitBlt(canvas.Handle,0,0,width,height,FOutBufferBitmap.Canvas.Handle,0,0,SRCCOPY);
end;
clampo (2006-01-24 06:13:00) [36]DoubleBuffered - не помог
2MultIfleX - А можнов кодовом варианте?
Gero (2006-01-23 19:58:00) [37]> а еще лучше рисовать на Tbitmap в глубинах оперативки и
> выводить на форму уже готовый результат
DoubleBuffered именно это и делает.
MultIfleX (2006-01-23 19:26:00) [38]Лучше делать так: для отрисовки создавай отдельный поток, в котором будет создан обьект класса канвы, с присвоенным hDC от любого компонента (GetDC(WindowHandle)). Выводишь асинхронно таким образом через него графику на любой компонент, при этом мерцания не наблюдается. Если всеже оно будет, пользуйся советом Barloggg'a - рисуй сперва в памяти, затем выводи.
Barloggg (2006-01-23 13:05:00) [39]а еще лучше рисовать на Tbitmap в глубинах оперативки и выводить на форму уже готовый результат. Если рисовать напрямую на канвасе, то картинка будет перетираться при каждом перекрытии окна другими окнами.
Если рисовать на Timage.picture.bitmap.canvas, то картинка не будет перетираться.
Ega23 (2006-01-23 11:54:00) [40]Рисовать - на любом компоненте, у которого есть Canvas (ну, хотя-бы на TForm).
Мерцание - для начала поиграй с DoubleBuffered.