C++加载位图跟SOCKET通信的编写
//将屏幕信息转换为位图结构
CDC *pDeskDC=GetDesktopWindow()->GetDC();//获取桌面的额画图对象
int width=;
int height=;
CDC memDC;//定义一个内存画布
memDC.CreateCompatibleDC(pDeskDC);//创建一个兼容的画布
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDeskDC,width,height);//创建兼容位图
memDC.SelectObject(&bmp);//选中位图对象
memDC.BitBlt(,,width,height,pDeskDC,,,SRCCOPY);//将屏幕信息绘制到位图中
。。。。
char* pData=new char[bitmap,bmWidthBytes* bitmap,bmHeight];//分配内存,存储位图的实际数据
//获取位图的实际数据
::GetDIBits(memDC.m_hDC,bmp,,bitmap.bmHeight,pData,pBInfo,DIB_RGB_COLORS);
// 客户端SOCKET通信
#include "Winsock2.h"
#pragma comment(lib,"Ws2_32.lib");
// 连接库文件
WSDATA data;
WSAStartup(,&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();//设置端口号
m_Socket=socket(AF_INET,SOCK_DGRAM,);//创建UDP套接字
if(m_Socket==INVALID_SOCKET)
{
MessageBox("套接字创建失败");
//如果套接字创建失败,弹出对话框
}
char*len="";
if(setsockopt(m_Socket,SQL_SOCKET,SO_SNDBUF,len,)!=)
{
MessageBox("设置失败");
}
if(bind(m_Socket,(sockeaddr*)&addr,sizeof(addr))==SOCKET_ERROR)//绑定套接字
{
MessageBox("套接字绑定失败");
}
char* len="";
if(setsockopt(m_Socket,SOL_SOCKET,SO_SNDBUF,len,)!=)
{//设置套接字发送缓冲区大小
MessageBox("设置失败");
}
if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr)==SOCKET_ERROR)//绑定套接字
{MessageBox("套接字绑定失败");
}
//在创建成功后可以调用sendto方法发送数据。
sendto(m_Socket,pPackage,packsize,,(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();
m_Socket=socket(AF_INET,SOCK_DGRAM,);
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());//设置IP
int size=sizeof(addr);//获取地址大小
char* pData="Confirm";//定义发送的信息
sendto(m_Socket,pData,,,(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))/;
height=(height-(rect.bottom-rect.top))/;
MoveWindow(width,//移动窗口位置
height,
(rect.right-rect.left),
(rect.bottom-rect.top),
true);
//在这里建立Cfont类对象newFont
newFont.CreateFont(,,,,,
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,,,LR_LOADFROMFILE);//加载位图
mdc->SelectObject(bitmap);//将位图对象指定到mdc中
//镂空原理的和运算与或运算。
OnPaint()
{
CPaintDC dc(this);
mdc->SelectObject(bgbmp);//取得背景图
//贴上背景图
dc.BitBlt(,,rect,right,rect.bottom,mdc,,,SRCCOPY);
mdc->SelectObject(bitmap);//取得原位图
//将蒙版与背景图做AND运算
dc.BitBlt(,,,,mdc,,,SRCAND);
//将要镂空的图与背景图做OR运算
dc.BitBlt(,,,,mdc,,,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();
//创建套接字
m_Socket=socket(AF_INET,SOCK_DGRAM,);
if(m_Socket==INVALID_SOCKET);
{
MessageBox("套接字创建失败");
}
//绑定套接字
if(bind(m_Socket,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
MessageBox("套接字绑定失败");
}
m_BmpData=new char[**];
memset(m_BmpData,,**);
m_TempData=new char[**];
memset(m_TempData,,**);
m_Header=m_BmpData;
WSAAsyncSelect(m_Socket,m_hWnd,CM_RECEIVEDM,FD_READ);
m_ShowBmp=FALSE;
m_BmpSize=;
m_RecSize=;
m_ClientPort=;
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>)
{
m_ClientIP=(char*)(_bstr_t)pApp->m_DataManage.m_pRecord->GetFields()->GetItem(0L)->Value;
}
pApp->m_DtaManage.m_pRecord->Close();
m_LeftTopX=;
m_LeftTopY=;
m_BK.SetWindowPos(NULL,,,,,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,,(sockaddr*)&addr,&factsize);
if(ret!=-)
{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[];
WORD endID=*(WORD)&buffer[];
//读取位图的大小
int bmpsize=*(int*)&buffer[ret-];
//获取屏幕的X轴坐标
m_LeftTopX=*(WORD*)&buffer[ret-];
//获取屏幕的Y轴坐标
m_LeftTopY=*(WORD*)&buffer[ret-];
//读取结束标记
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());
int size=sizeof(addr);
//发送确认信息
char* pData="Confirm";
sendto(m_Socket,pData,,,(sockaddr*)&addr,size);
if(orderID==)
{m_BmpSize=bmpsize;
m_BmpData=m_Header;
}else
m_BmpSize+=bmpsize;
memcpy(m_BmpData,&buffer[],bmpsize);
m_BmpData=m_Header;
}else
m_BmpSize+=bmpsize;
memcpy(m_BmpData,&buffer[],bmpsize);
m_BmpData+=bmpsize;
m_ShowBmp=FALSE;
if(endID==)
{ m_ShowBmp=TRUE;
m_BmpData=m_Header;
memcpy(m_TempData,m_Header,*);
ShowImage();
m_RecSize=;
}
}
delete [] buffer;
}
void CServerDlg::OnButtonDown(UINT nID)
{
if(!m_ClinetIP.IsEmpty())
{
WORD x=m_LeftTopX;
WORD y=m_LeftTopY;
char buffer[];
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());
int size=sizeof(addr);
switch(nID)
{
case IDC_BTNDOWN:
{
y=m_LeftTopY+;
*(WORD*)&buffer[]=x;
*(WORD*)&buffer[]=y;
int ret=sendto(m_Socket,&buffer[],,,(sockaddr*)&addr,size);
break;
}
case IDC_BTUP:
{y=m_LeftTopY-;
*(WORD*)&buffer[]=x;
*(WORD*)&buffer[]=y;
int ret=sendto(m_Socket,&buffer[],,,(sockaddr*)&addr,size);
break;
}
case IDC_BTLEFT:
{
x=m_LeftTopX-;
*(WORD*)&buffer[]=x;
*(WORD*)&buffer[]=y;
int ret=sendto(m_Socket,&buffer[],,,(sockaddr*)&addr,size);
break;
}
case IDC_BTRIGHT:
{
x=m_LeftTopX+;
*(WORD*)&buffer[]=x;
*(WORD*)&buffer[]=y;
int ret=sendto(m_SOcket,&buffer[],,,(sockaddr*)&addr,size);
break;
}
case IDC_BTRESTORE:
{
*(WORD*)&buffer[]=;
*(WORD*)&buffer[]=;
int ret=sendto(m_Socket,&buffer[],,,(sockaddr*)&addr,size);
break;
}
}
}
}
---------------------------------
http://www.educity.cn/wenda/285572.html
C++加载位图跟SOCKET通信的编写的更多相关文章
- Android中加载位图的方法
Android中加载位图的关键的代码: AssetManager assets =context.getAssets(); //用一个AssetManager 对象来从应用程序包的已编译资源中为工程加 ...
- Direct2D开发:从资源加载位图
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...
- SharpDX之Direct2D教程II——加载位图文件和保存位图文件
本系列文章目录: SharpDX之Direct2D教程I——简单示例和Color(颜色) 绘制位图是绘制操作的不可缺少的一部分.在Direct2D中绘制位图,必须先利用WIC组件将位图加载到内存中,再 ...
- 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...
- Direct2D 加载位图
说明: 通过WIC从文件加载位图. 可缩放后加载到内存. 源码: HRESULT LoadImageFormFile( IWICImagingFactory *pWicFactory, ID2D1Re ...
- vs2010 单文档MFC 通过加载位图文件作为客户区背景
实现效果: 这个其实是一个非常常见的功能,大家都会考虑给自己简单的工程做一个背景界面.其实只要在view类中重载OnEraseBkgnd()这个函数就好了. 代码如下: BOOL CdddView:: ...
- windows程序设计 加载位图图片
现在网上随便下个jpg图片,用windows自带的画图工具打开,点击画图工具左上角,文件->另存为->选择bmp,点击保存,保存好后,就得到一张位图了. 得到的位图,位图的内存比原图片jp ...
- [Direct2D开发] 从资源加载位图
转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 Direct2D使用Windows图像处理组件 (WIC) 来加载位图.从文件加载位图的方法很简单,而且网上的教 ...
- Direct2D开发:MFC下从资源文件中加载位图
转载请注明出处:http://www.cnblogs.com/ye-ming 0X01 概述: 相对于GDI处理界面,Direct2D有得天独厚的优势,下图就是Direct2D与GDI的效果对比,wi ...
随机推荐
- js 复制粘贴功能记录
最近工作中需要在前端页面中使用代码完成剪贴板的读写,网上搜索了下相应的资料,记录下... 这个功能有两个办法一个是js方式,一个是使用flash 一.JS方法 1.复制 首先复制的过程分为两步曲,无论 ...
- RESTful api 与 Django的 restfulframework
RESTful api 与 Django的 restfulframework 1 restful api 的基本概念 一类的资源使用一个url,不同的操作通过 请求方式处理 api -- >&g ...
- Python正则表达式使用过程中的小细节
今天用Python写了个简单的爬虫程序,抓取虎扑篮球(nba.hupu.com)的首页内容,代码如下: #coding:gb2312 import urllib2, re webpage = urll ...
- Azure VM Scalable Sets -- 适用IAAS架构
1. 选择Virtual Machine scale set2. 选择resource manager(或创建最新)3. 基本信息配置4. 配置scale的参数(可伸缩的balance模型):VM最小 ...
- 【Android】SDK工具学习 - adb
ADB(Android Debug Bridge) 小白笔记 学习资料 adb简要介绍 adb 是一个 C/S 架构的命令行工具,主要由 3 部分组成: 运行在 PC 端的 Client : 可以通过 ...
- Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name “user-detail”
要把跟当前表相关的viewset定义出来 http://stackoverflow.com/questions/20550598/django-rest-framework-could-not-res ...
- django中的@login_required
转:http://www.cnblogs.com/ccorz/p/Django-zhong-loginrequired-yong-fa-jian-jie.html 1.网站开发时的登录需求: ===用 ...
- 阿里云服务器tomcat启动慢解决方案
yum -y install rng-tools( 熵服务) cp /usr/lib/systemd/system/rngd.service /etc/systemd/system v ...
- FastAdmin 出现慢的问题 (DB host)
FastAdmin 出现慢的问题 用户反馈断网后 FastAdmin 后台变慢. 而且是很多同事出现一样的现象. 查看了 runtime / log 里的日志,发现 DB 时间超过 20s. 经过群里 ...
- FastAdmin 在线命令生成时出错的分析
FastAdmin 在线命令生成时出错的分析 出错现象 版本环境 FastAdmin 版本:1.0.0.20180806_beta 在线命令插件版本:1.0.3 分析 2018-08-13 16:12 ...