请教Socket接收bmp图片后如何在mfc的窗口上显示的问题

枕戈待旦勇往直前 2012-12-14 04:00:04
小弟在开发mfc应用程序时遇到一个问题,近半月没有解决,跪求指点……
 问题描述如:
 我在imageView.cpp文件的OnDraw(CDC* pDC)方法中,实现了 用socket接收舆过来的bmp图片并保存到本地(成功),但是想在 窗口上面显示我接收到的bmp图片,却一直未能成功
 socket连接的建立、图像数据的接收、及窗口上图像的显示 应该分别在不同的类里实现。彼此之间有接口,但是目前小弟还不太清楚如何实现。所以将功能全部置于imageView.cpp中的OnDraw(CDC* pDC)方法中实现
代码如下:

void CquickViewClientView::OnDraw(CDC* pDC)
{
//socket服务器端连接的代码
char bmpInfo[100]; //接收图像头部信息的结构体
BMP_Info bInfo;
int flag1 =recv(sockConn,bmpInfo,sizeof(bmpInfo), 0);
memcpy(&bInfo,bmpInfo,sizeof(bInfo));
//接收图像数据
unsigned char *pBmpBuf; //读入图像数据的指针
//char imgBuffer[435600]; //接收图像数据缓存
int dataSize=bInfo.lineByte*bInfo.bmpHeight;
pBmpBuf=new unsigned char[dataSize]; //接收图像数据缓存
int flag=0;
//flag =recv(sockConn,imgBuffer,sizeof(imgBuffer),0);
flag =recv(sockConn,(char*)pBmpBuf,dataSize,0);
        
if(flag>0) //判断有图像数据
{
……
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
//如果灰度图像,有颜色表,写入文件
if(bInfo.biBitCount==8)
fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
//写位图数据进文件
fwrite(pBmpBuf,bInfo.bmpHeight*lineByte,1,fp);
//fwrite(imgBuffer, bInfo.bmpHeight*lineByte,1,fp);
//关闭文件
fclose(fp);
          
//此处本地文件夹可以成功保存传输过来的bmp图片
StretchDIBits(pDC->GetSafeHdc(),0,0,bInfo.bmpWidth,bInfo.bmpHeight,0,0,bInfo.bmpWidth,bInfo.bmpHeight,pBmpBuf,(BITMAPINFO*)&head,DIB_RGB_COLORS,SRCCOPY);
//显示出来有问题?
         
//清除缓冲区
delete []pBmpBuf;
if(bInfo.biBitCount==8)
{
delete []bInfo.pColorTable;
}
}
}


请指点小弟些思路,谢谢
...全文
274 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Squall_zy 2012-12-17
  • 打赏
  • 举报
回复
在OnDraw中调用recv你也真敢,这是典型的违背“前端界面与后台代码分离”思想的做法。 何况OnDraw你根本就是你不可控的,想想我都头大。 接收是接收,显示是显示,分开吧。
弱水垂钓 2012-12-17
  • 打赏
  • 举报
回复
怀疑你的bitmapinfo没设置好
傻X 2012-12-17
  • 打赏
  • 举报
回复
只有当前视图显示的时候,需要用pDC入参的时候,那些内容可以封装成函数放入OnDraw之中。 Socket接收应该自己另外开个线程,以消息触发的形式通知UI界面绘制你收到的内容。 PS: 1.注意资源互斥 2.注意缓冲区大小
hurryboylqs 2012-12-16
  • 打赏
  • 举报
回复
不要放在OnDraw里接受数据,放到后台线程或者用windows 消息异步接受,接完再显示出来即可,哪怕是先保存成文件再显示也是可以的

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧