Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2015, 12:20   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию почему канва не рисует на компонентах?

Здравствуйте.
Почему канва ничего не рисует на компонентах?
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  canv := TCanvas.Create;
  canv.Brush.Color := clBlue;
  canv.Handle := GetDC(panel1.Handle);
  canv.Font.Color := clRed;
  canv.Font.Size := 30;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  canv.FloodFill(0,0,clRed,fsSurface);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  canv.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  canv.FloodFill(0,0,clRed,fsSurface);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  canv.FillRect(panel1.ClientRect);
//  canv.TextOut(4,4,'ooooooo');

end;
TextOut() работает, а FloodFill и FillRect нет. Кроме того, собственная канва формы (form1.canvas) тоже никак не реагирует на FloodFill и FillRect.
Формы VCL давно не юзал. Может, всё правильно? Должны ли вообще работать FloodFill и FillRect приминительно к VCL-компонентам?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.11.2015, 12:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому что ты нигде не вызываешь методы рисования на компонентах )
TCanvas это невидимый холст, на который наносится рисунок, но за отображение на экране он не отвечает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2015, 13:30   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
TCanvas это невидимый холст, на который наносится рисунок, но за отображение на экране он не отвечает.
А разве присвоение канве HDC панели не достаточно? Как же тогда отобразить нарисованное?
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.11.2015, 13:41   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как же тогда отобразить нарисованное?
Методом CopyRect например.
Код:
Form1.Canvas.CopyRect(Form1.ClientRect,canv,rect(0,0,canv.Width,canv.Height));
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.11.2015, 15:16   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

и вот еще проблема.
в OnPaint() формы рисую текст на панели через canv.TextOut(); Если проходить дебаггером при первом запуске, текст видно. Жмем F9 - текст пропадает до следующей перекраски. То есть, при первом запуске текст не видно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 19.11.2015, 16:11   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что тут можно сказать?...
Код в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2015, 08:30   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin

  canv := TCanvas.Create;
  canv.Brush.Color := clBtnFace;
  canv.Handle := GetDC(Panel1.Handle);
  canv.Font.Color := clRed;
  canv.Font.Size := 20;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  i : Byte;
  x : SmallInt;
begin
  x := 4;
  for i := 0 to 9 do
  begin
    canv.TextOut(x,20, IntToStr(i));
    inc(x,canv.TextWidth('X')*2);
  end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  canv.Free;
end;
при первом запуске текст не видно.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2015, 09:36   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А его и не должно быть видно )
Ты canv нигде не рисуешь на экране.
Еще раз повторю: TCanvas - холст невидимый, и сам себя рисовать не умеет.
Я выше показал, как на форму перенести содержимое канвы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2015, 09:58   #9
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А его и не должно быть видно )
Ты canv нигде не рисуешь на экране.
Еще раз повторю: TCanvas - холст невидимый, и сам себя рисовать не умеет.
Я выше показал, как на форму перенести содержимое канвы.
но ведь при следующей перекраске текст САМ отображается. Например, если начать изменять размер окна мышкой.
BLACK_RAIN вне форума Ответить с цитированием
Старый 20.11.2015, 10:41   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при следующей перекраске текст САМ отображается.
Привязка то у тебя к DC канвы панели есть, но позволь спросить: А зачем тебе тогда отдельная канва? Разве у панели нет своей канвы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Канва Xo66um Общие вопросы Delphi 2 07.05.2014 09:39
Почему не рисует??? ser70 Qt и кроссплатформенное программирование С/С++ 1 17.04.2013 12:03
График (канва) m0dE Помощь студентам 3 11.10.2011 09:04
treeview и канва. blackstersl Мультимедиа в Delphi 4 06.06.2009 10:02
Канва bekart Общие вопросы Delphi 2 29.11.2007 22:54