Hbitmap Copyscreentobitmap (LPRECT LPRECT)
{
HDC HSCRDC, hmemdc;//screen and memory device description table
Hbitmap hbitmap, holdbitmap;//bitmap handle
int NX, NY, nX2, ny2;//selected area coordinates
int nwidth, nheight;//bitmap width and height
int XSCRN, yscrn;//screen resolution
if (Isrectempty (LpRect))
return NULL;
HSCRDC = CreateDC ("DISPLAY", NULL, NULL, NULL);//Create a Device Description table for the screen
HMEMDC = CreateCompatibleDC (HSCRDC);//Create a compatible memory device description table for the Screen device description table
NX = lprect->left;
NY = lprect->top;
NX2 = lprect->right;
NY2 = lprect->bottom;
XSCRN = GetDeviceCaps (HSCRDC, horzres);//Get Screen horizontal Resolution
YSCRN = GetDeviceCaps (HSCRDC, vertres);
if (NX < 0)
NX = 0;
if (NY < 0)
NY = 0;
if (NX2 > Xscrn)
nX2 = XSCRN;
if (NY2 > Yscrn)
nY2 = YSCRN;
nwidth = Nx2-nx;
nheight = Ny2-ny;
Hbitmap = CreateCompatibleBitmap (HSCRDC, nwidth, nheight);//Create a bitmap that is compatible with the Screen Device description table
Holdbitmap = (hbitmap) SelectObject (HMEMDC, HBITMAP);//Select the new bitmap in the Memory Device description table
BitBlt (HMEMDC, 0, 0, nwidth, nheight, HSCRDC, NX, NY, srccopy);//Copy the screen Device description table to the Memory Device description table
Hbitmap = (hbitmap) SelectObject (HMEMDC, holdbitmap);//Get a handle to the screen bitmap
DeleteDC (HSCRDC);
DeleteDC (HMEMDC);
return hbitmap;
}
/*
lpFileName: Bitmap file name
*/
BOOL Savebitmaptofile (hbitmap hbitmap, LPSTR lpfilename)
{
HDC hdc;//Device Description Table
int ibits;//The number of bytes per pixel at the current display resolution
WORD wbitcount;//the number of bytes per pixel in the bitmap
DWORD dwpalettesize = 0, dwbmbitssize, dwdibsize, dwwritten;//palette size, bitmap data size, bitmap file size, number of bytes written to file
BITMAP bitmap;//Bitmap Property structure
Bitmapfileheader bmfhdr;//Bitmap File header
Bitmapinfoheader bi;//Bitmap Information header
Lpbitmapinfoheader lpbi;//pointing to bitmap information header structure
HANDLE FH, hdib;//definition file, allocating memory handle
Hpalette HPal, holdpal=null;//palette handle
Calculate the number of bytes per pixel in a bitmap file
HDC = CreateDC ("DISPLAY", NULL, NULL, NULL);
Ibits = GetDeviceCaps (hdc, Bitspixel) * GetDeviceCaps (hdc, PLANES);
DeleteDC (HDC);
if (ibits <= 1)
Wbitcount = 1;
else if (ibits <= 4)
Wbitcount = 4;
else if (ibits <= 8)
Wbitcount = 8;
else if (ibits <= 24)
Wbitcount = 24;
Else
Wbitcount = 32;
if (Wbitcount <= 8)
Dwpalettesize = (1 << wbitcount) * sizeof (RGBQUAD);//Calculate palette size
Set Bitmap information header structure
GetObject (hbitmap, sizeof (BITMAP), (LPSTR) &bitmap);
bi.bisize = sizeof (Bitmapinfoheader);
Bi.biwidth = Bitmap.bmwidth;
Bi.biheight = Bitmap.bmheight;
Bi.biplanes = 1;
Bi.bibitcount = Wbitcount;
Bi.bicompression = Bi_rgb;
bi.bisizeimage = 0;
Bi.bixpelspermeter = 0;
Bi.biypelspermeter = 0;
bi.biclrused = 0;
bi.biclrimportant = 0;
Dwbmbitssize = ((Bitmap.bmwidth * wbitcount + +)/+) * 4 * bitmap.bmheight;
Hdib = GlobalAlloc (ghnd, dwbmbitssize + dwpalettesize + sizeof (bitmapinfoheader));//Allocate memory for bitmap content
Lpbi = ( Lpbitmapinfoheader) GlobalLock (HDIB);
*LPBI = bi;
//Processing palette
HPal = (hpalette) getstockobject (Default_palette);
if (HPal)
{
HDC = GetDC (NULL);
Holdpal = SelectPalette (HDC, HPal, FALSE);
RealizePalette (HDC);
}
//Gets the new pixel value under the palette
GetDIBits (HDC, Hbitmap, 0, (UINT) Bitmap.bmheight, (LPSTR) LPBI + sizeof (bitmapinfoheader) + Dwpalettesize, (bitmapinfo*) LPBI, dib_rgb_colors);
if (holdpal)//Restore palette
{
SelectPalette (HDC, Holdpal, TRUE);
RealizePalette (HDC);
ReleaseDC (NULL, HDC);
}
//create bitmap file
fh = CreateFile (lpfilename, generic_write, 0, NULL, create_always, File_attribute_normal | File_flag_sequential_scan, NULL);
if (fh = = INVALID_HANDLE_VALUE)
return FALSE;
Set Bitmap file Header
Bmfhdr.bftype = 0x4d42;//File type: "BM"
dwdibsize = sizeof (Bitmapfileheader) + sizeof (Bitmapinfoheader) + dwpalettesize + dwbmbitssize;
bmfhdr.bfsize = dwdibsize;//bitmap File size
bmfhdr.bfreserved1 = 0;
Bmfhdr.bfreserved2 = 0;
Bmfhdr.bfoffbits = (DWORD) sizeof (Bitmapfileheader) + (DWORD) sizeof (Bitmapinfoheader) + dwpalettesize;
WriteFile (FH, (LPSTR) &bmfhdr, sizeof (Bitmapfileheader), &dwwritten, NULL);//write Bitmap file header
WriteFile (FH, (LPSTR) LPBI, Dwdibsize, &dwwritten, NULL);//write the remaining contents of the bitmap file
GlobalUnlock (HDIB);
GlobalFree (HDIB);
CloseHandle (FH);
return TRUE;
}
// ------------------------------------------------------------------------------------------------------------- ------------------- //
void Cmydlg::onbutton1 ()
{
Hbitmap Hbitmap, LPSTR lpfilename
Rect rect = {0, 0, 1900, 1000};
Hbitmap hbmp = Copyscreentobitmap (&rect);
Savebitmaptofile (hbmp, "a.bmp");
MessageBox ("Save bmp file Successful");
}
int Getencoderclsid (const wchar* format, clsid* pClsid)
{
UINT num = 0; Number of Image encoders
UINT size = 0; Size of the image encoder array in bytes
imagecodecinfo* pimagecodecinfo = NULL;
Getimageencoderssize (&num, &size);
if (size = = 0)
return-1; Failure
Pimagecodecinfo = (imagecodecinfo*) (malloc (size));
if (Pimagecodecinfo = = NULL)
return-1; Failure
Getimageencoders (num, size, pimagecodecinfo);
for (UINT j = 0; j < num; ++j)
{
if (wcscmp (PIMAGECODECINFO[J). MimeType, format) = = 0)
{
*pclsid = Pimagecodecinfo[j]. Clsid;
Free (pimagecodecinfo);
Return J; Success
}
}
Free (pimagecodecinfo);
return-1; Failure
}
void Savecurscreenjpg (LPCWSTR pszfilename, int xs, int ys, int quality)
{
HWND hwnd =:: GetDesktopWindow ();
HDC hdc = GETWINDOWDC (NULL);
int x = GetDeviceCaps (hdc, horzres);
int y = GetDeviceCaps (hdc, vertres);
Hbitmap hbmp =:: CreateCompatibleBitmap (hdc, x, y), hold;
HDC HMEMDC =:: CreateCompatibleDC (HDC);
Hold = (HBITMAP):: SelectObject (HMEMDC, hbmp);
BitBlt (HMEMDC, 0, 0, x, y, hdc, 0, 0, srccopy);
SelectObject (HMEMDC, hold);
Bitmap bit (XS, YS), Bit2 (hbmp, NULL);
Graphics g (&bit);
G.scaletransform (float) xs/x, (float) ys/y);
G.drawimage (&bit2, 0, 0);
CLSID Encoderclsid;
EncoderParameters encoderparameters;
Encoderparameters.count = 1;
Encoderparameters.parameter[0]. Guid = encoderquality;
Encoderparameters.parameter[0]. Type = Encoderparametervaluetypelong;
Encoderparameters.parameter[0]. NumberOfValues = 1;
Encoderparameters.parameter[0]. Value = &quality;
Getencoderclsid (L "Image/jpeg", &encoderclsid);
Bit. Save (pszFileName, &encoderclsid, &encoderparameters);
::D eleteobject (hbmp);
::D eleteobject (HMEMDC);
Return
}
// ------------------------------------------------------------------------------------------------------------- ------------------- //
Support for GDI + libraries is required for screenshot saving to JPG format
void Cmydlg::onbutton2 ()
{
Todo:add your control notification handler code here
Savecurscreenjpg (L "1.jpg", 1440, 900, 100);
}
[00011]-[2015-08-26]-[00]-[windows Programming---MFC screenshot--->bmp format--->jpg format]