Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Можно ли так сделать? Получить изображение котрола...

404
28 сентября 2005 года
GooD
108 / / 04.12.2003
Привет всем!

Есть такая задача:
Получить изображение(TBitMap) котрола(Наследник от TCustomControl) со всеми котролами которые находятся внутри него. При этом этот конторл не виден на экране, а находится на невидимой странице TNotebook. Надо получить точную копию того, что пользователь бы видел на экране, если бы этот котрол было видно.

Для чего это нужно:
Я хочу сделать эффект анимационного перехода между страницами TNotebook, для этого я получаю два изображения: текущую страницу и ну на которую хочу перейти и с помощью спец. процедуры делаю плавный эффект перехода.

Как я пробовал:
Первым делом я попробовал использовать функцию BitBlt(...), но она не дает изображение невидимого контрола.
Потом я попробовал использовать PaintTo(...), но и тут не получил желаемого результата.
Потом я снова попробовал использовать функцию BitBlt(...), но перед её вызовом делать так:
 
Код:
...
Notebook1.PageIndex:= 0;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 1;
Notebook1.UpDate;
BitBlt(...);
...

Так получались нужные мне изображения но не получалось самого эффекта плавного перехода, т.к. перед анимацией происходило мигание Notebook1.

Вот у меня и возник вопрос можно ли вообще это сделать.

Заранее спасибо за ответ.
5
29 сентября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by GooD
Привет всем!

Есть такая задача:
Получить изображение(TBitMap) котрола(Наследник от TCustomControl) со всеми котролами которые находятся внутри него. При этом этот конторл не виден на экране, а находится на невидимой странице TNotebook. Надо получить точную копию того, что пользователь бы видел на экране, если бы этот котрол было видно.

Для чего это нужно:
Я хочу сделать эффект анимационного перехода между страницами TNotebook, для этого я получаю два изображения: текущую страницу и ну на которую хочу перейти и с помощью спец. процедуры делаю плавный эффект перехода.

Как я пробовал:
Первым делом я попробовал использовать функцию BitBlt(...), но она не дает изображение невидимого контрола.
Потом я попробовал использовать PaintTo(...), но и тут не получил желаемого результата.
Потом я снова попробовал использовать функцию BitBlt(...), но перед её вызовом делать так:
 
Код:
...
Notebook1.PageIndex:= 0;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 1;
Notebook1.UpDate;
BitBlt(...);
...

Так получались нужные мне изображения но не получалось самого эффекта плавного перехода, т.к. перед анимацией происходило мигание Notebook1.

Вот у меня и возник вопрос можно ли вообще это сделать.

Заранее спасибо за ответ.



А что если перписать контрол TNotebook: его обработчик прорисовки переопределить. Я так полагаю, при переключении страниц контрола можно 1) получить старое изображение страницы, 2) отрисовать в буфер новую страницу, 3) запустить процедуру анимации с известнами битмапиками 8)

404
29 сентября 2005 года
GooD
108 / / 04.12.2003
Цитата:
Originally posted by hardcase
А что если перписать контрол TNotebook: его обработчик прорисовки переопределить. Я так полагаю, при переключении страниц контрола можно 1) получить старое изображение страницы, 2) отрисовать в буфер новую страницу, 3) запустить процедуру анимации с известнами битмапиками 8)


Так сделать не получится, потому что TNotebook не рисует компоненты, а при переключении страниц только показывает нужную страницу и скрывает все остальные.

404
29 сентября 2005 года
GooD
108 / / 04.12.2003
Нет ничего невозможного!!!
Ура товарищи! :)
Вот только что за пол часа накатал процедуру, для того чтобы нарисовать компонент на BitMape.
Код:
procedure PainControlToBMP(MainContol: TWinControl;BMP: TBitmap);
var
 I: integer;
 TMP: TBitMap;
 Ctrl: TControl;
begin
 MainContol.Perform(WM_PAINT, BMP.Canvas.Handle, 0);
 for i:=0  to MainContol.ControlCount-1 do
  begin
   TMP:= TBitMap.Create;
   Ctrl:= MainContol.Controls;
   TMP.Width:= Ctrl.Width;
   TMP.Height:= Ctrl.Height;
   Ctrl.Perform(WM_PAINT,TMP.Canvas.Handle,0);
   if Ctrl is TWinControl then
    if TWinControl(Ctrl).ControlCount <> 0 then
     PainControlToBMP(TWinControl(Ctrl),TMP);
   BMP.Canvas.Draw(Ctrl.Left,Ctrl.Top,TMP);
   TMP.Free;
  end;
end;

Вроде всё работает!
:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог