SAMPLE: 用gdi+抓屏并存成.jpg文件 希望有人用的着。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两三年前写的#include <windows.h>#include <gdiplus.h>#include <stdio.h>using namespace Gdiplus;GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;int GetEncoderClsid(LPCWSTR format, CLSID* pClsid){ UINT num = 0; UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if(size == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if(pImageCodecInfo == NULL) return -1; 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; } } free(pImageCodecInfo); return -1;}// 参数// xs = 图象x轴大小// ys = 图象y轴大小// quality = jpeg图象质量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); } ::DeleteObject(hbmp); ::DeleteObject(hmemdc); return;}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ::SaveCurScreenJpg(L".\\cap.400.300.30.jpg", 400, 300, 30); ::SaveCurScreenJpg(L".\\cap.800.600.100.jpg", 800, 600, 100); ::SaveCurScreenJpg(L".\\cap.800.600.100.jpg", 640, 480, 50); GdiplusShutdown(gdiplusToken); return 0;} 如何从程序向外拖放文件 请问VC里的链表类怎么用?里面的数据是空的吗?只要加入自己的数据就可以了? 用打开文件对话框打开多个文件时怎么会有个数限制呢? 编一基于对话框的应用程序,此程序运行界面如下(图一),单击“确定”按钮后在编辑框中显示选择的复选按钮的结果。 如何用F5实现最小化窗口到系统托盘 为什么无的非模态对话框中的控制无效 如何循环执行命令?在线...... 谁能告诉我学了COM把潘的《原理》搞清楚有什么用??? 谁有ArcIMS4.0或ArcIMS3.1? SetTextColor为什么改变不了组框的文字颜色 关于ado调用存储过程的问题? 关于消息响应的弱问
#include <gdiplus.h>
#include <stdio.h>using namespace Gdiplus;GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;int GetEncoderClsid(LPCWSTR format, CLSID* pClsid)
{
UINT num = 0;
UINT size = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; 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;
}
} free(pImageCodecInfo);
return -1;
}
// 参数
// xs = 图象x轴大小
// ys = 图象y轴大小
// quality = jpeg图象质量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);
}
::DeleteObject(hbmp);
::DeleteObject(hmemdc);
return;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
::SaveCurScreenJpg(L".\\cap.400.300.30.jpg", 400, 300, 30);
::SaveCurScreenJpg(L".\\cap.800.600.100.jpg", 800, 600, 100);
::SaveCurScreenJpg(L".\\cap.800.600.100.jpg", 640, 480, 50);
GdiplusShutdown(gdiplusToken); return 0;
}