Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2011, 00:30   #1
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию Скриншот форм

Нужно мне сделать скриншоты окон своей программы. Хотел было сделать так:
Код:
...
var
  DC: HDC;
  Frm: TForm;
  I: Integer;
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    for I := Pred(Screen.FormCount) to 0 do
    begin
      Frm := Screen.Forms[I];
      if not IsWindow(Frm.Handle) or not Frm.Visible then Continue;
    
      Bmp.Width := Frm.Width;
      Bmp.Height := Frm.Height;
      DC := GetWindowDC(Frm.Handle);
      try
        BitBlt(Bmp.Canvas.Handle, 0, 0, Frm.Width, Frm.Height, 0, 0, SrcCopy);
      finally
        ReleaseDC(Frm.Handle, DC);
      end;
      Bmp.SaveToFile('C:\Temp\screen' + IntToStr(I) + '.bmp');
    end;
  finally
    Bmp.Free;
  end;
end;
Однако как оказалось формы перекрытые другими формами он так и сохраняет. Можно было конечно перед BitBlt делать форме BringToFront, но так все мелькает да и не красивое решение.
Последовало предложение послать форме сообщение WM_PAINT, а в качестве контекста устройства задать HDC Bitmap'а. В MSDN написано что для сообщения WM_PAINT wParam и lParam не учитываются. А в инете видел что люди так делают.
Вопрос к знатокам, это работает или нет? (У меня Bitmap оказались пустые)
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 13.04.2011, 00:41   #2
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Господи, как же это сложно для среднестатистического ума - сделать поиск по фразе "скриншот"...
Или это только идиотам доступно ? Таким, как я..
Ну хорошо, а уже теперь, просто посмотреть в самый низ этой страницы - вас не затруднит ?
Или вы всегда действуете исключительно по приниципу моего любимого О.Бендера - "на блюдечке с голубой каемочкой" ?

Последний раз редактировалось asmodey1; 13.04.2011 в 00:45.
asmodey1 вне форума Ответить с цитированием
Старый 13.04.2011, 00:49   #3
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
Господи, как же это сложно для среднестатистического ума - сделать поиск по фразе "скриншот"...
Или это только идиотам доступно ? Таким, как я..
Ну хорошо, а уже теперь, просто посмотреть в самый низ этой страницы - вас не затруднит ?
Или вы всегда действуете исключительно по приниципу моего любимого О.Бендера - "на блюдечке с голубой каемочкой" ?
А вы уверены что внимательно прочитали мой пост?
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 13.04.2011, 01:21   #4
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от XeruH Посмотреть сообщение
А вы уверены что внимательно прочитали мой пост?
Абсолютно.
А вас что-то смущает? Или у вас затруднения с указанием координат ваших форм ?
Или у вас какие-то специфические затруднения ?
asmodey1 вне форума Ответить с цитированием
Старый 13.04.2011, 10:05   #5
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Для таких случаев специально предназначен WM_PRINT.
eduard93 вне форума Ответить с цитированием
Старый 13.04.2011, 11:54   #6
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от eduard93 Посмотреть сообщение
Для таких случаев специально предназначен WM_PRINT.
Пробывал и WM_PRINT, в результате появляется лишь рамка формы с заголовком.
Правильно заданный вопрос - половина ответа!
XeruH вне форума Ответить с цитированием
Старый 13.04.2011, 11:59   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Пробывал и WM_PRINT
Что значит "пробовал" ?
Его не "пробовать" нужно, а обрабатывать !
mss вне форума Ответить с цитированием
Старый 13.04.2011, 14:11   #8
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Код в студию.
eduard93 вне форума Ответить с цитированием
Старый 13.04.2011, 16:40   #9
XeruH
Форумчанин
 
Регистрация: 17.09.2010
Сообщений: 229
По умолчанию

Вот так работает.

Код:
  function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll';
...
procedure ScreenShotProg;
var
  Frm: TForm;
  I, wX, wY: Integer;
  Bmp: TBitmap;
  hBmp: HBITMAP;
  RC: TRect;
  hSrcDC, hSrcCompDC: HDC;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.Width := Screen.Width;
    Bmp.Height := Screen.Height;
    Bmp.Canvas.Brush.Color := clGray;
    Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);
    for I := Pred(Screen.FormCount) downto 0 do
    begin
      Frm := Screen.Forms[I];
      if not IsWindow(Frm.Handle) then Exit;

      GetWindowRect(Frm.Handle, RC);
      wX := RC.Right - RC.Left;
      wY := RC.Bottom - RC.Top;

      hSrcDC := GetWindowDC(Frm.Handle);
      try
        hSrcCompDC := CreateCompatibleDC(hSrcDC);
        try
          hBmp := CreateCompatibleBitmap(hSrcDC, wX, wY);
          try
            SelectObject(hSrcCompDC, hBmp);
            PrintWindow(Frm.Handle, hSrcCompDC, 0);
            BitBlt(Bmp.Canvas.Handle, RC.Left, RC.Top, wX, wY, hSrcCompDC, 0, 0, SRCCOPY);
          finally
            DeleteObject(hBmp);
          end;
        finally
          DeleteDC(hSrcCompDC);
        end;
      finally
        ReleaseDC(Frm.Handle, hSrcDC);
      end;
    end;
    Bmp.SaveToFile('имя_файла');
  finally
    Bmp.Free;
  end;
end;
Однако нельзя ли это реализовать проще?

Upd
+PrintWindow поддерживается только с WinXP
Правильно заданный вопрос - половина ответа!

Последний раз редактировалось XeruH; 13.04.2011 в 17:52.
XeruH вне форума Ответить с цитированием
Старый 13.04.2011, 19:45   #10
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Хм, еще можно использовать PaintTo. И кажется это будет работать и на более старых системах.
eduard93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скриншот в игре Marsik Общие вопросы Delphi 17 14.01.2014 03:03
Скриншот из сервиса Баламут Win Api 2 21.02.2011 06:52
Скриншот объекта Maxs Общие вопросы Delphi 6 07.05.2009 16:59
Скриншот ForzaJuve Win Api 13 05.10.2008 21:27