20 Апрель 2024, 11:30:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости:
 
   Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Скриншот  (Прочитано 9173 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ray
Старожил
*****

Бонус: +3/-0
Offline Offline

Сообщений: 495


Researcher


Просмотр профиля
« : 11 Июнь 2007, 17:48:14 »

Надо было в моей программулине реализовать создание скриншота.
В нете во многих местах описывали как это сделать на Builder'e,в Visual'e на MFC,но все не то... Хотелось сделать в Visual'e без использования сторонних приблуд.
Сделал  :ab:
Может кому и пригодиться.Позже код выложу.
Записан

Одна голова - хорошо, а четыре руки быстрее!(с)
Ray
Старожил
*****

Бонус: +3/-0
Offline Offline

Сообщений: 495


Researcher


Просмотр профиля
« Ответ #1 : 11 Июнь 2007, 20:09:15 »

Вобщем вот сама функция.Может кому пригодиться.
Цитировать
void CaptureScreen(HWND window)
{
   //Получаем прямоугольную область экрана
   RECT windowRect;
  GetWindowRect(window,&windowRect);

   //Размеры битмэпа
   int bitmap_dx=windowRect.right-windowRect.left;
  int bitmap_dy=windowRect.bottom-windowRect.top;
   
   BITMAPINFOHEADER bmpInfoHeader;
   BITMAPFILEHEADER bmpFileHeader;
   BITMAP* pBitmap;
   
   bmpFileHeader.bfType=0x4d42;
   bmpFileHeader.bfSize=0;
  bmpFileHeader.bfReserved1=0;
  bmpFileHeader.bfReserved2=0;
  bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

   bmpInfoHeader.biSize=sizeof(bmpInfoHeader);
  bmpInfoHeader.biWidth=bitmap_dx;
  bmpInfoHeader.biHeight=bitmap_dy;
  bmpInfoHeader.biPlanes=1;
  bmpInfoHeader.biBitCount=24;
  bmpInfoHeader.biCompression=BI_RGB;
  bmpInfoHeader.biSizeImage=bitmap_dx*bitmap_dy*(24/8);
  bmpInfoHeader.biXPelsPerMeter=0;
  bmpInfoHeader.biYPelsPerMeter=0;
  bmpInfoHeader.biClrUsed=0;
  bmpInfoHeader.biClrImportant=0;
   
   BITMAPINFO info;
  info.bmiHeader=bmpInfoHeader;
   
   BYTE* memory;
   HDC winDC;
   winDC=GetWindowDC(window);
   HDC bmpDC;
   bmpDC=CreateCompatibleDC(winDC);
   HBITMAP bitmap=CreateDIBSection(winDC,&info,DIB_RGB_COLORS,(void**)&memory,NULL,0);//Создаем битмэп
   SelectObject(bmpDC,bitmap);//Выбираем в контекст битмэп
   BitBlt(bmpDC,0,0,bitmap_dx,bitmap_dy,winDC,0,0,SRCCOPY);
   ReleaseDC(window,winDC);
   
     OPENFILENAME ofn;//Указатель на структуру с данными инициализации диалогового окна
      char strFilter[]="Файлы данных *.bmp\0";
      char strFileName[MAX_PATH]="";
    memset(&ofn,0,sizeof(OPENFILENAME));//Обнуление ofn
    ofn.lStructSize=sizeof(OPENFILENAME);
    ofn.hwndOwner=window;
    ofn.lpstrFilter=strFilter;
    ofn.lpstrFile=strFileName;//Буфер для имени файла
    ofn.nMaxFile=MAX_PATH;//Размер файла
    ofn.lpstrInitialDir=NULL;
    ofn.Flags = OFN_SHOWHELP | OFN_OVERWRITEPROMPT;
    strcpy(strFileName,ofn.lpstrFile);
    GetSaveFileName(&ofn); //MessageBox(hwnd,"Невозможно сохранить файл","О программе...",MB_ICONINFORMATION);
    HANDLE hFile=CreateFile(ofn.lpstrFile,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
     if (hFile==INVALID_HANDLE_VALUE) return;
    DWORD dwWritten=0;
    WriteFile(hFile,&bmpFileHeader,sizeof(BITMAPFILEHEADER),&dwWritten,NULL);
    WriteFile(hFile,&bmpInfoHeader,sizeof(BITMAPINFOHEADER),&dwWritten,NULL);
    WriteFile(hFile,memory,bmpInfoHeader.biSizeImage,&dwWritten,NULL);
    CloseHandle(hFile);
}
Записан

Одна голова - хорошо, а четыре руки быстрее!(с)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.9 | SMF © 2006-2008, Simple Machines LLC