Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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; массив


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 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.03 c
2-1139278380
Интересующийся
2006-02-07 05:13
2006.02.26
Вопрос про TServerSocket


15-1138741427
Michael5
2006-02-01 00:03
2006.02.26
Решил сделать сервер. Мне подарили материнку. Посмотрел: 486!


3-1135774731
-SeM-
2005-12-28 15:58
2006.02.26
Как определить тексты SQL-запросов (InterBase)


1-1138264389
Lucefer
2006-01-26 11:33
2006.02.26
Передать строку через PostMessage


15-1138992676
БарЛог
2006-02-03 21:51
2006.02.26
Помогите скачать mp3





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский