Delphi - рисование ( Image>Paintbox>dxpaintbox>dxdraw )

M

Mulder

Требуеться помощь. В рисование графики в своей програме. Перепробовал след. компоненты: Image > Paintbox > DXPaintbox > DXDraw. Один другого работает быстрей, но все равно, моргает. Все вроде пишут использовать DXDraw. Но он у меня МОРГАЕТ:eek: . Почему? Что я не так делаю.
Компонент DXDraw стоит на Panel, она на форме. Рисую в памяти на Bitmap потом нужный кусок отрисовываю на DXDraw.
 

xaxulin

Местный
Регистрация
24 Янв 2004
Сообщения
17
Реакции
18
Credits
30
Уточни тебе нужна 3D - графика?
 
M

Mulder

Так подскажет кто-нибудь. Может ссылку какую подкините.
 

xaxulin

Местный
Регистрация
24 Янв 2004
Сообщения
17
Реакции
18
Credits
30
Уточни в чем проблема....Если только 2D, тогда зачем тебе DXDraw нужен? Создай в памяти Bitmap и рисуй в нем потом отрисовывай его в своем Image. Мерцания не будет.
 

tobefree

Местный
Регистрация
24 Апр 2007
Сообщения
11
Реакции
4
Credits
22
Doublebuffered как то так свойство называется.... поставь его в тру.
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
А что понимается под морганием - мерцание или просто низкая частота кадров?

Если скорость не важна, достаточно просто отрисовывать bitmap через BitBlt.

Если частоты кадров не хватает, надо смотреть, как весь процесс отрисовки организован. Лучше всего по таймеру (только не обычному, а, например, mmtime) организовать вывод в контекст DirectDraw. Но всё зависит от того, что рисуется...
 
D

disas

Что бы не моогало давно уже придуман способ - рисовать надо не на самом изображении а на его копии в буфере (в досе это переключение страниц видео памяти например). После окончания отрисовки картинку меняем и т.д.
 
M

Mulder

Ничего не пониманию. На image долго выводить. По морганием понимается, что картинка целиком или полосами мигает, заметно исчезновение картинки, хотя я ее никуда не деваю.
Doublebuffered пробовал, как не странно не помагает.
А рисую я сначало в памяти.
 
M

Mulder

На данный момент мне надо только 2D-графика, бес анимации. Я хачу отрисовывать данные что бы делать это как я хочу, раньше я выводил данные на stringgrid.

Значит есть 3 массива, один ( mastexx_text ) содержит в себе текстовую информацию, другое ( mastexx_param ) параметры, третий ( mastexx_area ) - координаты. С использованием всех этих данных я отрисовываю таблицу в памяти и вывожу на экран. Фигня конечно, но я хочу отрисовать все самостоятельно.

Код:
  if mastexx_param[global_x{+1},global_y{+1},6]='AB' then begin
   bmp_drawtexx.Canvas.TextOut( strtoint(mastexx_area[x2{+1},y2{+1},0])
           + (strtoint(mastexx_area[x2{+1},y2{+1},2]) div 2 - bmp_drawtexx.Canvas.TextWidth(mastexx_text[x2,y2]) div 2),
   strtoint(mastexx_area[x2{+1},y2{+1},1]), mastexx_text[x2,y2] );
  end;

mastexx_param и mastexx_area это массивы.
bmp_drawtexx это bitmap в памяти на котором все рисуеться

Код:
                      dxdraw1.Surface.Canvas.CopyRect(Rect
(global_x3,global_y3,panel2.Width,panel2.Height)
          ,bmp_drawtexx.Canvas
          ,Rect(0,0,panel2.Width-global_x3,panel2.Height-global_y3));

и выводим
Код:
dxdraw1.Surface.Canvas.Release;

Может просто надо какую-то другую команду использовать. На image медленно. А с dxdraw я работаю в первый раз.
 
Последнее редактирование модератором:

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Самый простой способ.

Пусть bmp_drawtexx - Ваш TBitMap, w и h - его ширина и высота.
Пусть у Вас создана процедура DrawTable(ACanvas: TCanvas), которая рисует на произвольном холсте ACanvas Ваше актуальное изображение.
На форму достаточно кинуть TPaintBox (пусть его имя - PB).

Тогда обработчик события OnPaint объекта PB выглядит так:
Код:
procedure TForm1.PBPaint(Sender: TObject);
begin
  if assigned(bmp_drawtexx) then begin
    DrawTable(bmp_drawtexx.canvas);
    bitblt(PB.Canvas.Handle, 0, 0, w, h, bmp_drawtexx.Canvas.Handle, 0, 0, SRCCOPY);
  end;
end;

Понятно, что w и h лучше делать равными размерам PB (например, в событии OnResize, правда, у PB такого события нет, поэтому PB кладётся на что-нибудь, у чего такое событие есть (например, TPanel) и выравнивается по контейнеру).
 
M

Mulder

А через процедуру что быстрей, чем например если под кнопку? Попробовал bitbtl с dxdraw эффект тот же - моргает. Моргает - то есть на фоне dxdraw появляються черные горизонтальные полосы по 100-150 px. Что за...? А как например браузер выводит на экран страницу, там же куча графики.
 
Последнее редактирование модератором:

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Ещё никто никогда не сталкивался с мерцанием при выводе из буфера через BitBlt. Похоже, проблема в чём-то ещё.
Попробуйте не использовать "dxdraw".
DirectX конечно, обеспечит более быструю отрисовку, но им надо уметь пользоваться.
 
M

Mulder

Так на paintbox пусть и несильное но общее моргание картинки.