Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Как рисовать в координатах PaintBox'а


Автор: S.A.G. 18.4.2007, 15:22
Вот непомню что нужно сделать.. подскажите плиз буду очень признателен.

Автор: Snowy 18.4.2007, 16:52
Смотря что рисовать...
А вообще методы TCanvas - там всё написано.

Автор: S.A.G. 18.4.2007, 17:00
Вообще будет ли оно рисовать? Что-то неполучаеться..
Код

dc:= GetDC(PaintBox1.Canvas.Handle)

Потом например:
Код

Rectangle(dc, 0, 0, PaintBox1.Width, PaintBox1.Height);

Ничего не рисует. Может на этом компоненте нельзя или я что-то не так делаю?

Добавлено через 8 минут и 17 секунд
В dc ничего нет.., 0..

Автор: Snowy 18.4.2007, 17:09
Canvas.Handle это и есть DC
Прям его и подставляй туда, где нужен DC, или так:
Код

  dc := PaintBox1.Canvas.Handle;
И дальше по сценарию...

Добавлено через 4 минуты и 37 секунд
Цитата(S.A.G. @  18.4.2007,  17:00 Найти цитируемый пост)
В dc ничего нет.., 0..
Естественно.
GetDC тут вообще не нужно - оно нужно, когда у тебя хэндл окна.
А в данном случае никакого хэндла окна нет. Потому GetDC и возвращает ошибку - ты скормил ему не окно.
Зато есть уже готовый DC. Его и юзать.

Автор: S.A.G. 18.4.2007, 17:20
Цитата
Потому GetDC и возвращает ошибку - ты скормил ему не окно.

 smile Оно схавало и не вернуло ошибку. Я помню что кормил что-то когда-то а что и кому непомню. Спасибо сейчас проверю.

Добавлено @ 17:24
Гм, я рисую квадрат в обработчике события - перерисовка пейнтбокса. Оно сразу не рисует а рисует буквально через раз или через два когда заставляю окно перерисоваться.. Незнаешь как с этим бороться?

Автор: Snowy 18.4.2007, 17:27
Цитата(S.A.G. @  18.4.2007,  17:20 Найти цитируемый пост)
Оно схавало и не вернуло ошибку.
0 - это и есть ошибка.
Расшифровка ошибки - GetLastError.

Цитата(S.A.G. @  18.4.2007,  17:20 Найти цитируемый пост)
Гм, я рисую квадрат в обработчике события - перерисовка пейнтбокса. Оно сразу не рисует а рисует буквально через раз или через два когда заставляю окно перерисоваться..
Естественно.
Ведь событие перерисовки происходит по необходимости, а не когда этого тебе хочется.
Если очень хочется раньше - вызывай Invalidate (Repaint). Но только не из кода метода перерисовки.

Добавлено через 7 минут и 9 секунд
Вот тестовый пример. Прекрасно работает:
Код

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  RoundRect(PaintBox1.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height,
            PaintBox1.Width div 4, PaintBox1.Height div 4);
  RoundRect(PaintBox1.Canvas.Handle, PaintBox1.Width div 4, PaintBox1.Height div 4,
            PaintBox1.Width div 4 * 3, PaintBox1.Height div 4 * 3,
            PaintBox1.Width div 4, PaintBox1.Height div 4);
end;

Автор: S.A.G. 18.4.2007, 17:38
Цитата
Ведь событие перерисовки происходит по необходимости, а не когда этого тебе хочется

Но ведь после создания компонент сразу перерисовываеться следовательно должен нарисоваться сразу и прямоугольник.

Я разобрался в чем дело - ссылка в dc присваивалась при создании формы т.е. в событии OnCreate формы. Тогда наверное еще не был создан компонент пейнтбокс чтобы получить на него ссылку или что-то в этом духе. Вобщем при присвоении сразу перед рисованием все работает четко.

Автор: Snowy 18.4.2007, 17:45
Просто DC может меняться.
Поэтому нужно брать его непосредственно перед отрисовкой.

Автор: S.A.G. 18.4.2007, 17:55
А если я рисую из объекта который находиться в другом модуле я не имею возможности постоянно обновлять эту ссылку. Как же тогда быть? Или dc меняеться только когда перерисовываеться пейнтбокс?

Автор: Snowy 18.4.2007, 18:05
Когда он меняется? Неисповедимы пути VCL'я
Если рисуешь в другом модуле - передавай ему DC параметром процедуры.

Автор: S.A.G. 18.4.2007, 18:06
в классе рисуют private методы

Автор: Snowy 18.4.2007, 18:11
Ну дай ему не DC, а сам Canvas.
Пусть из него DC достаёт.

Автор: S.A.G. 18.4.2007, 18:16
Попробую

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)