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

Ваш аккаунт

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

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

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

При копировании экрана не захватывается окно со свойством FormStyle = fsStayOnTop.

20K
07 июня 2009 года
dmitry_12_08_1973
22 / / 17.01.2008
Как скопировать окно со свойством FormStyle = fsStayOnTop при копировании экрана функцией
BitBlt (bm.Canvas.Handle, 0, 0, Width, Height, WinDC, Left, Top, SRCCOPY)?
Пример нормальной работы: нажатие клавиши PrtScr копирует это окно.
Спасибо!
288
08 июня 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: dmitry_12_08_1973
Как скопировать окно со свойством FormStyle = fsStayOnTop при копировании экрана функцией
BitBlt (bm.Canvas.Handle, 0, 0, Width, Height, WinDC, Left, Top, SRCCOPY)?
Пример нормальной работы: нажатие клавиши PrtScr копирует это окно.
Спасибо!



Нет. Со fsStayOnTop все в порядке. Оно копируется. (Кстати, а как вы получаете WinDC?)
Другое дело, если свойство формы AlphaBlend равно истине. Тогда уже таким способом окно не скопируется.

20K
22 июня 2009 года
dmitry_12_08_1973
22 / / 17.01.2008
Спасибо, да, на самом деле при AlphaBlend = true окно не копируется. Подскажите, пожалуйста, как скопировать окно в этом случае (при AlphaBlend = true)
303
23 июня 2009 года
makbeth
1.0K / / 25.11.2004
Как вариант - дергать изображение всего десктопа, а потом - вырезать нужную часть, где находится окно. Метод не подойдет, если окно, допустим, частично выходит за границы рабочего стола.
Другой вариант - попробовать послать окну WM_PRINT с hdc битмапа. В этом случае, опять таки окно должно поддерживать обработку данного сообщения.
257
23 июня 2009 года
kosfiz
1.6K / / 18.09.2005
Цитата: dmitry_12_08_1973
Спасибо, да, на самом деле при AlphaBlend = true окно не копируется. Подскажите, пожалуйста, как скопировать окно в этом случае (при AlphaBlend = true)


не может быть. должно копироваться. моя программа своё окно копирует так:

 
Код:
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);
288
24 июня 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: 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);



Все верно. Только вы в вашей программе копируете именно это окно, а автору, насколько я понял, надо скопировать весь экран.

257
24 июня 2009 года
kosfiz
1.6K / / 18.09.2005
мда, чуток проглядел.
257
24 июня 2009 года
kosfiz
1.6K / / 18.09.2005
а решение таки есть, конечно же, и дело все в палитре. привожу решение от Serhiy Perevoznyk
Код:
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;
20K
25 июня 2009 года
dmitry_12_08_1973
22 / / 17.01.2008
Спасибо, kosfiz, попробовал ваш последний вариант - работает!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог