with Form1 do
bitblt(Image1.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, ClientWidth-Width+GetSystemMetrics(SM_CYFRAME)+BorderWidth, ClientHeight-Height+GetSystemMetrics(SM_CYFRAME)+BorderWidth, SRCCOPY);
При копировании экрана не захватывается окно со свойством FormStyle = fsStayOnTop.
BitBlt (bm.Canvas.Handle, 0, 0, Width, Height, WinDC, Left, Top, SRCCOPY)?
Пример нормальной работы: нажатие клавиши PrtScr копирует это окно.
Спасибо!
Цитата: dmitry_12_08_1973
Как скопировать окно со свойством FormStyle = fsStayOnTop при копировании экрана функцией
BitBlt (bm.Canvas.Handle, 0, 0, Width, Height, WinDC, Left, Top, SRCCOPY)?
Пример нормальной работы: нажатие клавиши PrtScr копирует это окно.
Спасибо!
BitBlt (bm.Canvas.Handle, 0, 0, Width, Height, WinDC, Left, Top, SRCCOPY)?
Пример нормальной работы: нажатие клавиши PrtScr копирует это окно.
Спасибо!
Нет. Со fsStayOnTop все в порядке. Оно копируется. (Кстати, а как вы получаете WinDC?)
Другое дело, если свойство формы AlphaBlend равно истине. Тогда уже таким способом окно не скопируется.
Спасибо, да, на самом деле при AlphaBlend = true окно не копируется. Подскажите, пожалуйста, как скопировать окно в этом случае (при AlphaBlend = true)
Другой вариант - попробовать послать окну WM_PRINT с hdc битмапа. В этом случае, опять таки окно должно поддерживать обработку данного сообщения.
Цитата: dmitry_12_08_1973
Спасибо, да, на самом деле при AlphaBlend = true окно не копируется. Подскажите, пожалуйста, как скопировать окно в этом случае (при AlphaBlend = true)
не может быть. должно копироваться. моя программа своё окно копирует так:
Код:
Цитата: kosfiz
не может быть. должно копироваться. моя программа своё окно копирует так:
Код:
with Form1 do
bitblt(Image1.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, ClientWidth-Width+GetSystemMetrics(SM_CYFRAME)+BorderWidth, ClientHeight-Height+GetSystemMetrics(SM_CYFRAME)+BorderWidth, SRCCOPY);
bitblt(Image1.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, ClientWidth-Width+GetSystemMetrics(SM_CYFRAME)+BorderWidth, ClientHeight-Height+GetSystemMetrics(SM_CYFRAME)+BorderWidth, SRCCOPY);
Все верно. Только вы в вашей программе копируете именно это окно, а автору, насколько я понял, надо скопировать весь экран.
мда, чуток проглядел.
Код:
procedure ScreenShot(x : integer; y : integer; Width : integer; Height :
integer; bm : TBitMap);
const
CAPTUREBLT = $40000000;
var
dc: HDC; lpPal : PLOGPALETTE;
begin
{test width and height}
if ((Width = 0) OR (Height = 0)) then exit;
bm.Width := Width;
bm.Height := Height;
{get the screen dc}
dc := GetDc(0);
if (dc = 0) then exit;
{do we have a palette device?}
if (GetDeviceCaps(dc, RASTERCAPS) AND
RC_PALETTE = RC_PALETTE) then
begin
{allocate memory for a logical palette}
GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
{zero it out to be neat}
FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
{fill in the palette version}
lpPal^.palVersion := $300;
{grab the system palette entries}
lpPal^.palNumEntries :=
GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then
begin
{create the palette}
bm.Palette := CreatePalette(lpPal^);
end;
FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;
{copy from the screen to the bitmap}
BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SRCCOPY OR CAPTUREBLT);
{release the screen dc}
ReleaseDc(0, dc);
end;
integer; bm : TBitMap);
const
CAPTUREBLT = $40000000;
var
dc: HDC; lpPal : PLOGPALETTE;
begin
{test width and height}
if ((Width = 0) OR (Height = 0)) then exit;
bm.Width := Width;
bm.Height := Height;
{get the screen dc}
dc := GetDc(0);
if (dc = 0) then exit;
{do we have a palette device?}
if (GetDeviceCaps(dc, RASTERCAPS) AND
RC_PALETTE = RC_PALETTE) then
begin
{allocate memory for a logical palette}
GetMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
{zero it out to be neat}
FillChar(lpPal^, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)), #0);
{fill in the palette version}
lpPal^.palVersion := $300;
{grab the system palette entries}
lpPal^.palNumEntries :=
GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then
begin
{create the palette}
bm.Palette := CreatePalette(lpPal^);
end;
FreeMem(lpPal, sizeof(TLOGPALETTE) + (255 * sizeof(TPALETTEENTRY)));
end;
{copy from the screen to the bitmap}
BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,x,y,SRCCOPY OR CAPTUREBLT);
{release the screen dc}
ReleaseDc(0, dc);
end;
Спасибо, kosfiz, попробовал ваш последний вариант - работает!