Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизНачём нарисовать? Найти похожие ветки
← →
clampo © (2006-01-23 02:18) [0]Здрасте. Подскажите, пожалуйста начём лучше рисовать визуализатор звука(очень быстро меняется картинка), и как рисовать без мерцания
← →
Ega23 © (2006-01-23 11:54) [1]Рисовать - на любом компоненте, у которого есть Canvas (ну, хотя-бы на TForm).
Мерцание - для начала поиграй с DoubleBuffered.
← →
Barloggg (2006-01-23 13:05) [2]а еще лучше рисовать на Tbitmap в глубинах оперативки и выводить на форму уже готовый результат. Если рисовать напрямую на канвасе, то картинка будет перетираться при каждом перекрытии окна другими окнами.
Если рисовать на Timage.picture.bitmap.canvas, то картинка не будет перетираться.
← →
MultIfleX (2006-01-23 19:26) [3]Лучше делать так: для отрисовки создавай отдельный поток, в котором будет создан обьект класса канвы, с присвоенным hDC от любого компонента (GetDC(WindowHandle)). Выводишь асинхронно таким образом через него графику на любой компонент, при этом мерцания не наблюдается. Если всеже оно будет, пользуйся советом Barloggg"a - рисуй сперва в памяти, затем выводи.
← →
Gero © (2006-01-23 19:58) [4]> а еще лучше рисовать на Tbitmap в глубинах оперативки и
> выводить на форму уже готовый результат
DoubleBuffered именно это и делает.
← →
clampo © (2006-01-24 06:13) [5]DoubleBuffered - не помог
2MultIfleX - А можнов кодовом варианте?
← →
antonn © (2006-01-24 09:55) [6]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-25 01:57) [7]Мерцания нет, но порга ни сворачивается и на 30% проц грузит.
Если чего: я нарисовал на канве паинт вохса.
и чё за процедура : > DrawBufferBitmap
← →
Loginov Dmitry © (2006-01-25 10:05) [8]А какими методами канвы пользовался при рисовании?
← →
antonn © (2006-01-25 20:05) [9]clampo © (25.01.06 1:57) [7]
и чё за процедура : > DrawBufferBitmap
вот эту процедуру и вызываешь, когда нужно нарисовать. В самой этой процедуре код рисования.
← →
clampo © (2006-01-26 21:51) [10]У меня сразу в процедуре рисования, сначала рисуется на FOutBufferBitmap,
потом
> BitBlt(canvas.Handle,0,0,width,height,FOutBufferBitmap.Canvas.
> Handle,0,0,SRCCOPY);
← →
antonn © (2006-01-27 15:14) [11]да это и была процедура рисования, тебе виднее, как ее переписать:)
← →
Набережных С. © (2006-01-27 16:27) [12]
> antonn © (24.01.06 09:55) [6]
> Gero © (23.01.06 19:58) [4]
> DoubleBuffered именно это и делает.
> коряво оно это делает
А позвольте полюбопытствовать, в чем выражается "корявость"?
← →
Glex © (2006-01-27 17:17) [13]Я такую штуку придумал. Создаёшь N image"эй, где N-кол-во столбиков. Перекрываешь их такими же image"ами, но с картинкой цвета фона. РанТайм: регулируешь высоту вторых image"эй.
← →
antonn © (2006-01-28 20:09) [14]Набережных С. © (27.01.06 16:27) [12]
А позвольте полюбопытствовать, в чем выражается "корявость"?
я когда то ветку создавал по этой проблеме http://delphimaster.net/view/15-1125285055/
оттуда:выявился баг в Дельфи, вследствии чего возникла необходимость в патчах. Но прежде хотелось бы узнать у тех, кто уже пропатчил Дельфи. Баг следующий: при подключении WindowsXP.res(или использования TXPManifest) и включенном doublebuffered у формы, все панели на форме не перерисовываются. Т.е. при обновлении показывают то, что находится под ними(и под формой). Без панелей обойтись не могу и без поддержки стиля ХР тоже. Без doublebuffered все мерцает страшно(гораздо сильнее, чем без Манифеста). Скриншот(13Kb): http://an-files.narod.ru/_image/gluckkkk.GIF
Обращаюсь к уже пропатчившим, скажите пожайлуста, не наблюдается ли подобное? А может кто знает, как исправить это дело?
У самого Delphi 7.0 (build 4.453)
Выяснилось, что на 2005 дельфи такое еще присутствует. На 2006 еще никто из спрашиваемых не ответил:)
PS В системе нужно выставить неклассичекую тему.
← →
Clampo © (2006-01-28 20:20) [15]
> Glex © (27.01.06 17:17) [13]
> Я такую штуку придумал. Создаёшь N image"эй, где N-кол-во
> столбиков. Перекрываешь их такими же image"ами, но с картинкой
> цвета фона. РанТайм: регулируешь высоту вторых image"эй.
>
ага и занимает море оперативы и процца
← →
antonn © (2006-01-28 21:21) [16]кстати, а что за "визуализатор"?
это не эквалайзер со столбцами?
тогда лучше, имхо, создать 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-29 03:33) [17]Пасиба.
> но не надо использовать в кач. элементов контроллы, это
> идиотизм.
Это ты про прогресс бар.
← →
clampo © (2006-01-29 03:38) [18]Именно то, чАво надо. :) С меня стакан красного!
← →
clampo © (2006-01-29 05:26) [19]Почему ч\з random(34) у всех пиков разная высота, а ч\з др пост. меняющеюся велечину все одинаковые. (др велечина меняецца с той же частотой(примерно)и в тех же пределах)?
← →
Набережных С. © (2006-01-29 07:58) [20]
> antonn © (28.01.06 20:09) [14]
Да, действительно глючит:( Спасибо за информацию. А что, нашли в той ветке решение? Она уже умерла, посмотреть не могу.
← →
clampo © (2006-01-29 12:34) [21]Вот так вроде работает, но очень коряво:BandOut[i]:=m[i], где m:array[1..bufSize*nc] of smallInе, bufSize-"уровень" звука со звукавухи
← →
Gero © (2006-01-29 13:35) [22]> [14] antonn © (28.01.06 20:09)
DoubleBuffeder не виноват, виной неправильная работа с темами.
← →
antonn © (2006-01-29 14:14) [23]Gero © (29.01.06 13:35) [22]
DoubleBuffeder не виноват, виной неправильная работа с темами.
просто, если на панель поместить элементы(у меня stringgrid"ы были) и выставить у этой панели doublebuffered, то бага не наблюдается. А если у формы выставить, то баг есть. Надо еще над фреймами поиздеваться... Я потому и пришел к выводу, что это у формы doublebuffed неправильно реализован.
clampo © (29.01.06 12:34) [21]
Вот так вроде работает, но очень коряво:BandOut[i]:=m[i], где m:array[1..bufSize*nc] of smallInе, bufSize-"уровень" звука со звукавухи
да я для примера свой массив придумал, передавай сразу свой, и работай с ним:) может у тебя там больше столбцов(вроде обычно 25 штук).
Набережных С. © (29.01.06 7:58) [20]
нет, решения не нашел, надеюсь, что в 2006 нет такого, только проверить не могу.
← →
Gero © (2006-01-29 14:20) [24]> Я потому и пришел к выводу, что это у формы doublebuffed
> неправильно реализован.
А он у нее вобще не реализован. DoubleBuffered и его использование наследуется от TWinControl, как у панели, так и у формы.
Как я уже говорил, виной всему кривая работа с темами.
← →
clampo © (2006-01-29 16:46) [25]запутался я чё-то
← →
з. танька (2006-01-29 20:52) [26]непонятно зачем все советуют этот DoubleBuffered. ну ресуется в памяти сначала и шо? всё равно если нарисовать 10 объектов на канвасе он 10 раз обновится и пофигу дабл он или не дабл. только информация лишний раз будет копироваться туда-сюда как дура. даблбуфферед на самом деле нужен для панелей в которых много компонентов и для форм а вовсе не для того о чем некоторые думают.
← →
Gero © (2006-01-29 21:05) [27]> информация лишний раз будет копироваться туда-сюда как дура
LOL
← →
clampo © (2006-01-30 04:38) [28]Ктонить ответит на ?: Почему ч\з random(34) у всех пиков разная высота, а ч\з др пост. меняющеюся велечину все одинаковые. (др велечина меняецца с той же частотой(примерно)и в тех же пределах)?
← →
antonn © (2006-01-30 08:22) [29]clampo © (30.01.06 4:38) [28]
ну через рандом - потому что для каждого столбца выбирается случайная высота, от 0 до 33. 33 - это максимальная высота.
> а ч\з др пост. меняющеюся велечину все одинаковые
а эта величина для всех столбцов используется?
з. танька (29.01.06 20:52) [26]
чего то я не понял... :)
← →
clampo © (2006-01-30 18:02) [30]Я это уже понял. Как сделать чтоба всё тоже самое, только не ч\з рандом, а ч\з др пост. меняющеюся велечину все одинаковые?
← →
antonn © (2006-01-30 18:32) [31]т.е. для всех уровней использовать 1 переменную, и чтоб они были одинаковы? в цикле прогнать
var i:integer;
begin
for i:=0 to 15 do
BandOut[i]:=25;
или еще лучше, в процедуре рисования сразу рисовать одинаковые столбцы, без передачи массива. Только нафига вообще нужны эти столбцы?..
вообще, что то я плохо понимаю...
← →
clampo © (2006-01-30 21:27) [32]Прошу прощения за "опечатку" я хотел сказать:
Я это уже понял. Как сделать чтоба всё тоже самое, только не ч\з рандом, а ч\з др пост. меняющеюся велечину? теперь наверно панятно?
← →
antonn © (2006-01-31 04:53) [33]да так же. вообще, покажи свой массив (или там одна переменная?) и его диапазон(максимальные уровни).
приведи пример.var i:integer;
begin
for i:=0 to 15 do
BandOut[i]:= ; //ну подставь сюда переменную, или элемент своего массива
← →
clampo © (2006-01-31 09:58) [34]
m:array[1..bufSize*nc] of smallInt;
массивего заполнение (s - пост. меняющаяся величина)
x:=i+(m[i div nc*nc+nc-1]-s);for i:=0 to 25 do
работает, но каряво
BandOut[i]:= m[i];for i:=0 to 25 do
все столбци одинаковой длинны, пАчемуто
BandOut[i]:= x;
← →
antonn © (2006-01-31 11:10) [35]
>for i:=0 to 25 do
> BandOut[i]:= x; все столбци одинаковой длинны, пАчемуто
это наверно потому, что в каждый эдемент массива записывается одно и тоже значение:)
а так?for i:=0 to 25 do begin
x:=i+(m[i div nc*nc+nc-1]-s);
BandOut[i]:= x;
end;
← →
clampo © (2006-02-01 14:11) [36]Я понял: у меня массив для показа лагует
← →
clampo © (2006-02-02 05:01) [37]antonn, скажи мыло, так на всякий
← →
antonn © (2006-02-02 09:36) [38]чье? мое? в анкете есть.
← →
Ling © (2006-02-09 19:51) [39]
> antonn
DoubleBuffered не глючит с манифестом... даже дети этот баг исправлять умеют.
← →
Fenik © (2006-02-10 00:01) [40]> antonn © (24.01.06 09:55) [6]
> рисовать на буфферном TBitmap, выводить его через BitBlt()
И причем выводить только ClipRect
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.029 c