高分求助MFC图像处理方面的程序 图片显示socket 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看一天你就想学会MFC啊......就算给你讲一天,你也是不会的......房子不是一天就造成的,要耐心的花时间,按步骤学习,才能盖高楼。 额,虚心接受批评,boss要求周三给他演示下,我才出此下策,大神能给指点下吗,socket通信代码加哪,如果通知加载新的图片 哪儿都行啊。SOCKET还是CSocket什么的?服务端已经收到了还是两头都没写呢?这个怎么说呢,问得有点笼统。 不懂mfc,用api咯,条条大路通罗马 MFC刚上手,你就做这个。框架就够你喝一壶的。你还是控制台吧。或者APIDELPHI示例function TfrmScreen.CaptureScreen(AFileName:String;pressvalue: integer):string;varVBmp: TBitmap;MyJPEG:TJPEGImage;beginVBmp := TBitmap.Create;tryVBmp.Width := Screen.Width;VBmp.Height := Screen.Height;BitBlt(VBmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0,0, SRCCOPY);MyJPEG:=TJPEGImage.Create;MyJPEG.Assign(VBmp);MyJPEG.CompressionQuality:=pressvalue;MyJPEG.Compress;MyJPEG.SaveToFile('images\\'+inttostr(iName)+AFileName);mmoInfo.Lines.Add('images: '+inttostr(iName)+AFileName+' saved');imgeShow.Picture.LoadFromFile('images\\'+inttostr(iName)+AFileName);//Sleep(500);finallyMyJPEG.Free;VBmp.Free;end;end;procedure TfrmScreen.FormCreate(Sender: TObject);beginiName:=1;end;procedure TfrmScreen.tmr1Timer(Sender: TObject);begin//调用格式:CaptureScreen(文件名称,压缩比例(数值越大约清晰))Inc(iName);CaptureScreen('00.jpg',300);end;procedure TfrmScreen.N1Click(Sender: TObject);begin tmr1.Enabled:=True; frmScreen.Text:='开始屏幕观察';end;procedure TfrmScreen.N2Click(Sender: TObject);begin tmr1.Enabled:=False; frmScreen.Text:='暂停屏幕观察';end; API 示例#include<windows.h> HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage) ; BOOL CapScreen(LPTSTR FileName);//截屏函数 HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage) { BITMAP bm; BITMAPINFOHEADER bi; LPBITMAPINFOHEADER lpbi; DWORD dwLen; HANDLE hDib; HANDLE handle; HDC hdc; //不支持BI_BITFIELDS类型 if( dwCompression == BI_BITFIELDS ) return NULL; //如果调色板为空,则用默认调色板 if (hPal==NULL) hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE ); //获取位图信息 GetObject(bitmap,sizeof(bm),(LPSTR)&bm); //初始化位图信息头 bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bm.bmWidth; bi.biHeight = bm.bmHeight; bi.biPlanes = 1; bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel; bi.biCompression = dwCompression; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; //计算信息头及颜色表大小 int ncolors = (1 << bi.biBitCount); if( ncolors> 256 ) ncolors = 0; dwLen = bi.biSize + ncolors * sizeof(RGBQUAD); // we need a device context to get the dib from hdc = GetDC(NULL); hPal = SelectPalette(hdc,hPal,FALSE); RealizePalette(hdc); //为信息头及颜色表分配内存 hDib = GlobalAlloc(GMEM_FIXED,dwLen); if (!hDib){ SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); return NULL; } lpbi = (LPBITMAPINFOHEADER)hDib; *lpbi = bi; //调用 GetDIBits 计算图像大小 GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight, (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS ); bi = *lpbi; //图像的每一行都对齐(32bit)边界 if (bi.biSizeImage == 0){ bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight; if (dwCompression != BI_RGB) bi.biSizeImage = (bi.biSizeImage * 3) / 2; } //重新分配内存大小,以便放下所有数据 dwLen += bi.biSizeImage; if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE)) hDib = handle; else{ GlobalFree(hDib); //重选原始调色板 SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); return NULL; } //获取位图数据 lpbi = (LPBITMAPINFOHEADER)hDib; //最终获得的DIB BOOL bgotbits = GetDIBits( hdc, bitmap, 0L, //扫描行起始处 (DWORD)bi.biHeight, //扫描行数 (LPBYTE)lpbi //位图数据地址 + (bi.biSize + ncolors * sizeof(RGBQUAD)), (LPBITMAPINFO)lpbi, //位图信息地址 (DWORD)DIB_RGB_COLORS); //颜色板使用RGB if( !bgotbits ) { GlobalFree(hDib); SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); return NULL; } SelectPalette(hdc,hPal,FALSE); ReleaseDC(NULL,hdc); *sizeimage=bi.biSizeImage; return hDib; } BOOL CapScreen(LPTSTR FileName) { DWORD sizeimage; HDC hdc = CreateDC("SHOWSCREEN", NULL, NULL, NULL); HDC CompatibleHDC = CreateCompatibleDC(hdc); HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES)); SelectObject(CompatibleHDC, BmpScreen); BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY); HANDLE pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage); BITMAPFILEHEADER bfh; //设置位图信息头结构 bfh.bfType = ((WORD)('M'<< 8)|'B'); bfh.bfReserved1 = 0; bfh.bfReserved2 = 0; bfh.bfSize = 54+sizeimage; bfh.bfOffBits = 54; //创建位图文件 HANDLE hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); DWORD dwWrite; // 写入位图文件头 WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL); // 写入位图文件其余内容 WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL); DeleteDC(hdc); CloseHandle(CompatibleHDC); return true; } int main(void) { CapScreen("d:\\SnapScreen.bmp"); return 0; } DS3.2编译问题 请教一个loadframe添加框架的问题 404,哥不懂,求解释! 我写的一个ARP测试工具,有几个问题,希望高手能帮忙。 在CMainFrame类里如何调用View类的方法??? 代理客户端技术 新手求教: 我想做 USB驱动开发,但不知从何处入手,请有经验的人给指点一下? ?请教高手(急需)如何实现点击这个图片区域响应消息问题????? 如何锁定Dialog中的ListCtrl的栏目头宽度 如何编写手机程序? vc ++ 2010 新手,有没有高手愿意带一下啊?? 一个客户端连接多个服务端,通过与服务端连接的socket获取服务端的ip
就算给你讲一天,你也是不会的......
房子不是一天就造成的,要耐心的花时间,按步骤学习,才能盖高楼。
服务端已经收到了还是两头都没写呢?这个怎么说呢,问得有点笼统。
function TfrmScreen.CaptureScreen(AFileName:String;pressvalue: integer):string;
var
VBmp: TBitmap;
MyJPEG:TJPEGImage;
begin
VBmp := TBitmap.Create;
try
VBmp.Width := Screen.Width;
VBmp.Height := Screen.Height;
BitBlt(VBmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0,0, SRCCOPY);
MyJPEG:=TJPEGImage.Create;
MyJPEG.Assign(VBmp);
MyJPEG.CompressionQuality:=pressvalue;
MyJPEG.Compress;MyJPEG.SaveToFile('images\\'+inttostr(iName)+AFileName);
mmoInfo.Lines.Add('images: '+inttostr(iName)+AFileName+' saved');
imgeShow.Picture.LoadFromFile('images\\'+inttostr(iName)+AFileName);//Sleep(500);
finally
MyJPEG.Free;
VBmp.Free;
end;
end;procedure TfrmScreen.FormCreate(Sender: TObject);
begin
iName:=1;
end;procedure TfrmScreen.tmr1Timer(Sender: TObject);
begin
//调用格式:CaptureScreen(文件名称,压缩比例(数值越大约清晰))
Inc(iName);
CaptureScreen('00.jpg',300);
end;procedure TfrmScreen.N1Click(Sender: TObject);
begin
tmr1.Enabled:=True;
frmScreen.Text:='开始屏幕观察';
end;procedure TfrmScreen.N2Click(Sender: TObject);
begin
tmr1.Enabled:=False;
frmScreen.Text:='暂停屏幕观察';
end;
#include<windows.h>
HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage) ;
BOOL CapScreen(LPTSTR FileName);//截屏函数
HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal,DWORD * sizeimage)
{
BITMAP bm;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
DWORD dwLen;
HANDLE hDib;
HANDLE handle;
HDC hdc;
//不支持BI_BITFIELDS类型
if( dwCompression == BI_BITFIELDS )
return NULL;
//如果调色板为空,则用默认调色板
if (hPal==NULL)
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );
//获取位图信息
GetObject(bitmap,sizeof(bm),(LPSTR)&bm);
//初始化位图信息头
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = bm.bmPlanes * bm.bmBitsPixel;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
//计算信息头及颜色表大小
int ncolors = (1 << bi.biBitCount); if( ncolors> 256 )
ncolors = 0;
dwLen = bi.biSize + ncolors * sizeof(RGBQUAD);
// we need a device context to get the dib from
hdc = GetDC(NULL);
hPal = SelectPalette(hdc,hPal,FALSE);
RealizePalette(hdc);
//为信息头及颜色表分配内存
hDib = GlobalAlloc(GMEM_FIXED,dwLen);
if (!hDib){
SelectPalette(hdc,hPal,FALSE);
ReleaseDC(NULL,hdc);
return NULL;
}
lpbi = (LPBITMAPINFOHEADER)hDib;
*lpbi = bi;
//调用 GetDIBits 计算图像大小
GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
(LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );
bi = *lpbi;
//图像的每一行都对齐(32bit)边界
if (bi.biSizeImage == 0){
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;
if (dwCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}
//重新分配内存大小,以便放下所有数据
dwLen += bi.biSizeImage;
if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
hDib = handle;
else{
GlobalFree(hDib);
//重选原始调色板
SelectPalette(hdc,hPal,FALSE);
ReleaseDC(NULL,hdc);
return NULL;
}
//获取位图数据
lpbi = (LPBITMAPINFOHEADER)hDib;
//最终获得的DIB
BOOL bgotbits = GetDIBits( hdc, bitmap,
0L, //扫描行起始处
(DWORD)bi.biHeight, //扫描行数
(LPBYTE)lpbi //位图数据地址
+ (bi.biSize + ncolors * sizeof(RGBQUAD)),
(LPBITMAPINFO)lpbi, //位图信息地址
(DWORD)DIB_RGB_COLORS); //颜色板使用RGB
if( !bgotbits )
{
GlobalFree(hDib);
SelectPalette(hdc,hPal,FALSE);
ReleaseDC(NULL,hdc);
return NULL;
}
SelectPalette(hdc,hPal,FALSE);
ReleaseDC(NULL,hdc);
*sizeimage=bi.biSizeImage;
return hDib;
}
BOOL CapScreen(LPTSTR FileName)
{
DWORD sizeimage;
HDC hdc = CreateDC("SHOWSCREEN", NULL, NULL, NULL);
HDC CompatibleHDC = CreateCompatibleDC(hdc);
HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES));
SelectObject(CompatibleHDC, BmpScreen);
BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);
HANDLE pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);
BITMAPFILEHEADER bfh;
//设置位图信息头结构
bfh.bfType = ((WORD)('M'<< 8)|'B');
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfSize = 54+sizeimage;
bfh.bfOffBits = 54;
//创建位图文件
HANDLE hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
DWORD dwWrite;
// 写入位图文件头
WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);
// 写入位图文件其余内容
WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL);
DeleteDC(hdc);
CloseHandle(CompatibleHDC);
return true;
}
int main(void)
{
CapScreen("d:\\SnapScreen.bmp");
return 0;
}