- 浏览: 18983 次
-
最新评论
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;
}
}
}
}
发表评论
-
Windows PowerShell 2.0语言开发之脚本签名
2012-01-20 01:54 1074Windows PowerShell 2.0语言开 ... -
在Windows下安装Hadoop遇到的几个问题
2012-01-20 01:53 921在Windows下安装Hadoop遇到 ... -
1.7 --1.8 SDK-RMIOS
2012-01-20 01:53 13421.7 --1.8 SDK-RMIOS 2011年01月06 ... -
vs2008安装失败解决办法
2012-01-20 01:53 1193vs2008安装失败解决办法 2011年04月22日 由 ... -
Windows环境下设置Qt编译环境 - 关于Qt的静态链接库的配置和生成方法
2012-01-20 01:53 2305Windows环境下设置Qt编译环境 - 关于Qt的静态链接库 ... -
清晨随笔
2012-01-19 09:40 677清晨随笔 2011年12月28日 连做两个梦,都是关 ... -
这孩子,太有才了
2012-01-19 09:40 766这孩子,太有才了 19小时前 ... -
开心一笑
2012-01-19 09:40 587开心一笑 2010年01月15日 星期一到了……小英在交 ... -
一言既出,驷马难追
2012-01-19 09:40 643一言既出,驷马难追 2012年01月12日 ... -
Windows SDK笔记-2
2012-01-17 02:15 840Windows SDK笔记-2 2011年04月25日 ... -
Windows SDK
2012-01-17 02:15 975Windows SDK 2010年08月13日 微软每 ... -
Windows Phone 7 SDK 正式版本RTW
2012-01-17 02:15 865Windows Phone 7 SDK 正式版本RTW 20 ... -
Windows Phone 7 SDK
2012-01-17 02:15 924Windows Phone 7 SDK 2011年01月28 ... -
Ⅱ 留 拒绝酱油
2012-01-17 02:15 696Ⅱ ... -
C++ socket编程基础(理论篇)[转]
2012-01-15 21:52 776C++ socket编程基础(理论 ... -
C# Socket网络编程学习(1-->3)
2012-01-15 21:52 1415C# Socket网络编程学习(1-- ... -
C# Socket多线程编程实例
2012-01-15 21:52 818C# Socket多线程编程实例 ... -
java socket连接c/s (转)
2012-01-15 21:51 739java socket连接c/s (转) 2010年07月0 ...
相关推荐
MFC提供CImage类,可以用来加载、显示和处理位图文件。用户选择的头像可以被加载到CImage对象中,然后显示在聊天窗口或者用户资料上。头像的发送则与文件传输类似,只是数据类型不同,需要额外处理图像格式转换。 ...
- **知识点**:了解如何为C++ Builder项目添加签名。 - **示例代码**:不适用 #### 7. 环境变量设置 - **知识点**:学习如何在C++ Builder中配置和使用环境变量。 - **示例代码**: ```cpp setenv("ENV_VAR", ...
**总结**:这两部分赛题考察了参赛者的GUI编程能力(如控件布局、交互设计)、网络通信协议(UDP单播和组播)、文件操作(如图片加载)以及软件工程实践(代码注释、文档编写)。通过这样的竞赛,学生能够提升实际...
`DrawText`和`TextOut`函数用于在窗口上绘制文本,`BitBlt`进行位图的复制和绘制,而`LoadIcon`和`LoadCursor`则用于加载图标和光标资源。 3. **内存管理**:`GlobalAlloc`和`LocalAlloc`分配内存,`GlobalLock`和`...
4. **资源管理**:理解如何在VC项目中添加和管理资源,如图标、字符串和位图等。 5. **调试技巧**:学习如何使用Visual Studio的调试工具,定位和修复程序中的错误。 6. **文件操作**:介绍如何读写文件,包括文本...
Visual C++是微软开发的一款强大的集成开发环境(IDE),主要用于编写C++语言的应用程序。它集成了编译器、调试器和其他工具,支持Windows API,使得开发者可以方便地创建桌面应用程序,包括系统级软件和网络应用。 ...
在VB(Visual Basic)和VC(Visual C++)编程中,使用Win32 API能实现许多基本控件无法完成的功能,如文件操作、系统控制、网络通信等。这份"Win32API帮助"压缩包很可能是为了协助开发者理解和使用这些API函数而编撰...
在文件共享服务器部分,可能涉及到套接字编程,使用`winsock2.h`头文件和相关API(如`socket`, `bind`, `listen`, `accept`, `send`, `recv`等)来建立服务器端,监听客户端连接,接收和发送文件数据。此外,HTTP...
学习如何使用CDC类(设备上下文类)进行绘图操作,如线条、矩形、圆、文字等,以及如何加载和显示位图文件,是图形编程的基础。 4. **ODBC**:Open Database Connectivity(开放数据库连接)是用于访问数据库的标准...
9. **资源管理**:如LoadIcon、LoadCursor、LoadBitmap等函数,用于加载和使用程序资源,如图标、光标和位图等。 10. **设备上下文(Device Context,DC)**:DC是Windows API中用于图形输出的一种抽象,它包含了与...
总结来说,MFC 是微软为 Windows 平台提供的一个强大的 C++ 开发框架,它通过封装 Win32 API,提供了一种面向对象的方式来编写 Windows 应用程序。MFC 的核心思想是抽象和封装,通过继承、消息映射等机制,让开发者...
7. **网络通信**:`WSAStartup`初始化Winsock库,`socket`创建套接字,`bind`绑定套接字到本地地址,`listen`设置服务器监听,`accept`接受连接,`send`和`recv`发送和接收数据。 8. **错误处理**:所有WIN32API...
- **Socket的原理**:Socket是网络通信的基础,它是应用程序与网络驱动程序之间的接口。 - **UDP与TCP的工作原理**:UDP是一种无连接协议,TCP则是面向连接的可靠传输协议。 - **连接库文件**:在网络编程中,需要...
10. **资源管理**:讲解如何在VC 6.0中添加、修改和使用资源,如位图、图标、字符串等。 11. **网络编程**:简单介绍网络编程的基本概念,如套接字(socket)编程,以及如何在VC 6.0中实现简单的网络通信。 12. **...
6. **资源管理**:包括字符串、位图、图标等资源的加载和使用,以及资源脚本的编写。 7. **文件和注册表操作**:Win32 API提供了读写文件、处理目录、访问注册表等文件系统相关的函数。 8. **网络编程**:SDK还...
- 学会使用Socket进行网络通信,包括TCP/IP与UDP协议的使用。 - **Web相关API** - 掌握使用Windows API进行Web开发的相关方法。 **2、进阶(Advance)** - **MFC/ATL** - **文档视图结构**:了解MFC框架中的...
同时,资源如位图、图标和对话框模板常被存储在资源文件中,可以通过LoadIcon、LoadBitmap等函数加载使用。 文件I/O在任何编程中都是重要的一部分。Windows提供了CreateFile、ReadFile、WriteFile等函数来读写文件...