![]() |
|
|
![]()
|
|
| bloood |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2007 Репутация: нет Всего: нет |
Написано на borland turbo c++ 2006, проблемма состоит в том, что я не знаю как снимать не весь скрин экрана, а допустим только мною выделенную область, способом обозначения поля пикселей (длинна ширина) которые мне нужны, всё кроется в этом выражении: hdc=GetDC(NULL); ... Программа снимает скриншот экрана и записывает его на диск с:, это отрывок. Полностью прога из себя представляет окно с кнопкой для скриншота. В справке по Turbo c++, написано как делать, но я ничего не понял.. Помогите!!!
#include <iostream.h> #include <windows.h> #include <stdio.h> #include <vcl.h> #pragma hdrstop #include "SDIMain.h" #include "About.h" //--------------------------------------------------------------------- #pragma resource "*.dfm" TSDIAppForm *SDIAppForm; //--------------------------------------------------------------------- __fastcall TSDIAppForm::TSDIAppForm(TComponent *AOwner) : TForm(AOwner) { } //--------------------------------------------------------------------- void __fastcall TSDIAppForm::FileNew1Execute(TObject *Sender) { // Do nothing } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::FileOpen1Execute(TObject *Sender) { OpenDialog->Execute(); } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::FileSave1Execute(TObject *Sender) { SaveDialog->Execute(); } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::FileExit1Execute(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::HelpAbout1Execute(TObject *Sender) { AboutBox->ShowModal(); } //--------------------------------------------------------------------------- void __fastcall TSDIAppForm::TakeScreenShot(TObject *Sender) { keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); HBITMAP h; OpenClipboard(NULL); h = (HBITMAP)GetClipboardData(CF_BITMAP); CloseClipboard(); HDC hdc=NULL; FILE * fp=NULL; LPVOID pBuf=NULL; BITMAPINFO bmpInfo; BITMAPFILEHEADER bmpFileHeader; char* filename = "c:\\ScreenShot.bmp"; do { hdc=GetDC(NULL); // получение device context окна. если передаем NULL, то получаем dc для всегоэкрана ZeroMemory(&bmpInfo,sizeof(BITMAPINFO)); // заполняет указанную область нулями bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); if(bmpInfo.bmiHeader.biSizeImage<=0) bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8; if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL) { MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR); break; } bmpInfo.bmiHeader.biCompression=BI_RGB; GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS); if((fp = fopen(filename,"wb"))==NULL) { MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR); break; } bmpFileHeader.bfReserved1=0; bmpFileHeader.bfReserved2=0; bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage; // bmpFileHeader.bfType='MB'; // bmpFileHeader.bfType=short('M')*256 + short('B'); bmpFileHeader.bfType= 0x4D42; bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp); fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp); } while(false); if(hdc)ReleaseDC(NULL,hdc); if(pBuf) free(pBuf); if(fp)fclose(fp); } |
|||
|
||||
| AntonX |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 1.2.2006 Где: РФ Репутация: нет Всего: -1 |
Ты бы хоть объяснил, что за область такая, которую ты копировать хочешь.
Это некоторое окно, или просто часть экрана? если окно то в ф-ю:
вместо нуля нужно хендл этого окна писать,
а если часть экрана, то можно вырезать ее потом из вcего экрана. |
||||
|
|||||
| bloood |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 14.3.2007 Репутация: нет Всего: нет |
это часть экрана, как вырезать её????
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 24 Всего: 98 |
тупо BitBlt из dc... примеры ищи в поиске...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |