...
Notebook1.PageIndex:= 0;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 1;
Notebook1.UpDate;
BitBlt(...);
...
Можно ли так сделать? Получить изображение котрола...
Есть такая задача:
Получить изображение(TBitMap) котрола(Наследник от TCustomControl) со всеми котролами которые находятся внутри него. При этом этот конторл не виден на экране, а находится на невидимой странице TNotebook. Надо получить точную копию того, что пользователь бы видел на экране, если бы этот котрол было видно.
Для чего это нужно:
Я хочу сделать эффект анимационного перехода между страницами TNotebook, для этого я получаю два изображения: текущую страницу и ну на которую хочу перейти и с помощью спец. процедуры делаю плавный эффект перехода.
Как я пробовал:
Первым делом я попробовал использовать функцию BitBlt(...), но она не дает изображение невидимого контрола.
Потом я попробовал использовать PaintTo(...), но и тут не получил желаемого результата.
Потом я снова попробовал использовать функцию BitBlt(...), но перед её вызовом делать так:
Код:
Так получались нужные мне изображения но не получалось самого эффекта плавного перехода, т.к. перед анимацией происходило мигание Notebook1.
Вот у меня и возник вопрос можно ли вообще это сделать.
Заранее спасибо за ответ.
Цитата:
Originally posted by GooD
Привет всем!
Есть такая задача:
Получить изображение(TBitMap) котрола(Наследник от TCustomControl) со всеми котролами которые находятся внутри него. При этом этот конторл не виден на экране, а находится на невидимой странице TNotebook. Надо получить точную копию того, что пользователь бы видел на экране, если бы этот котрол было видно.
Для чего это нужно:
Я хочу сделать эффект анимационного перехода между страницами TNotebook, для этого я получаю два изображения: текущую страницу и ну на которую хочу перейти и с помощью спец. процедуры делаю плавный эффект перехода.
Как я пробовал:
Первым делом я попробовал использовать функцию BitBlt(...), но она не дает изображение невидимого контрола.
Потом я попробовал использовать PaintTo(...), но и тут не получил желаемого результата.
Потом я снова попробовал использовать функцию BitBlt(...), но перед её вызовом делать так:
Так получались нужные мне изображения но не получалось самого эффекта плавного перехода, т.к. перед анимацией происходило мигание Notebook1.
Вот у меня и возник вопрос можно ли вообще это сделать.
Заранее спасибо за ответ.
Привет всем!
Есть такая задача:
Получить изображение(TBitMap) котрола(Наследник от TCustomControl) со всеми котролами которые находятся внутри него. При этом этот конторл не виден на экране, а находится на невидимой странице TNotebook. Надо получить точную копию того, что пользователь бы видел на экране, если бы этот котрол было видно.
Для чего это нужно:
Я хочу сделать эффект анимационного перехода между страницами TNotebook, для этого я получаю два изображения: текущую страницу и ну на которую хочу перейти и с помощью спец. процедуры делаю плавный эффект перехода.
Как я пробовал:
Первым делом я попробовал использовать функцию BitBlt(...), но она не дает изображение невидимого контрола.
Потом я попробовал использовать PaintTo(...), но и тут не получил желаемого результата.
Потом я снова попробовал использовать функцию BitBlt(...), но перед её вызовом делать так:
Код:
...
Notebook1.PageIndex:= 0;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 1;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 0;
Notebook1.UpDate;
BitBlt(...);
...
Notebook1.PageIndex:= 1;
Notebook1.UpDate;
BitBlt(...);
...
Так получались нужные мне изображения но не получалось самого эффекта плавного перехода, т.к. перед анимацией происходило мигание Notebook1.
Вот у меня и возник вопрос можно ли вообще это сделать.
Заранее спасибо за ответ.
А что если перписать контрол TNotebook: его обработчик прорисовки переопределить. Я так полагаю, при переключении страниц контрола можно 1) получить старое изображение страницы, 2) отрисовать в буфер новую страницу, 3) запустить процедуру анимации с известнами битмапиками 8)
Цитата:
Originally posted by hardcase
А что если перписать контрол TNotebook: его обработчик прорисовки переопределить. Я так полагаю, при переключении страниц контрола можно 1) получить старое изображение страницы, 2) отрисовать в буфер новую страницу, 3) запустить процедуру анимации с известнами битмапиками 8)
А что если перписать контрол TNotebook: его обработчик прорисовки переопределить. Я так полагаю, при переключении страниц контрола можно 1) получить старое изображение страницы, 2) отрисовать в буфер новую страницу, 3) запустить процедуру анимации с известнами битмапиками 8)
Так сделать не получится, потому что TNotebook не рисует компоненты, а при переключении страниц только показывает нужную страницу и скрывает все остальные.
Ура товарищи! :)
Вот только что за пол часа накатал процедуру, для того чтобы нарисовать компонент на 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;
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;
Вроде всё работает!
:)