Получить изображение с TCustomControl

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Получить изображение с TCustomControl

Сообщение VirtUX »

Как получить изображение с TCustomControl в TBitmap?
Вот есть, например, TButton. Он определенного цвета, на нем что-то написано и т.д.. Как получить скан-изображение с него, и поместить это изображение в TBitmap?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Метод TWinControl.PaintTo позволяет нарисовать его на любом TCanvas.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Получаю External: SIGSEGV

Код: Выделить всё

if (cnt is TWinControl) then begin
         btm:= TBitmap.Create;
         btm.SetSize(cnt.ClientWidth, cnt.ClientHeight);
         TWinControl(cnt).PaintTo(btm.Canvas, 0, 0); //External: SIGSEGV
         btm.SaveToFile(ParamStr(0)+'.bmp');
         FreeAndNil(btm);
      end;                   

ЧТо не так?...

Добавлено спустя 28 минут 55 секунд:
Похоже PainTo можно использовать только после некоторого события. Я получаю ошибку, так как пытаюсь вызвать метод когда контрол еще не отрисован на своём паренте. При этом свойство Visible = true уже. Как можно определить, что PaintTo уже можно вызывать безболезненно?
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

А если

Код: Выделить всё

if (cnt is TWinControl) then begin
         btm:= TBitmap.Create;
         btm.SetSize(cnt.Width, cnt.Height);
         TWinControl(cnt).PaintTo(btm.Canvas, 0, 0);
         btm.SaveToFile(ParamStr(0)+'.bmp');
         FreeAndNil(btm);
      end; 
?
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

тоже самое. И я уже понимаю, что проблема в самом TBitmap. Так как на канву формы рисует без ошибок. Но в чем проблема? Может сам TBitmap.Canvas надо как-то подготовить?...

Добавлено спустя 13 часов 56 минут 38 секунд:
TBitmap.Canvas является ReadOnly в этом и проблема.
Тогда вопрос: как копировать изображение TCustomControl в TBitmap?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

VirtUX, попробуй воспользоваться функциями самого канваса, типа Draw
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

VirtUX, нужен минимальный пример в котором эта ошибка воспроизводится.
У меня вышеупомянутая процедура работает без вопросов.
Ответить