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

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

Помогите кто-нибудь!!!!! Замучился уже...
...
Рейтинг: 0 / 0
На каком событии перерисовывать PainBox
    #32301897
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В документации:
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
На каком событии перерисовывать PainBox
    #32302023
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фигня в том что Image моргает при рисовании.
Мне нужно чтобы за курсором мыши тянулась линия от места предыдущего клика.
Делаю такую штуку:
На событии MouseMove рисую линию при Pen.Mode=pmNot.
Перед этим восстанавливаю предыдущую линию тем же самым pmNot.
Так вот при рисовании Image мигает, а PaintBox нет.
Извратился тем, что положил поверх Image(в который запихнул рисунок) PaintBox, в котором и рисую временные линии.
...
Рейтинг: 0 / 0
На каком событии перерисовывать PainBox
    #32302052
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Избавиться от моргания очень просто:
Image1.DoubleBuffered := true;
...
Рейтинг: 0 / 0
На каком событии перерисовывать PainBox
    #32302093
Фотография CrazyMihey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да вы 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
На каком событии перерисовывать PainBox
    #32302109
Фотография NetFantom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, мигание действительно может быть заметно на Delphi6 - зависит от сложности картинки.
А вот в Delphi5 такого не наблюдается.
Но все действительно дело в DoubleBuffered.
...
Рейтинг: 0 / 0
На каком событии перерисовывать PainBox
    #32302561
Фотография Cauchy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to NetFantom
В Delphi 6 у Image свойства DoubleBuffered не нашел.

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


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