科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用VC++制作实时教学工程

用VC++制作实时教学工程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本例是通过截取桌面图象,压缩并以广播数据报形式发送到各个机子。以便老师的演示可以让每个同学都可以看到

作者:梁晨宝 来源:yesky 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
接收程序:

  则要在C++下用MFC AppWizard建立一个单文档目标工作空间,也要使用Windows Socket支持.同样,为以较快的速度从网络上接收数据报,也要用异步方式.处理方法与发送程序相似,但要注意此时要响应的是FD_READ事件,该事件在网络上有数据报到达时发生,因此要重写的是OnReceive函数,该函数中要有从网络接收数据报的命令,并能根据数据报最后的数字编号判断这是第几个数据报,将收到的信息放到合适的地方.

  当把保存一屏信息的数据报全部收完后,就可用来把图像再现到屏幕上.处理方法与发送程序类似,不过我们一般希望再现的图像显示在用户窗口中,因此引用用户窗口指针定义CClientDC类对象sdc,代替发送程序中的ddc,再现时的处理与发送时相反,把从网络上收到的数据用bmp2的成员函数SetBitmapBits复制到位图bmp2中,再用sdc的成员函数BitBlt把bmp2中的图像显示在用户窗口中.

  接收程序代码: (设目标工作空间名为Netcc)

  用MFC AppWizard建立单文档目标工作空间后,在CNetccView派生类中加入以下程序,其中OnCreate函数框架用ClassWizard响应WM_CREATE消息生成,里边做一些初始化操作。

int i=0,a,b=1,bl=3840,eee=8192;short aa[350000],ff;LPVOID pbit0=&aa[1000];
DWORD dw=0;UINT nport=1050;CString name;char frame[5000];
void* pbuf=(void*)(&frame[0]);int *paa=(int*)pbuf;char *pf;short *pfi;
CDC wdc;CBitmap bmp2;CDC* pdc;
class mysocket:public CAsyncSocket //用CAsyncSocket类派生出新类mysocket
{public: void OnReceive(int nErrorCode) //当收到数据报后自动执行该函数
{CAsyncSocket::ReceiveFrom(pbuf,bl,name,nport,0); //从网络接收信息,接收bl=3840字节
pf=&frame[4];
pfi=(short*)(pf+1);
for(;pf<&frame[3836];) //JPEG解压缩一个数据报
{for(i=0;i<8;i=i+2)
{ff=(*pf)&(0xc0>>i); //JPEG解压缩
if(ff==(0x40>>i))
aa[*paa]=aa[(*paa)-1];
else if(ff==(0x80>>i))
aa[*paa]=aa[(*paa)-640];
else if(ff==(0xc0>>i))
aa[*paa]=aa[(*paa)-641];
else
{aa[*paa]=*pfi;
pfi++;
}
(*paa)++;
}
pf=(char*)pfi;
pfi=(short*)(pf+1);
}
if(*paa>307200) //重现图像
{bmp2.SetBitmapBits(614400,pbit0); //把pbit0指向的内存数据复制到bmp2中
pdc->BitBlt(0,0,640,480,&wdc,0,0,SRCCOPY); //把bmp2中图像复制到用户窗口中
}
}
};
mysocket sockc; //定义mysocket类对象sockc
int CNetccView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
sockc.Create(1050,SOCK_DGRAM,FD_READ,NULL); //建立数据报Socket,端口号2001
sockc.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET);
sockc.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET);
sockc.SetSockOpt(SO_RCVBUF,&eee,sizeof(int),SOL_SOCKET); //设置接收缓冲区长度eee
sockc.AsyncSelect(FD_READ); //允许对象sockc响应FD_READ事件
static CClientDC ddc(this);pdc=&ddc; //引用用户窗口指针定义对象ddc
wdc.CreateCompatibleDC(pdc); //建立与ddc兼容的device context
bmp2.CreateCompatibleBitmap(pdc,640,480); //建立与ddc兼容的位图
wdc.SelectObject(&bmp2);
*paa=1000;
return 0;
}

  使用方法,只需老师运行发送程序,学生运行接收程序就可以工作。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章