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

Ваш аккаунт

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

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

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

проблема с перекрыванием окон

6.8K
24 августа 2006 года
artemkaint
60 / / 12.07.2006
вообщем фишка такая....
пишется прога которая бирет с окна проги изображение и сует его в ави....
возникла проблема очень странного характера : если в процессе программы открыть другое окно с перекрыванием окна программы, то в ави запишется это перекрывание (т.е. кусок (причем соответственно именно тот что на месте искомого) другого окна)

ВАЙ???? какие предложения по устранению глюка...мож мысли есть...

у меня чувство что он бирет изображение не с окна , а с экрана....тада глюк понятен....но я ж не работаю с DC.....обычная канва компонента.....

могу кусок видео приклеить, если нужен...
339
27 августа 2006 года
verybadbug
619 / / 12.09.2005
попробуй использовать TWinControl.PaintTo
5
27 августа 2006 года
hardcase
4.5K / / 09.08.2005
DC открытого окна, контекст воспроизведения, и есть ни что иное, как прямоугольник на экране. Может с WM_PAINT поколдовать?
6.8K
28 августа 2006 года
artemkaint
60 / / 12.07.2006
хм...а может как-нить заставить операционку перекрывать окна, но оставлять связь с неактивным.....просто знаю...сам видел прогу...которая работает сама по себе...даже когда не активна, а нажмешь esc в другой программе - в ней сработает обработка Ескейпа)))) хотя по-моему это не выход....
6.8K
28 августа 2006 года
artemkaint
60 / / 12.07.2006
может как-нить привязаться рисованием к определенному окну...??? или именно это вы и имеете в виду???
6.8K
28 августа 2006 года
artemkaint
60 / / 12.07.2006
мож подкинете идей
339
29 августа 2006 года
verybadbug
619 / / 12.09.2005
Цитата:
..но я ж не работаю с DC.....обычная канва компонента.....


напиши процедуру, которой берёшь изображение окна....

6.8K
29 августа 2006 года
artemkaint
60 / / 12.07.2006
самым бональным способом


procedure Make
(
GetPicture_MakeAvi_THandle: THandle;
GetPicture_MakeAvi_Width_Picture: integer;
GetPicture_MakeAvi_Height_Picture:integer;
);

GetPicture_MakeAvi_TBitmap:= TBitmap.Create;
GetPicture_MakeAvi_TCanvas:= TCanvas.Create;
GetPicture_MakeAvi_TCanvas.Handle:= GetPicture_MakeAvi_THandle;
with GetPicture_MakeAvi_TBitmap do
begin
Width := GetPicture_MakeAvi_Width_Picture;
Height := GetPicture_MakeAvi_Height_Picture;
PixelFormat := pf24bit;
GetPicture_MakeAvi_TBitmap.Canvas.CopyRect
(
rect
(
0,
0,
GetPicture_MakeAvi_Width,
GetPicture_MakeAvi_Height
),
GetPicture_MakeAvi_TCanvas,
rect
(
0,
0,
GetPicture_MakeAvi_Width,
GetPicture_MakeAvi_Height
)
);
end;
303
29 августа 2006 года
makbeth
1.0K / / 25.11.2004
Нда.. Способ действительно банальный, но помогает, если окно не перекрывается. Немного матчасти :) Дело в том, что класс TCanvas - всего лишь "обертка" вокруг WinAPI функций работы с контекстом рисования Windows и не хранит буфер окна. Кроме того, Windows сама нигде не хранит буферов окон, а всегда перерисовывает их по необходимости (кроме тех случаев, когда это оправдано - например, сохраняется часть экрана под окном всплывающего меню). Соответственно, когда окно твоего приложения перекрывает другое окно, в часть буфера видеопамяти, занятый твоим окном рисуется другое "левое" окно, и при копировании с помощью CopyRect берется испорченный буфер.
Выход из данной ситуации - контекст в памяти, который создается с помощью CreateCompatibleDC/CreateCompatibleBitmap и рисование в него. Он уже является персональным буфером твоей программы. Кстати, таким образом реализовано antiflickering-перерисовка контролов VCL (свойство DoubleBuffered). Кроме того, verybadbug уже посоветовал решение -процедура PaintTo, которая работает по тому же принципу. Просто попробуй сделать такой вызов (вместо CopyRect):
 
Код:
<Form>.PaintTo(GetPicture_MakeAvi_TBitmap.Canvas, 0, 0);
<Form> - окно, с которого снимается изображение.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог