проблема с перекрыванием окон
пишется прога которая бирет с окна проги изображение и сует его в ави....
возникла проблема очень странного характера : если в процессе программы открыть другое окно с перекрыванием окна программы, то в ави запишется это перекрывание (т.е. кусок (причем соответственно именно тот что на месте искомого) другого окна)
ВАЙ???? какие предложения по устранению глюка...мож мысли есть...
у меня чувство что он бирет изображение не с окна , а с экрана....тада глюк понятен....но я ж не работаю с DC.....обычная канва компонента.....
могу кусок видео приклеить, если нужен...
попробуй использовать TWinControl.PaintTo
DC открытого окна, контекст воспроизведения, и есть ни что иное, как прямоугольник на экране. Может с WM_PAINT поколдовать?
хм...а может как-нить заставить операционку перекрывать окна, но оставлять связь с неактивным.....просто знаю...сам видел прогу...которая работает сама по себе...даже когда не активна, а нажмешь esc в другой программе - в ней сработает обработка Ескейпа)))) хотя по-моему это не выход....
может как-нить привязаться рисованием к определенному окну...??? или именно это вы и имеете в виду???
мож подкинете идей
Цитата:
..но я ж не работаю с DC.....обычная канва компонента.....
напиши процедуру, которой берёшь изображение окна....
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;
Выход из данной ситуации - контекст в памяти, который создается с помощью CreateCompatibleDC/CreateCompatibleBitmap и рисование в него. Он уже является персональным буфером твоей программы. Кстати, таким образом реализовано antiflickering-перерисовка контролов VCL (свойство DoubleBuffered). Кроме того, verybadbug уже посоветовал решение -процедура PaintTo, которая работает по тому же принципу. Просто попробуй сделать такой вызов (вместо CopyRect):
Код:
<Form>.PaintTo(GetPicture_MakeAvi_TBitmap.Canvas, 0, 0);