Вниз
Скачать: CL | DM;

Начём нарисовать?   Найти похожие ветки 

← →
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; массив


x:=i+(m[i div nc*nc+nc-1]-s);
его заполнение (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 вся ветка

Скачать: CL | DM;



Память: 0.55 MB
Время: 0.026 c
15-1138852433
Babay
2006-02-02 06:53
2006.02.26
C# для VCL.NET


15-1139218284
Хинт
2006-02-06 12:31
2006.02.26
Индексация в Yandex (robots)


6-1132160039
mj
2005-11-16 19:53
2006.02.26
Освоение принципов работы протокола прикладного уровня HTTP


3-1134057681
Tolyan
2005-12-08 19:01
2006.02.26
Lookup в TDBF


2-1139435290
**Сергей**
2006-02-09 00:48
2006.02.26
Выделенная папка




   Наверх