MFC下的socket编程实例.docx
- 文档编号:2930054
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:17
- 大小:19.91KB
MFC下的socket编程实例.docx
《MFC下的socket编程实例.docx》由会员分享,可在线阅读,更多相关《MFC下的socket编程实例.docx(17页珍藏版)》请在冰豆网上搜索。
MFC下的socket编程实例
MFCsocket编程
一,序言
大四了,这学期也没有课,实在无聊,这整天在寝室里面待着也实在无聊啊,于是就想起了实现一个网络的五子棋,
也算四对自己在VC++编程的一个熟练,同时以前对socket编程不是很了解,也可以通过这个机会学习加深.因为在编写
过程中自己遇到了一些问题,也通过了网络和书籍自己解决了,最后也想通过这篇文章和大家分享一些经验,希望对初
学socket编程的人有帮助.
二,五子棋设计
我们实在MFC中用单文档来完成我们的程序.
(1),我们定义一个二维数组来存储棋子:
Node[20][20],并且初始化全部为0,1表示是黑棋,-1表示是白棋,0表示没有下棋.
(2),定义一个类:
MySocket,该类继承于CSocket,用来实现服务器和客户端的通信
(3),还有其他一些变量,在开发过程需要在添加
三,具体实现
下面我们就一步一步的实现
1,建立工程
启动VisualC++6.0,在IDE中建立一个单文档的MFC工程(具体怎么实现,相信不大家都知道吧!
),但是要记住在建工程的时候
一定要选择WindowsSocket,假设我们建的工程名为:
FiveNodeChess
2,完成窗口
在ResourceView中的Dialog中右键->插入dialog,然后右键创建的Dialog->建立类向导->createnewclass,确定,为新建的dialog
创建一个类,这个Dialog将是我们的登陆窗口,类名:
LandDialog,如图(图-3)
然后在我们的Dialog上加上我们要用到的控件,如图(图-4),其中:
combbox控件是选择作为服务器还是客户端用的------m_combox
Edit控件是为输入ip地址用的----------------------m_ipEdit
然后在类向导中为combbox控件的CBN_SELENDCANCLE添加一个处理函数:
OnSelchangeComboType(),并向名:
LandDialog类中添加一个
bool变量tempStaute,用来保存选择服务器还是客户端的状态,OnSelchangeComboType()函数添加代码如下:
voidLandDialog:
:
OnSelchangeComboType()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
if(m_combox.GetCurSel()==1)
{
tempStaute=true;
}
else
{
tempStaute=false;
}
}
接着就是添加一些变量用来保存是服务器还是客户端,和IP地址,并将这些变量声明成static,同是将类LandDialog声明成CFiveNodeChessView类的友元类,方便后面使用变量.后面就是将dialog类在单文档中创建对象为登陆窗口.
3,创建一个MySocket类并继承于CSocket类,下面介绍在单文档中socket使用一般步骤:
(1)、假定你的工程名叫CA
(2)、在CA.CPP文件中加入
#include
(3)、在CAApp:
:
InitInstance中加入:
BOOLCCAApp:
:
InitInstance()
{
if(!
AfxSocketInit())
{
AfxMessageBox("IDP_SOCKETS_INIT_FAILED");
returnFALSE;
}
…………
}
(4)、增加一个CMySocket类,并且从CSocket类中派生
classCMySocket:
publicCSocket
{
………………
};
(5)、在CMySocket中增加变量:
CCAView*pView;
注意:
你在添加*pView时IDE会自动给你在CMySocket.h中添加:
#include"CCAView.h",将它删除
并在CMySocket定义之前加入
classCCAView;
classCMySocket:
publicCSocket
{
…………………………………………………………
}
并且在CMySocket.cpp中加入#include"CCAView.h"
(6)、在CCAView中加入变量CMySocketm_socket;并在CCAView.h和CCAView.cpp中加入#include"CCADoc.h"
(7)、在CCAView:
:
InitUpdate中初始化m_socket
m_socket.pView=this;
m_socket.Create(port,SOCK_DGRAM);
(8)、在CCAView中添加成员函数:
GetData()和SendData()
(9)、在CMySocket中加入虚函数【用ClassWazard添加】
voidCCAView:
:
OnReceive(intnErrorCode)
{
pView->GetData();
}
(10)、在CCAView的GetData()中添加:
{
m_socket.ReceiveFrom(………………)
MessageBox(..............);
}
(11)、在CCAView:
:
SendData()中添加:
{
SendTo(………………);
}
以上时在单文档中使用socket的一般步骤.
4,完成view中各种出了函数:
(1),添加create消息处理
//添加的一个create消息句柄
intCFiveNodeChessView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
Addyourspecializedcreationcodehere
//实现各种图片的载入
CClientDCdc(this);
m_dcMemo->CreateCompatibleDC(&dc);
m_dcTemp->CreateCompatibleDC(&dc);
CRectrect;
GetClientRect(&rect);
m_bmpMemo->CreateCompatibleBitmap(&dc,/*rect.Width(),rect.Height()*/1024,768);
m_dcMemo->SelectObject(m_bmpMemo);
m_bmpMap->m_hObject=:
:
LoadImage(NULL,"res\\bkground.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_bmpBlack->m_hObject=:
:
LoadImage(NULL,"res\\black.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
m_bmpWhite->m_hObject=:
:
LoadImage(NULL,"res\\white.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
DrawChessBoard();
return0;
}
(2),画棋盘函数
//实现画棋盘的功能
voidCFiveNodeChessView:
:
DrawChessBoard()
{
inti,j;
//绘制背景
BITMAPbmp;
m_bmpMap->GetBitmap(&bmp);
m_dcTemp->SelectObject(m_bmpMap);
intscreen_x=:
:
GetSystemMetrics(SM_CXSCREEN);
intscreen_y=:
:
GetSystemMetrics(SM_CYSCREEN);
for(i=0;i<=screen_x/bmp.bmWidth;i++)
{
for(j=0;j<=screen_y/bmp.bmHeight;j++)
{
m_dcMemo->BitBlt(i*bmp.bmWidth,j*bmp.bmHeight,bmp.bmWidth,bmp.bmHeight,
m_dcTemp,0,0,SRCCOPY);//把临时DC和内存DC相关联起来
}
}
//绘制棋盘
//m_nWidth+=20;
for(i=1;i<=20;i++)
{
for(j=1;j<=20;j++)
{
m_dcMemo->MoveTo(m_nWidth,m_nWidth*i);
m_dcMemo->LineTo(m_nWidth*20,m_nWidth*i);
m_dcMemo->MoveTo(m_nWidth*i,m_nWidth);
m_dcMemo->LineTo(m_nWidth*i,m_nWidth*20);
}
}
}
(3),画棋子函数
//实现画棋子的功能
voidCFiveNodeChessView:
:
DrawChess()
{
//绘制棋子
DrawChessBoard();
inti,j;
//CFiveNodeChessDoc*pDoc=GetDocument();
BITMAPbmp;
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
CRectrect=CRect((i+1)*m_nWidth-14,(j+1)*m_nWidth-14,
(i+1)*m_nWidth+14,(j+1)*m_nWidth+14);
if(Node[i][j]!
=0)
{
if(Node[i][j]==1)
{
m_bmpBlack->GetBitmap(&bmp);
m_dcTemp->SelectObject(m_bmpBlack);
:
:
TransparentBlt(m_dcMemo->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(),
m_dcTemp->m_hDC,0,0,bmp.bmWidth,bmp.bmHeight,
RGB(255,0,0));
//TransparentBlt使用需要中工程连接中加入msimg32.lib
}
elseif(Node[i][j]==-1)
{
m_bmpWhite->GetBitmap(&bmp);
m_dcTemp->SelectObject(m_bmpWhite);
:
:
TransparentBlt(m_dcMemo->m_hDC,rect.left,rect.top,rect.Width(),rect.Height(),
m_dcTemp->m_hDC,0,0,bmp.bmWidth
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC socket 编程 实例