AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

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

51自学网 2015-08-30 http://www.wanshiok.com

  接收程序:

  则要在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;
}

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

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:也谈制作系统托盘程序  下一篇:谈对话框的动画弹出和动画消隐