Страница: 1 |
Страница: 1 |
Вопрос: Как сделать снимок экрана ???
Добавлено: 24.08.07 19:29
Автор вопроса: Pro100Vlad
Как сделать снимок экрана и сохранить его в (bmp или jpeg) ???
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 24.08.07 20:47
BMP
#include <stdio.h>
PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp){
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;
// Retrieve the bitmap color format, width, and height.
GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);
// Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;
// Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.)
if (cClrBits != 24) pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits));
// There is no RGBQUAD array for the 24-bit-per-pixel format.
else pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));
// Initialize the fields in the BITMAPINFO structure.
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24) pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
// If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB;
// Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98/Me, the width must be WORD aligned unless the
// bitmap is RLE compressed.
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;
return pbmi;
}
void CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC){
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
 WORD dwTotal; // total count of bytes
 WORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
 WORD dwTmp;
pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS);
// Create the .BMP file.
hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD);
// Copy the BITMAPFILEHEADER into the .BMP file.
WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL);
// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, NULL);
// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);
// Close the .BMP file.
CloseHandle(hf);
// Free memory.
GlobalFree((HGLOBAL)lpBits);
}
void main(int argc, char *argv[]{
int sx = GetSystemMetrics(SM_CXSCREEN), sy = GetSystemMetrics(SM_CYSCREEN);
HDC hDC = GetDC(GetDesktopWindow());
HDC MyHDC = CreateCompatibleDC(hDC);
HBITMAP hBMP = CreateCompatibleBitmap(hDC, sx, sy);
SelectObject(MyHDC, hBMP);
LOGBRUSH MyBrush;
MyBrush.lbStyle = BS_SOLID;
MyBrush.lbColor = 0xFF0000;
HBRUSH hBrush = CreateBrushIndirect(&MyBrush);
RECT MyRect = {0, 0, sx, sy};
FillRect(MyHDC, &MyRect, hBrush);
BitBlt(MyHDC, 0, 0, sx, sy, hDC, 0, 0, SRCCOPY);
if(argc==2) CreateBMPFile(argv[1], CreateBitmapInfoStruct(hBMP), hBMP, MyHDC);
for(int i=0; i<argc; i++) printf("Argument #%d: %s\n", i, argv[i];
printf("esktop DC = %d\nHBITMAP hBMP = %d", (int)hDC, (int)hBMP);
}
Номер ответа: 2
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #2
Добавлено: 25.08.07 14:26
Как всегда
Номер ответа: 3
Автор ответа:
Mesnik
Вопросов: 3
Ответов: 29
Профиль | | #3
Добавлено: 25.08.07 16:41
Шарп много текста но не сюда .Откуда человек спрашівающий такие вещи может знать C++ а ише перевести все ето на свой язык
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 25.08.07 17:25
Если человек не способен заметить в коде на любом языке названия API-функций, по которым можно гуглить и мсднить, то человеку никто не поможет.
Номер ответа: 5
Автор ответа:
Alexandrus
ICQ: 496782368
Вопросов: 18
Ответов: 312
Web-сайт:
Профиль | | #5
Добавлено: 25.08.07 18:37
Ну вот по заявкам радиослушателей на своём языке)
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Const SM_CXSCREEN = 0 'X Size of screen
Const SM_CYSCREEN = 1 'Y Size of Screen
Const SM_CYBORDER = 6
Private Const SM_CYCAPTION = 4
Dim freevalue As Variant
Private Sub getdesk()
Dim hwndSrc As Long
Dim dwRop As Long
Dim hSrcDC As Long
dwRop = &HCC0020
hwndSrc = GetDesktopWindow()
hSrcDC = GetDC(hwndSrc)
freevalue = BitBlt(StdPicture.hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), hSrcDC, 0, 0, dwRop)
freevalue = ReleaseDC(hwndSrc, hSrcDC)
Pictures.Picture = StdPicture.Image
End Sub
Private Sub Command1_Click()
getdesk
SavePicture Pictures.Picture, "c:\111.bmp"
End Sub
Полностью работоспособный код...
Добавляем на форму 2 PictureBox и одну кнопку(Pictures и StdPicture и Command1)
С мелочами думаю разберёшься...
Номер ответа: 6
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #6
Добавлено: 25.08.07 19:55
Sharp, когда я впервые увидел код С++, я упал в обморок. Только потом привык, и уже что-то понял. Но ведь многие незнают даже основы С++ (типа int p. Так что по себе не судят.
P.S. Помните, у меня был вседостающий вопрос "Запомнить BitBlt"? Мне как-раз нужен был этот код, но мне опять же отправляли примеры на С.
Номер ответа: 7
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #7
Добавлено: 26.08.07 02:02
Не нравится, пиши на .NET. А раз выбрал VB6, буть добр уметь читать msdn, в котором, о боже, все примеры на C++!
Номер ответа: 8
Автор ответа:
Pro100Vlad
Вопросов: 4
Ответов: 11
Профиль | | #8
Добавлено: 26.08.07 22:30
Pictures.Picture = StdPicture.Image
эта строчка не работает.
сохраняет серый рисунок.
Номер ответа: 9
Автор ответа:
Alexandrus
ICQ: 496782368
Вопросов: 18
Ответов: 312
Web-сайт:
Профиль | | #9
Добавлено: 27.08.07 21:03
StdPicture.AutoRedraw=true
Номер ответа: 10
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #10
Добавлено: 28.08.07 21:46
Ну Шарп у нас такой
А смысл ему тогда искать в MSDN, если там все примеры почти на C++? Да и в примере чистый api находится. Знай переводи объявления на vb и чуток переписывай код под синтаксис vb6.