Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.10;
Скачать: CL | DM;

Вниз

мерцает PaintBox   Найти похожие ветки 

 
iSODEv   (2008-07-07 10:11) [0]

здравствуйте, появилась проблема: мерцает PaintBox, пробовал создать временный питмап и отрисовать его Draw"ом:

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 bmpTemp := TBitmap.Create;
 { работаю с bmptemp }
 PaintBox1.Canvas.Draw(0,0,bmpTemp);
 bmpTemp.Free;
end;

Но все равно мерцает. помогите! как быть?


 
Ega23 ©   (2008-07-07 10:13) [1]

DoubleBuffered := True; - пробовал?


 
iSODEv   (2008-07-07 10:14) [2]

Я пока новичок, а что это?


 
Рамиль ©   (2008-07-07 10:18) [3]

Да не должен он мерцать и без DoubleBuffered со вторым битмапом.

Боюсь у автора PaintBox на скроле размером этак 5000*5000 пикселов. Тут никакие DoubleBuffered не помогут.


 
iSODEv   (2008-07-07 10:50) [4]

нет, размер 500x300 пикселей где-то, я в обработчике OnPaint рисую.
А что это за doublebuffer?


 
Amoeba ©   (2008-07-07 11:40) [5]


> iSODEv   (07.07.08 10:14) [2]
>
> Я пока новичок, а что это?
>

TWinControl.DoubleBuffered

Неужели клавиша F1 на клавиатуре отсутствует или сломана?


 
iSODEv   (2008-07-07 11:54) [6]

Form1.DoubleBuffered := True;
не помагает


 
Рамиль ©   (2008-07-07 11:56) [7]


>  { работаю с bmptemp }

долго работаешь?


 
iSODEv   (2008-07-07 12:01) [8]

рисую там сетку 10x20, каждая клетка - это битмап (20x20 пикселей).
  for i := 1 to 10 do
     for j := 1 to 20 do
     begin
       with bmpTemp.Canvas do
       begin
         StretchDraw(drect,bmpBlue);
         Pen.Color := $00FFAE5E;
         MoveTo(drect.Left,drect.Top);
         LineTo(drect.Right,drect.Top);
         LineTo(drect.Right,drect.Bottom);
         LineTo(drect.Left,drect.Bottom);
         LineTo(drect.Left,drect.Top);
       end;
     end;
 end;


 
Anatoly Podgoretsky ©   (2008-07-07 12:04) [9]

> iSODEv  (07.07.2008 12:01:08)  [8]

Зачем ты 200 раз рисуешь одно и тоже?


 
iSODEv   (2008-07-07 12:08) [10]

а как сделать?
мне же надо еще просчитывать размеры PaintBoxa, он у меня размер может менять (сплиттером).


 
Renegat   (2008-07-07 12:38) [11]

А не проще ли нарисовать ети линии сопстно линиями а не квадратиками? получится гораздо меньше итераций - раз, уйдёт мигание - два. ++а с фига ли при отрисовке в промежуточный битмап тоже мигает? чтобы этого не происходило, не Refresh (или как там этот метод называется), а вызывать InvalidateRect(PaintBox.handle, 0, false);


 
Тын-Дын ©   (2008-07-07 13:06) [12]


> iSODEv   (07.07.08 12:01) [8]


См. также Canvas.FillRect вместо зарисовки в цикле прямоугольника.


 
iSODEv   (2008-07-07 13:11) [13]

у меня там каждая клетка - это миниградиент. алгоритм создания градиента неохота писать, вот и создал бмп.
--
у меня там сперва текст рисуется на белом фоне, (стандартный фон, я его не трогал), простой текст по середине paintbox. но даже он моргает при ресайзе паинтбокса. там я не использовал ни одного битмапа.


 
iSODEv   (2008-07-07 13:12) [14]

текст рисуется всегда, пока одна булевапеременная стоит как false. и когда он true, уже рисуются клетки. моргает в обеих случаях


 
{RASkov} ©   (2008-07-07 13:20) [15]

> [6] iSODEv   (07.07.08 11:54)

if PaintBox.Parent<>nil then PaintBox.Parent.DoubleBuffered:=True;

> [13, 14] iSODEv   (07.07.08 13:11)

"Кидай" свой ПаинтОнПаинт(процедуру) весь сюда...


 
iSODEv   (2008-07-07 13:29) [16]

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
 OldBkMode,x,y,i,j,pW,pH,cW,cH,offset: Integer;
 drect,truerect: TRect;
const
 Pretext1: String = "Welcome";
begin
 if not bInGame then
 begin
   bmpTemp.Height := paintBox1.ClientHeight;
   bmpTemp.Width := paintBox1.ClientWidth;
   with bmpTemp.Canvas do
   begin
     Font.Color := $00FFAE5E;
     Font.Name := "Arial";
     Font.Size := 16;
     OldBkMode := SetBkMode(Handle,Transparent);
     TextOut((PaintBox1.ClientWidth - TextWidth(Pretext1)) div 2,(PaintBox1.ClientHeight - TextHeight(Pretext1)) div 2,Pretext1);
     SetBkMode(Handle,OldBkMode);
   end;
 end
 else begin
   pW := PaintBox1.Width;
   pH := paintBox1.Height;
   cW := pW div 10;
   cH := pH div 20;
   bmpTemp.Height := cH * 20;
   bmpTemp.Width := cW * 10;
   for j := 1 to 20 do
   begin
     drect.Left := 0;
     drect.Right := cW * 10;
     drect.Top := (j * cH) - cH;
     drect.Bottom := drect.Top + cH;
     bmpTemp.Canvas.StretchDraw(drect,bmpBlue);
     for i := 1 to 10 do
     begin
       drect.Left := (i * cW) - cW;
       drect.Right := drect.Left + cW;
       drect.Top := (j * cH) - cH;
       drect.Bottom := drect.Top + cH;
       with bmpTemp.Canvas do
       begin
         Pen.Color := $00FFAE5E;
         MoveTo(drect.Left,drect.Top);
         LineTo(drect.Right,drect.Top);
         LineTo(drect.Right,drect.Bottom);
         LineTo(drect.Left,drect.Bottom);
         LineTo(drect.Left,drect.Top);
         if binfield[i,j] = true then
         begin
           // недоделал
         end;
       end;
     end;
   end;
 end;
 PaintBox1.Canvas.Draw(0,0,bmpTemp);
end;

код незавершен, не ругайтесь :)


 
IsodeV   (2008-07-07 16:11) [17]

Удалено модератором


 
Amoeba ©   (2008-07-07 16:35) [18]

Может стоит посмотреть в сторону DrawGrid? И сетку рисовать не придется. А в ячейках соответственно отрисовывать Bitmap"ы и все, что душе угодно.


 
{RASkov} ©   (2008-07-07 20:19) [19]

> [16] iSODEv   (07.07.08 13:29)

Ясно.... про неоптимальность кода уже говорили...
Теперь расскажи что же нужно и когда моргает.
Попробуй такой вариант:

var bmpTemp: TBimap;
................
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 TPaintBox(Sender).Canvas.Draw(0, 0, bmpTemp);
end;

procedure PaintBMP;
begin
 рисуем на bmpTemp
 PaintBox1.invalidate;
end;

PaintBMP - вызывай только когда картинка реально сменилась...


 
{RASkov} ©   (2008-07-07 20:24) [20]

>         LineTo(drect.Right,drect.Top);
>         LineTo(drect.Right,drect.Bottom);
>         LineTo(drect.Left,drect.Bottom);
>         LineTo(drect.Left,drect.Top);

В двух линиях смысла нет, ну только если в крайних нижне-правых(левых) или верхне-левых(правых) ячейках...



Страницы: 1 вся ветка

Текущий архив: 2008.08.10;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.178 c
15-1214466409
Сергей_77
2008-06-26 11:46
2008.08.10
Быстродействие базы данных


2-1208861820
DJ Kondakov
2008-04-22 14:57
2008.08.10
Окно поверх всех окон


4-1194553942
no3ep
2007-11-08 23:32
2008.08.10
как можно поменять рисунок рабочего стола?


15-1213866102
Fin
2008-06-19 13:01
2008.08.10
Программы для модогядерных процессоров


15-1214187119
Slider007
2008-06-23 06:11
2008.08.10
С днем рождения ! 23 июня 2008 понедельник