`
dpr905ds
  • 浏览: 18983 次
社区版块
存档分类
最新评论

C++加载位图和SOCKET通信的编写

 
阅读更多

C++加载位图和SOCKET通信的编写
2010年06月02日
  将屏幕信息转换为位图结构
  CDC *pDeskDC=GetDesktopWindow()->GetDC();//获取桌面的额画图对象
  int width=300;
  int height=300;
  CDC memDC;//定义一个内存画布
  memDC.CreateCompatibleDC(pDeskDC);//创建一个兼容的画布
  CBitmap bmp;
  bmp.CreateCompatibleBitmap(pDeskDC,width,height);//创建兼容位图
  memDC.SelectObject(&bmp);//选中位图对象
  memDC.BitBlt(0,0,width,height,pDeskDC,0,0,SRCCOPY);//将屏幕信息绘制到位图中
  。。。。
  char* pData=new char[bitmap,bmWidthBytes* bitmap,bmHeight];//分配内存,存储位图的实际数据
  //获取位图的实际数据
  ::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,pBInfo,DIB_RGB_COLORS);
  // 客户端SOCKET通信
  #include "Winsock2.h"
  #pragma comment(lib,"Ws2_32.lib");
  // 连接库文件
  WSDATA data;
  WSAStartup(2,&data);//初始化套接字
  hostent* phost=gethostbyname("");//获取本机信息
  char* localIP=inet_ntoa(*(struct in_addr*)*phost->h_addr_list);//获取IP地址
  sockaddr_in addr;
  //定义一个套接字地址
  addr.sin_addr.S_un.S_addr=inet_addr(localIP);//设置IP地址
  addr.sin_port=htons(5001);//设置端口号
  m_Socket=socket(AF_INET,SOCK_DGRAM,0);//创建UDP套接字
  if(m_Socket==INVALID_SOCKET)
  {
  MessageBox("套接字创建失败");
  //如果套接字创建失败,弹出对话框
  }
  char*len="512";
  if(setsockopt(m_Socket,SQL_SOCKET,SO_SNDBUF,len,4)!=0)
  {
  MessageBox("设置失败");
  }
  if(bind(m_Socket,(sockeaddr*)&addr,sizeof(addr))==SOCKET_ERROR)//绑定套接字
  {
  MessageBox("套接字绑定失败");
  }
  char* len="512";
  if(setsockopt(m_Socket,SOL_SOCKET,SO_SNDBUF,len,4)!=0)
  {//设置套接字发送缓冲区大小
  MessageBox("设置失败");
  }
  if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr)==SOCKET_ERROR)//绑定套接字
  {MessageBox("套接字绑定失败");
  }
  在创建成功后可以调用sendto方法发送数据。
  sendto(m_Socket,pPackage,packsize,0,(sockaddr*)&addr,sizeof(addr));
  ////////////////////////////////////////////////////////////////////////////////////////////
  主窗体设计
  hostent* phost=gethostbyname("");
  char* localIP=inet_ntoa(*(struct in_addr*)*phost->h_addr_list);//获取IP地址
  sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.sin_addr.S_addr=inet_addr(localIP);
  addr.sin_port=htons(5002);
  m_Socket=socket(AF_INET,SOCK_DGRAM,0);
  if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr)==SOCKET_ERROR)//绑定套接字
  {
  MessageBox("套接字绑定失败");
  }
  /////////////////////////////////////////////
  sockaddr_in addr;//定义网络地址
  addr.sin_family=AF_INET;//设置网络地址类型
  addr.sin_port=htons(m_ClientPort);//设置网络端口号
  addr.sin_addr.S_un.S_addr=inet_addr(m_ClientIP.GetBuffer(0));//设置IP
  int size=sizeof(addr);//获取地址大小
  char* pData="Confirm";//定义发送的信息
  sendto(m_Socket,pData,8,0,(socketaddr*)&addr,size);//发送数据
  atoi()将编辑文本转换为整数。
  CFont newFont,*oldFont;
  //声明新字体对象,和旧字体对象。
  gameFrame::gameFrame()
  {
  Rect rect;
  Create(NULL,"绘图窗口");
  //建立窗口
  CClientDC dc(this);将DC的数据映射到窗口
  int width=dc.GetDeviceCaps(HORZRES);//取得屏幕区的宽度
  int height=dc.GetDeviceCaps(VERTRES);//取得屏幕区的高度
  GetWindowRect(&rect);//取得窗口区矩形的大小
  width=(width-(rect.right-rect.left))/2;
  height=(height-(rect.bottom-rect.top))/2;
  MoveWindow(width,//移动窗口位置
  height,
  (rect.right-rect.left),
  (rect.bottom-rect.top),
  true);
  //在这里建立Cfont类对象newFont
  newFont.CreateFont(100,50,50,0,100,
  TRUE,TRUE,FALSE,
  DEFAULT_CHARSET,
  OUT_CHARCTER_PRECIS,
  CLIP_DEFAULT_PRECIS,
  DEFAULT_QUALITY,
  FIXED_PITCH|FF_MODERN,
  "楷体");
  }
  //////////////////////////////////////
  LoadImage()//加载位图
  CPaintDC dc(this);//建立响应WM_PAINT消息的DC
  CDC *mdc=new CDC;
  //声明内存dc
  CBitmap * bitmap=new CBitmap;//声明CBitmap位图对象
  mdc->CreateCompatibleDC(&dc);//建立于dc兼容的DC
  bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"/bground.bmp",
  IMAGE_BITMAP,500,400,LR_LOADFROMFILE);//加载位图
  mdc->SelectObject(bitmap);//将位图对象指定到mdc中
  //镂空原理的和运算与或运算。
  OnPaint()
  {
  CPaintDC dc(this);
  mdc->SelectObject(bgbmp);//取得背景图
  //贴上背景图
  dc.BitBlt(0,0,rect,right,rect.bottom,mdc,0,0,SRCCOPY);
  mdc->SelectObject(bitmap);//取得原位图
  //将蒙版与背景图做AND运算
  dc.BitBlt(250,150,104,154,mdc,104,0,SRCAND);
  //将要镂空的图与背景图做OR运算
  dc.BitBlt(250,150,104,154,mdc,0,0,SRCPAINT);
  }
  //服务器端SOCKET
  BOOL CServerDlg::OnInitDialog()
  {
  //获取本机IP
  hostent* phost=gethostbyname("");
  char* localIP=inet_ntoa(*(struct in_addr *)*phost->h_addr_list);
  sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.sin_addr.S_un.S_addr=inet_addr(localIP);
  addr.sin_port=htons(5002);
  //创建套接字
  m_Socket=socket(AF_INET,SOCK_DGRAM,0);
  if(m_Socket==INVALID_SOCKET);
  {
  MessageBox("套接字创建失败");
  }
  //绑定套接字
  if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
  {
  MessageBox("套接字绑定失败");
  }
  m_BmpData=new char[1024*1024*2];
  memset(m_BmpData,0,1024*1024*2);
  m_TempData=new char[1024*1024*2];
  memset(m_TempData,0,1024*1024*2);
  m_Header=m_BmpData;
  WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVEDM,FD_READ);
  m_ShowBmp=FALSE;
  m_BmpSize=0;
  m_RecSize=0;
  m_ClientPort=0;
  CServerApp* pApp=(CServerApp*)AfxGetApp();
  CString sql="select * from tb_ClientInfo";
  pAp->m_DataManage.m_pRecord->CusorLocation=adUseServer;
  pApp->m_DataManage.m_pRecord->Open((_bstr_t)sql,pApp->m_DataManage.m_pConnect.GetInterfacePtr(),adOpenKeyset,adLockOptimistic,adCmdText);
  m_ClientIP="";
  if(pApp->m_DataManage.m_pRecord->RecordCount>0)
  {
  m_ClientIP=(char*)(_bstr_t)pApp->m_DataManage.m_pRecord->GetFields()->GetItem(0L)->Value;
  }
  pApp->m_DtaManage.m_pRecord->Close();
  m_LeftTopX=0;
  m_LeftTopY=0;
  m_BK.SetWindowPos(NULL,0,0,305,305,SWP_NOMOVE);
  return TRUE;
  }
  void CServerDlg::OnReceived()
  {
  //接收数据
  char* buffer=new char[MAX_BUFF];
  sockaddr_in addr;
  int factsize=sizeof(sockaddr);
  int ret=recvfrom(m_Socket,buffer,MAX_BUFF,0,(sockaddr*)&addr,&factsize);
  if(ret!=-1)
  {CString recvIP=inet_ntoa(addr.sin_addr);
  if(recvIP!=m_ClinetIP)
  { delete []buffer;
  return;
  }
  m_ClientPort=ntohs(addr.sin_port);
  //记录接收的数据报大小
  m_RecvSize+=ret;
  //读取序号
  WORD orderID=*(WORD)&buffer[0];
  WORD endID=*(WORD)&buffer[2];
  //读取位图的大小
  int bmpsize=*(int*)&buffer[ret-12];
  //获取屏幕的X轴坐标
  m_LeftTopX=*(WORD*)&buffer[ret-8];
  //获取屏幕的Y轴坐标
  m_LeftTopY=*(WORD*)&buffer[ret-6];
  //读取结束标记
  sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.sin_port=htons(m_ClientPort);
  addr.sin_addr.S_un.S_addr=inet_addr(m_ClientIP.GetBuffer(0));
  int size=sizeof(addr);
  //发送确认信息
  char* pData="Confirm";
  sendto(m_Socket,pData,8,0,(sockaddr*)&addr,size);
  if(orderID==0)
  {m_BmpSize=bmpsize;
  m_BmpData=m_Header;
  }else
  m_BmpSize+=bmpsize;
  memcpy(m_BmpData,&buffer[4],bmpsize);
  m_BmpData=m_Header;
  }else
  m_BmpSize+=bmpsize;
  memcpy(m_BmpData,&buffer[4],bmpsize);
  m_BmpData+=bmpsize;
  m_ShowBmp=FALSE;
  if(endID==1)
  { m_ShowBmp=TRUE;
  m_BmpData=m_Header;
  memcpy(m_TempData,m_Header,1024*1024);
  ShowImage();
  m_RecSize=0;
  }
  }
  delete [] buffer;
  }
  void CServerDlg::OnButtonDown(UINT nID)
  {
  if(!m_ClinetIP.IsEmpty())
  {
  WORD x=m_LeftTopX;
  WORD y=m_LeftTopY;
  char buffer[4];
  sockaddr_in addr;
  addr.sin_family=AF_INET;
  addr.,sin_port=htons(m_ClinetPort);
  addr.sin_addr.S_un.S_addr=inet_addr(m_ClientIP.GetBuffer(0));
  int size=sizeof(addr);
  switch(nID)
  {
  case IDC_BTNDOWN:
  {
  y=m_LeftTopY+100;
  *(WORD*)&buffer[0]=x;
  *(WORD*)&buffer[2]=y;
  int ret=sendto(m_Socket,&buffer[0],4,0,(sockaddr*)&addr,size);
  break;
  }
  case IDC_BTUP:
  {y=m_LeftTopY-100;
  *(WORD*)&buffer[0]=x;
  *(WORD*)&buffer[2]=y;
  int ret=sendto(m_Socket,&buffer[0],4,0,(sockaddr*)&addr,size);
  break;
  }
  case IDC_BTLEFT:
  {
  x=m_LeftTopX-100;
  *(WORD*)&buffer[0]=x;
  *(WORD*)&buffer[2]=y;
  int ret=sendto(m_Socket,&buffer[0],4,0,(sockaddr*)&addr,size);
  break;
  }
  case IDC_BTRIGHT:
  {
  x=m_LeftTopX+100;
  *(WORD*)&buffer[0]=x;
  *(WORD*)&buffer[2]=y;
  int ret=sendto(m_SOcket,&buffer[0],4,0,(sockaddr*)&addr,size);
  break;
  }
  case IDC_BTRESTORE:
  {
  *(WORD*)&buffer[0]=0;
  *(WORD*)&buffer[2]=0;
  int ret=sendto(m_Socket,&buffer[0],4,0,(sockaddr*)&addr,size);
  break;
  }
  }
  }
  }
分享到:
评论

相关推荐

    自己做的MFC的socket局域网聊天工具

    MFC提供CImage类,可以用来加载、显示和处理位图文件。用户选择的头像可以被加载到CImage对象中,然后显示在聊天窗口或者用户资料上。头像的发送则与文件传输类似,只是数据类型不同,需要额外处理图像格式转换。 ...

    C++_Builder的60个编程资料

    - **知识点**:了解如何为C++ Builder项目添加签名。 - **示例代码**:不适用 #### 7. 环境变量设置 - **知识点**:学习如何在C++ Builder中配置和使用环境变量。 - **示例代码**: ```cpp setenv("ENV_VAR", ...

    中兴2011年大赛初试赛题

    **总结**:这两部分赛题考察了参赛者的GUI编程能力(如控件布局、交互设计)、网络通信协议(UDP单播和组播)、文件操作(如图片加载)以及软件工程实践(代码注释、文档编写)。通过这样的竞赛,学生能够提升实际...

    windows程序设计第五版chm附windowsAPI

    `DrawText`和`TextOut`函数用于在窗口上绘制文本,`BitBlt`进行位图的复制和绘制,而`LoadIcon`和`LoadCursor`则用于加载图标和光标资源。 3. **内存管理**:`GlobalAlloc`和`LocalAlloc`分配内存,`GlobalLock`和`...

    最佳入门VC教程

    4. **资源管理**:理解如何在VC项目中添加和管理资源,如图标、字符串和位图等。 5. **调试技巧**:学习如何使用Visual Studio的调试工具,定位和修复程序中的错误。 6. **文件操作**:介绍如何读写文件,包括文本...

    局域网主机屏幕监控

    Visual C++是微软开发的一款强大的集成开发环境(IDE),主要用于编写C++语言的应用程序。它集成了编译器、调试器和其他工具,支持Windows API,使得开发者可以方便地创建桌面应用程序,包括系统级软件和网络应用。 ...

    WIin32API帮助

    在VB(Visual Basic)和VC(Visual C++)编程中,使用Win32 API能实现许多基本控件无法完成的功能,如文件操作、系统控制、网络通信等。这份"Win32API帮助"压缩包很可能是为了协助开发者理解和使用这些API函数而编撰...

    fearning.rar_组合框控件_C++_

    在文件共享服务器部分,可能涉及到套接字编程,使用`winsock2.h`头文件和相关API(如`socket`, `bind`, `listen`, `accept`, `send`, `recv`等)来建立服务器端,监听客户端连接,接收和发送文件数据。此外,HTTP...

    VC++知识库、技巧、文章、实践大全

    学习如何使用CDC类(设备上下文类)进行绘图操作,如线条、矩形、圆、文字等,以及如何加载和显示位图文件,是图形编程的基础。 4. **ODBC**:Open Database Connectivity(开放数据库连接)是用于访问数据库的标准...

    vc 精华文摘-API篇

    9. **资源管理**:如LoadIcon、LoadCursor、LoadBitmap等函数,用于加载和使用程序资源,如图标、光标和位图等。 10. **设备上下文(Device Context,DC)**:DC是Windows API中用于图形输出的一种抽象,它包含了与...

    MFC 教程-李久进

    总结来说,MFC 是微软为 Windows 平台提供的一个强大的 C++ 开发框架,它通过封装 Win32 API,提供了一种面向对象的方式来编写 Windows 应用程序。MFC 的核心思想是抽象和封装,通过继承、消息映射等机制,让开发者...

    WIN32API程序设计示例

    7. **网络通信**:`WSAStartup`初始化Winsock库,`socket`创建套接字,`bind`绑定套接字到本地地址,`listen`设置服务器监听,`accept`接受连接,`send`和`recv`发送和接收数据。 8. **错误处理**:所有WIN32API...

    VC学习大纲 VC学习讲义

    - **Socket的原理**:Socket是网络通信的基础,它是应用程序与网络驱动程序之间的接口。 - **UDP与TCP的工作原理**:UDP是一种无连接协议,TCP则是面向连接的可靠传输协议。 - **连接库文件**:在网络编程中,需要...

    VC _6.0程序设计从入门到精通.rar

    10. **资源管理**:讲解如何在VC 6.0中添加、修改和使用资源,如位图、图标、字符串等。 11. **网络编程**:简单介绍网络编程的基本概念,如套接字(socket)编程,以及如何在VC 6.0中实现简单的网络通信。 12. **...

    win32 sdk手册

    6. **资源管理**:包括字符串、位图、图标等资源的加载和使用,以及资源脚本的编写。 7. **文件和注册表操作**:Win32 API提供了读写文件、处理目录、访问注册表等文件系统相关的函数。 8. **网络编程**:SDK还...

    C++程序员需具备知识.pdf

    - 学会使用Socket进行网络通信,包括TCP/IP与UDP协议的使用。 - **Web相关API** - 掌握使用Windows API进行Web开发的相关方法。 **2、进阶(Advance)** - **MFC/ATL** - **文档视图结构**:了解MFC框架中的...

    Videos12_Windows编程_

    同时,资源如位图、图标和对话框模板常被存储在资源文件中,可以通过LoadIcon、LoadBitmap等函数加载使用。 文件I/O在任何编程中都是重要的一部分。Windows提供了CreateFile、ReadFile、WriteFile等函数来读写文件...

Global site tag (gtag.js) - Google Analytics