MFC下的socket编程实例.docx

上传人:b****5 文档编号:2930054 上传时间:2022-11-16 格式:DOCX 页数:17 大小:19.91KB
下载 相关 举报
MFC下的socket编程实例.docx_第1页
第1页 / 共17页
MFC下的socket编程实例.docx_第2页
第2页 / 共17页
MFC下的socket编程实例.docx_第3页
第3页 / 共17页
MFC下的socket编程实例.docx_第4页
第4页 / 共17页
MFC下的socket编程实例.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

MFC下的socket编程实例.docx

《MFC下的socket编程实例.docx》由会员分享,可在线阅读,更多相关《MFC下的socket编程实例.docx(17页珍藏版)》请在冰豆网上搜索。

MFC下的socket编程实例.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1