Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / На каком событии перерисовывать PainBox / 8 сообщений из 8, страница 1 из 1
22.10.2003, 16:16
    #32301775
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Из Bitmap при помощи CopyRect в PaintBox загружается рисунок.
Если открыть другое окно (в моем приложении или другое приложение) и оно перекрывает мой PaintBox, то рисунок стирается. Пробовал на OnActivate делать Repaint - не помогло (OnActivate не наступает, если открывать окно другого приложения). Как поймать момент для перерисовки?
...
Рейтинг: 0 / 0
22.10.2003, 16:43
    #32301864
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Опечатка в заголовке:PaintBox.

При вызове диалога открытия файла OnActivate тоже не наступает.

Помогите кто-нибудь!!!!! Замучился уже...
...
Рейтинг: 0 / 0
22.10.2003, 16:54
    #32301897
NetFantom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
В документации:
Unlike TImage, which displays an image that is stored in a bitmap, icon, or metafile, TPaintBox requires an application to draw the image directly on a canvas. Use the OnPaint event handler to draw on the paint box’s Canvas, the drawing surface of the paint box.

Таким образом, тебе нужно на событие OnPaint с помощью CopyRect (или любым другим способом) польностью перерисовывать что хочешь. Т.е. метод Refresh не возымеет действия, т.к. TPaintBox не хранит картинку, и обновлять там нечего.

Соответственно вопрос - нужен ли тебе этот TPaintBox?
...
Рейтинг: 0 / 0
22.10.2003, 17:42
    #32302023
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Фигня в том что Image моргает при рисовании.
Мне нужно чтобы за курсором мыши тянулась линия от места предыдущего клика.
Делаю такую штуку:
На событии MouseMove рисую линию при Pen.Mode=pmNot.
Перед этим восстанавливаю предыдущую линию тем же самым pmNot.
Так вот при рисовании Image мигает, а PaintBox нет.
Извратился тем, что положил поверх Image(в который запихнул рисунок) PaintBox, в котором и рисую временные линии.
...
Рейтинг: 0 / 0
22.10.2003, 17:58
    #32302052
NetFantom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Избавиться от моргания очень просто:
Image1.DoubleBuffered := true;
...
Рейтинг: 0 / 0
22.10.2003, 18:20
    #32302093
CrazyMihey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Да вы Shut ить изволите?
Только что специально попробовал на TImage нихуя не мигает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
 Var
  DrawLine: Boolean;
  Xs, Ys, Xo, Yo : Integer;

 procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  begin
   IF Button = mbLeft
    then
     Begin
      DrawLine := True;
      Xs := X;
      Ys := Y;
      Xo := X;
      Yo := Y;
     End
    else ;
  end;

 procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  begin
   IF Button = mbLeft
    then
     Begin
      DrawLine := False;
      Image1.Canvas.MoveTo( Xs, Ys );
      Image1.Canvas.LineTo( Xo, Yo );
     End
    else ;
  end;

 procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  begin
   IF DrawLine
    then
     Begin
      Image1.Canvas.Pen.Mode := pmNot;
      Image1.Canvas.MoveTo( Xs, Ys );
      Image1.Canvas.LineTo( Xo, Yo );
      Image1.Canvas.MoveTo( Xs, Ys );
      Image1.Canvas.LineTo( X, Y );
      Xo := X;
      Yo := Y;
     End
    else ;
  end;

Code just tested on Delphi 7
Не было никаких заскоков и если вместо Image1.Canvas писать Image1.Picture.Bitmap.Canvas . Правда, производительность может оказаться не оптимальной при использовании TImage1 , в некоторых случаях лучше рисовать прямо на канвасе формы, но это зависит от приложения. Если там статическая картинка ( .BMP , .JPG ), то TImage1 лучше, а если изображение генерируется программой (рисуется методами TCanvas ), то быстрее будет по форме рисовать.
Ах, да, чуть не забыл, в Delphi 5.0 или 6.0 были какие-то заёбы с миганием и моя старая прога при попытке компиляции замигала. Тогда разбираться было некогда, а Delphi 7, по ходу, этим не страдает, так что я про это забыл...
...
Рейтинг: 0 / 0
22.10.2003, 18:32
    #32302109
NetFantom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
Нет, мигание действительно может быть заметно на Delphi6 - зависит от сложности картинки.
А вот в Delphi5 такого не наблюдается.
Но все действительно дело в DoubleBuffered.
...
Рейтинг: 0 / 0
23.10.2003, 10:28
    #32302561
Cauchy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
На каком событии перерисовывать PainBox
to NetFantom
В Delphi 6 у Image свойства DoubleBuffered не нашел.

А делаю я примерно так как показал CrazyMihey.
Только я не понял, что такое DrawLine.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / На каком событии перерисовывать PainBox / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]