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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2015, 15:21   #1
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию Присвоение bitmap из функции

Здравствуйте. Есть функция вида:

Код:
function get_screenshot(h:HWND):Tbitmap;
var
bmp:TBitmap;
begin
bmp:=TBitmap.Create;

  hSrcWnd := h;
  GetWindowRect(hSrcWnd, rcSrc);

  if (rcSrc.Right - rcSrc.Left < 170) and (rcSrc.Bottom - rcSrc.Top < 40) then
    begin
      ShowWindow(hSrcWnd, SW_SHOWNORMAL);
      sleep(100);
      GetWindowRect(hSrcWnd, rcSrc);
    end;

   hDC1:= GetDC(hSrcWnd);
   hSrcDC:=CreateCompatibleDC(hDC1);

   hBmp := CreateCompatibleBitmap(hDC1, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);

   SelectObject(hSrcDC, hBmp);

   PrintWindow(hSrcWnd, hSrcDC, 0);

   BitBlt(
     hDC1,
     0,
     0,
     rcSrc.right - rcSrc.left,
     rcSrc.bottom - rcSrc.top,
     hSrcDC,
     0,
     0,
     SRCCOPY);


   InvalidateRect(hSrcWnd,nil,false);

  bmp.Handle:=hbmp;
  {
   bmp.SaveToFile('table.bmp');
   }
  DeleteObject(hBmp);
  DeleteDC(hSrcDC);
  ReleaseDC(hSrcWnd, hDC1);

  Result:=bmp;
  //bmp.Free;

end;
Код:
Image3.Picture.Bitmap.Create;
Image3.Picture.Bitmap.Assign(get_screenshot(h));
Image3.Picture.Bitmap.FreeImage;
Если в функции поставить на проверку полученный скриншот (ширина, высота и т.д.) то все хорошо, можно из функции его сохранить в файл и загрузить в имейдж, но хочу избавится от работы с файлами.

При применении данной функции image3 остается пустым. Если загрузить в него предварительно изображение то при применении функции image3 остается неизменным.
DarkHacker вне форума Ответить с цитированием
Старый 11.01.2015, 17:24   #2
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

1) Среда?
2) Типы переменных где?
WinCoder вне форума Ответить с цитированием
Старый 11.01.2015, 17:31   #3
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

1. Delphi7
2.

Цитата:
var
rcSrc:Trect;
hSrcWnd:HWND;
hDC1:HDC;
hSrcDC:HDC;
hBmp:HBITMAP ;
Bmp:TBitmap;
DarkHacker вне форума Ответить с цитированием
Старый 11.01.2015, 17:42   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

так тебе что надо со скриншотом сделать-то? если его в файл записывать не надо, раз ты хочешь избавиться от работы с файлами, тогда для чего скриншот?
у меня есть работающий пример, когда с экрана делается скриншот по указанным размерам, и сохраняется в файл JPG
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 11.01.2015, 17:44   #5
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Что надо делать с ним потом уже реализовано. Проблема только в том что описал, нужно переделать функцию таким образом чтобы она возвращала битмап. Именно по этому был реализован метод с файлом, так как не нашел решения данного вопроса.
Прошу помощи.
DarkHacker вне форума Ответить с цитированием
Старый 11.01.2015, 17:48   #6
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

так, моя наработка:
Код:
   DeskTopCanvas:=TCanvas.Create;
   MyJpeg:=TJpegImage.Create;
   //-----
   obl.Left:=0;
   obl.Top:=0;
   obl.Right:=1280;
   obl.Bottom:=800;
   //----- область записи ------------------------------------------------------
   img:=TBitmap.Create;
   img.Width:=obl.Right-obl.Left;//размер записывается в файл - само изображение+ белая область
   img.Height:=obl.Bottom-obl.Top;
   //-----
   bmp:=TBitmap.Create;
   bmp.Width:=obl.Right-obl.Left;//можно масштабировать выходное изображание, то есть не 1280x800, а 800x600
   bmp.Height:=obl.Bottom-obl.Top;
  DeskTopCanvas.Handle:=GetWindowDC(GetDeskTopWindow);
   img.Canvas.CopyRect(bmp.Canvas.ClipRect,DeskTopCanvas,obl);// вот тут получаем заветный BMP
   MyJpeg.Assign(img);
   MyJpeg.SaveToFile(Name);//а вот тут я для себя сохраняю в файл, если кому надо
   MyJpeg.Free;
      bmp.FreeImage;
      img.FreeImage;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 11.01.2015, 18:08   #7
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Код функции не менял. Далее сделал так.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image3.Picture.Bitmap.Assign(get_screenshot(form1.Handle));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image3.Picture.Bitmap := TBitMap.Create;
end;
Результат на картинке.
Изображения
Тип файла: jpg Безымянный.jpg (12.3 Кб, 116 просмотров)
WinCoder вне форума Ответить с цитированием
Старый 11.01.2015, 18:08   #8
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

NetSpace. Меня кажется не правильно поняли, мне нужно ФУНКЦИЮ переделать на возврат TBitmap (оно то есть, но я видимо неправильно использую), а не на использование непосредственно в главном коде.

WinCoder, а у меня ошибка "bitmap image is not valid"

Последний раз редактировалось DarkHacker; 11.01.2015 в 18:13.
DarkHacker вне форума Ответить с цитированием
Старый 11.01.2015, 18:16   #9
WinCoder
Заблокирован
 
Регистрация: 24.11.2014
Сообщений: 721
По умолчанию

Цитата:
а у меня ошибка "bitmap image is not valid"
Значит твой код не совпадает в моим, и дабы не гадать, где именно не совпадает, проект в студию.
WinCoder вне форума Ответить с цитированием
Старый 11.01.2015, 18:31   #10
DarkHacker
Форумчанин
 
Аватар для DarkHacker
 
Регистрация: 12.04.2008
Сообщений: 105
По умолчанию

Код совпадает, при чистом проекте все работает, спасибо. Значит проблема у меня в коде, код очень объемный не выложить.

Наверное проблема еще в подключенных модулях, почему-то автоматически подключается jpeg, даже если отключу...
Буду копать. Спасибо.
DarkHacker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПРИСВОЕНИЕ ID limon142 PHP 11 07.07.2014 09:52
присвоение значений vector в функции SAMOUCHKA Общие вопросы C/C++ 5 27.10.2012 07:42
Присвоение значений SilentM Общие вопросы C/C++ 4 15.09.2011 13:10
из-за чего появляется полоса (на скрине) при вставке BitMap в TImage? - Проблема с Bitmap Grey@2009 Мультимедиа в Delphi 2 02.01.2010 20:23
Присвоение ID artemavd БД в Delphi 2 20.04.2009 14:45