科技行者

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

知识库

知识库 安全导航

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

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

  • 扫一扫
    分享文章到微信

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

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

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

关键字: VC++ 制作 实时教学 工程

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

  为将数据以较快的速度从网络上发送出去,须使用Socket的异步通讯方式.异步方式在命令计算机将数据报发送出去后就立即返回,不用等数据发完,当数据发送完后计算机能自动产生一个消息,通知程序可以发送下一个数据报.该方式要求用户必须自己用CAsyncSocket类派生出一个新类,并且要重写OnSend函数,以便响应FD_WRITE网络事件,该事件在数据报已经全部从网络发送出去后产生,并会让计算机自动执行OnSend函数.因此在该函数中要有发送下一个数据报的命令.为了让对方收到数据报后知道这是第几个数据报,可在数据报首用一个数字标记编号,每次发送数据前采用JPEG无损压缩算法压缩数据,以提高传送速度。当一屏信息发送完后,就再截取下一屏信息发送.

  发送程序:

  发送程序先要在C++下用MFC AppWizard 建立一个基于dialog的目标工作空间,工程名为Netss在第二部必须选取Windows Socket支持.

  用MFC AppWizard建立基于dialog的目标工作空间后,在CNetssDlg派生类中加入以下程序,其中OnCreate的函数框架用ClassWizard响应WM_CREATE消息生成,里边做一些初始化操作,目的是当用户刚开始运行程序时能自动设置好环境,提高接收速度。

int i=0,ii,iii,xx,yy,b=1,pa=1000,bl=3840,eee=8192,bb;
short aa[350000];LPVOID pbit0=&aa[1000];
CDC wdc;CBitmap bmp1;CDC* pdc;char frame[5000];POINT pp;LPPOINT ppp=&pp;
void* pbuf=(void*)(&frame[0]);int *paa=(int*)pbuf;char *pf;short *pfi;
class mysocket:public CAsyncSocket //用CAsyncSocket类派生出新类mysocket
{public: void OnSend(int nErrorCode) //当上一个数据报已经发送完后自动执行该函数
{if(pa>307200) //如果发送完一屏信息,则截取下一屏信息
{pa=1000;
wdc.BitBlt(0,0,640,480,pdc,0,0,SRCCOPY); //把桌面图像复制到wdc的bmp1中
bmp1.GetBitmapBits(614400,pbit0); //获取图像信息
GetCursorPos(ppp); //获取鼠标位置
xx=ppp->x; yy=ppp->y;
for(ii=0;ii<10&&xx<640&&yy<480;ii++) //显示鼠标指针
for(iii=0;iii aa[(yy+ii)*640+iii+xx+1000]=31744;
}
pf=&frame[4];
pfi=(short*)(pf+1);
*paa=pa;
for(;pf<&frame[3836];) //JPEG压缩一个数据报
{*pf=0x00;
for(i=0;i<8;i=i+2)
{ if(aa[pa]==aa[pa-1]) //JPEG压缩
*pf=*pf|(0x40>>i);
else if(aa[pa]==aa[pa-640])
*pf=*pf|(0x80>>i);
else if(aa[pa]==aa[pa-641])
*pf=*pf|(0xc0>>i);
else
{*pfi=aa[pa];
pfi++;
}
pa++;
}
pf=(char*)pfi;
pfi=(short*)(pf+1);
}
CAsyncSocket::AsyncSelect(FD_WRITE); //允许对象socks继续响应FD_WRITE事件
CAsyncSocket::SendTo(pbuf,bl,1050,NULL,0); //把该段信息发送出去,发送bl=3840字节
}
};
mysocket socks;
int CNetssDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
socks.Create(2001,SOCK_DGRAM,FD_WRITE,NULL); //建立数据报Socket,端口号2001
socks.SetSockOpt(SO_BROADCAST,&b,sizeof(BOOL),SOL_SOCKET); //选择广播数据报
socks.SetSockOpt(SO_DONTROUTE,&b,sizeof(BOOL),SOL_SOCKET);
socks.SetSockOpt(SO_SNDBUF,&eee,sizeof(int),SOL_SOCKET); //设置发送缓冲区长度eee
socks.AsyncSelect(FD_WRITE); //允许对象socks响应FD_WRITE事件
static CWindowDC ddc(GetDesktopWindow()); //引用桌面窗口指针定义对象ddc
pdc=&ddc; //将指针pdc指向ddc
wdc.CreateCompatibleDC(pdc); //建立与ddc兼容的device context,
bmp1.CreateCompatibleBitmap(pdc,640,480); //建立与ddc兼容的位图
wdc.SelectObject(&bmp1); //选择bmp1
return 0;
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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