mfc网络编程实例源码_MFC源码

hacker|
74

文章目录:

【急求】mfc 实现串口编程的源代码

1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);

2.在项目中插入MSComm控件 选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。 选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),

这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。

3.利用ClassWizard定义CMSComm类控制对象 打开ClassWizard-Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。

4.在对话框中添加控件 向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties-Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。

再打开ClassWizard-Member Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。

5.添加串口事件消息处理函数OnComm() 打开ClassWizard-Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:

void CSCommTestDlg::OnComm()

{

// TODO: Add your control notification handler code here

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.

CString strtemp;

if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符

{ ////////以下你可以根据自己的通信协议加入处理代码

variant_inp=m_ctrlComm.GetInput(); //读缓冲区

safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量

len=safearray_inp.GetOneDimSize(); //得到有效数据长度

for(k=0;klen;k++)

safearray_inp.GetElement(k,rxdata+k);//转换为BYTE型数组

for(k=0;klen;k++) //将数组转换为Cstring型变量

{

BYTE bt=*(char*)(rxdata+k); //字符型

strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串

}

}

UpdateData(FALSE); //更新编辑框内容

}

到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:

6.打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:

// TODO: Add extra initialization here

if(m_ctrlComm.GetPortOpen())

m_ctrlComm.SetPortOpen(FALSE);

m_ctrlComm.SetCommPort(1); //选择com1

if( !m_ctrlComm.GetPortOpen())

m_ctrlComm.SetPortOpen(TRUE);//打开串口

else

AfxMessageBox("cannot open serial port");

m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位

m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据

m_ctrlComm.SetRThreshold(1);

//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0

m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

现在你可以试试程序了,将串口线接好后,打开串口调试助手,并将串口设在com2,选上自动发送,也可以等会手动发送。再执行你编写的程序,接收框里应该有数据显示了。

7.发送数据 先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard-Message Maps,选择类CSCommTestDlg,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:

void CSCommTestDlg::OnButtonManualsend()

{

// TODO: Add your control notification handler code here

UpdateData(TRUE); //读取编辑框内容

m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据

}

运行程序,在发送编辑框中随意输入点什么,单击发送按钮,我们通过把RS232的2.3两口短接,在一台电脑上显示串口的收发数据!

最后说明一下,由于用到VC控件,在没有安装VC的计算机上运行时要从VC中把mscomm32.ocx、msvcrt.dll、mfc42.dll拷到Windows目录下的System子目录中(win2000为System32)并再进行注册设置

mfc编程实例

我用的VC++2005,给你参考参考:

1,新建工程“MFC Application”,取名例如“Add”

2,按“next”

3,Application type下面选择“Dialog based”(基于对话框),按“finish”

4,展开左侧的目录,打开Add.rc下的IDD_ADD_DIALOG对话框

5,打开“toolbox”工具栏,点edit control,在对话框上面建三个edit control;再点一个button,在对话框上建一个按钮。各属性保持默认。

6,双击新建的那个按钮,会跳到AddDlg.cpp文件中的一个自动新建的函数“void CAddDlg::OnBnClickedButton1()”下,在其中添加代码:

::SetDlgItemInt(m_hWnd,IDC_EDIT3,(::GetDlgItemInt(m_hWnd,IDC_EDIT1,0,0) + ::GetDlgItemInt(m_hWnd,IDC_EDIT2,0,0)),0);

7,你在前两个编辑框中输入数字,按一下按钮,第三个框中就显示两数的和了。。。。。

《visual c++mfc编程实例》的源代码,不胜感激!

你要得是 MFC类库得源代码还是 里面每个实例得源代码?

类库得有卖得。实例部分一般没有源代码。

用mfc设计贪吃蛇游戏源代码,最好有解析

1.算法

1. 首先,用一个结构体数组来标记蛇的X位置和Y位置,还有每一节的方向。用一变量标识蛇的长度。

2. 在蛇非转弯的移动时用定时器来自动移动,不管蛇是哪种形状,都只需在每次移动时先将各节向后移动(蛇尾舍弃,新的蛇尾由蛇尾的上一节代替):如蛇本身为snake[0]到snake[3],就是将snake[0]到snake[2]一起移动到snake[1]到snake[3]: 将 snake[2]的XY坐标赋值snake[3]的XY坐标 ,snake[1]的XY坐标 赋值给snake[2]的XY坐标 ,snake[0]的XY坐标 赋值给snake[1]的XY坐标 。再判断蛇头的方向,然后将蛇头顺着这个方向向前移动一格就是蛇头snake[0]的XY坐标 。而蛇除蛇头外各节的方向由函数SetDirection()来确定(明显此种情况,蛇头的方向不变),SetDirection()的思想是根据蛇的每一节的前一节的相对位置来确定本节的方向。(其实这个函数是多余的,真正用到的只有蛇头的方向)。

3. 蛇在转弯时,也是各节一次向后移,蛇头的位置顺着转弯的方向移动,方向由转弯方向确定。

4. 蛇在吃到食物时,长度加一,蛇头的位置变成食物的位置,方向不变。蛇的本身每节的XY位置都向后移。如蛇本身为snake[0]到snake[3], 就是将snake[0]到snake[3]一起移动到snake[1]到snake[4]。

5. 基于对话框的应用程序,响应按键消息需在PreTranslateMessage里,而不是像文档视图模式那样在OnKeyDown里响应。

6. 每次蛇在转弯时只能有一种方向按键能响应,即要么左右转,要么上下转。蛇头方向向左或向右时,只能上下转;蛇头方向向上或向下时,只能左右转。

7. 食物的位置由rand函数随机产生。

2.添加如下函数和变量

1 void HuaFangGe(int bianChang, int gridShumu); //如在400*400的方格里绘制20*20个格子,则bianChang = 400;gridShumu = 20;

2 void InitSnackSite(); //初始化蛇的位置

3

4 int snakeLength; //表示蛇的长度

5 int foodX; //食物的X位置

6 int foodY; //食物的Y位置

7 bool start; //标志是否开始

8 bool reStart; //标志是否重新开始

9

10 struct SNAKE

11 {

12 int x;

13 int y;

14 char direction; //某位置的方向为前一个位置相对于该位置的方向,由SetDirection()确定

15 }snake[200];

16

17 void DrawRed(int x, int y); //指定点0*0到20*20,画相应颜色,下同(红头绿身蓝尾)

18 void DrawGreen(int x, int y);

19 void DrawBlue(int x, int y);

20 void DrawBlack(int x, int y); //根据SetFoodXY()所确定的foodX和foodY来画食物。

21

22 void DrawSnakeFood(); //根据数组snakeSite数组的标识信息类绘制蛇的形状位置颜色。

23 void SetFoodXY(); //随机绘制食物的XY位置

24

25 bool leftRight; //确定是否能上下走(蛇本身在上下走,再按上下就无用了)

26 bool upDown; //确定是否能左右走(蛇本身在左右走,再按左右就无用了)

27

28 void MoveSite(); //蛇移动过程中,设置“除蛇头”外各节的x和y的位置,顺序前移。

29 void SetDirection(); //蛇移动过程中,设置“除蛇头”外各节的方向

30

31 void TurnLeft(); //当蛇左转时

32 void TurnRight(); //当蛇右转时

33 void GoUp(); //当蛇向上时

34 void GoDown(); //当蛇向下时

可以参考这里:

【原创】基于MFC的 贪吃蛇 小游戏的实现,附源码下载

如何用MFC实现网络编程

     一. 客户端 

     1. 创建一个Dialog Based项目:CSockClient。 

     2. 设计对话框 

     去掉Ok和Cancle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量。 

     Control ID     Type         Member

     IDC_EDITMSG    CEdit       m_MSG

     IDC_LISTMSG    ClistBox    m_MSGS

     3. CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。

     由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下:以Public方式继承CAsyncSocket类,生成新类MySock;为MySock类添加虚函数OnReceive、OnConnect、OnSend。 

     4. 在MySock.ccp中添加以下代码 

     #include "CSockClient.h"

     #include "CSockClientDlg.h"

     5. 在MySock.h中添加以下代码 

     public:

     BOOL m_bConnected;    //是否连接

     UINT m_nLength;    //消息长度

     char m_szBuffer[4096]; //消息缓冲区

     6. 在MySock.ccp中重载各函数 

     MySock::MySock()

     {

         m_nLength=0;

         memset(m_szBuffer,0,sizeof(m_szBuffer));

         m_bConnected=FALSE;

     }

     MySock::~MySock()

     {

         //关闭套接字

     if(m_hSocket!=INVALID_SOCKET)

     Close();

     }

     void MySock::OnReceive(int nErrorCode) 

     {

         m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

         //下面两行代码用来获取对话框指针

     CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();

         CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd;

         pDlg- m_MSGS.InsertString(0,m_szBuffer);

         memset(m_szBuffer,0,sizeof(m_szBuffer));

         CAsyncSocket::OnReceive(nErrorCode);

     }

     void MySock::OnSend(int nErrorCode) 

     {

         Send(m_szBuffer,m_nLength,0);

         m_nLength=0;

         memset(m_szBuffer,0,sizeof(m_szBuffer));

         //继续提请一个“读”的网络事件,接收Server消息

     AsyncSelect(FD_READ);

         CAsyncSocket::OnSend(nErrorCode);

     }

     void MySock::OnConnect(int nErrorCode) 

     {

         if (nErrorCode==0)

         {

     m_bConnected=TRUE;

     CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp();

     CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd;

     memcpy(m_szBuffer,"Connected to ",13);

     strncat(m_szBuffer,pDlg- m_szServerAdr,

     sizeof(pDlg- m_szServerAdr));

     pDlg- m_MSGS.InsertString(0,m_szBuffer);

     AsyncSelect(FD_READ); ////提请一个“读”的网络事件,准备接收

         }

         CAsyncSocket::OnConnect(nErrorCode);

     }

     7. 新建对话框IDD_Addr,用来输入IP地址和Port;生成新类CAddrDlg。增加两个Edit控件:IDC_Addr、IDC_Port按下表在ClassWizard中为CAddrDlg类添加变量。 

     Control ID    Type    Member

     IDC_Addr    CString    m_Addr

     IDC_Port    Int        m_Port

     8. 在CSockClientDlg.ccp中添加代码: 

     #include "AddrDlg.h"

     protected:

         int TryCount;

         MySock m_clientSocket;

         UINT m_szPort;

     public:

         char m_szServerAdr[256];    

     9. 双击IDD_CSOCKCLIENT_DIALOG对话框中的“连接”按钮,添加以下代码: 

     void CCSockClientDlg::OnConnect() 

     {

         m_clientSocket.ShutDown(2);

         m_clientSocket.m_hSocket=INVALID_SOCKET;

         m_clientSocket.m_bConnected=FALSE;

         CAddrDlg m_Dlg;

         //默认端口1088

     m_Dlg.m_Port=1088;

         if (m_Dlg.DoModal()==IDOK  !m_Dlg.m_Addr.IsEmpty())

         {

     memcpy(m_szServerAdr,m_Dlg.m_Addr,sizeof(m_szServerAdr));

     m_szPort=m_Dlg.m_Port;

     //建立计时器,每1秒尝试连接一次,直到连上或TryCount10

     SetTimer(1,1000,NULL);

     TryCount=0;

         }

     }

     10. 添加Windows消息WM_TIMER响应函数OnTimer 

     void CCSockClientDlg::OnTimer(UINT nIDEvent) 

     {

         if (m_clientSocket.m_hSocket==INVALID_SOCKET)

         {

     BOOL bFlag=m_clientSocket.Create(0,SOCK_STREAM,FD_CONNECT);

     if(!bFlag)

     {

         AfxMessageBox("Socket Error!");

         m_clientSocket.Close();

         PostQuitMessage(0);

         return;

     }

         }

         m_clientSocket.Connect(m_szServerAdr,m_szPort);

         TryCount++;

         if (TryCount =10 || m_clientSocket.m_bConnected)

         {    

     KillTimer(1);

     if (TryCount =10)

         AfxMessageBox("Connect Failed!");

     return;

         }

         CDialog::OnTimer(nIDEvent);

     }

     11. 双击IDD_CSOCKCLIENT_DIALOG对话框中的“发送”按钮,添加以下代码: 

     void CCSockClientDlg::OnSend() 

     {

         if (m_clientSocket.m_bConnected)

         {

     m_clientSocket.m_nLength=m_MSG.GetWindowText

     (m_clientSocket.m_szBuffer, sizeof(m_clientSocket.m_szBuffer));

     m_clientSocket.AsyncSelect(FD_WRITE);

     m_MSG.SetWindowText("");

         }

     }

     12. 双击IDD_CSOCKCLIENT_DIALOG对话框中的“关闭”按钮,添加以下代码: 

     void CCSockClientDlg::OnExit() 

     {

         //关闭Socket

     m_clientSocket.ShutDown(2);

         //关闭对话框

     EndDialog(0);    

     }

     12.运行此项目,连接时输入主机名或IP均可,CAsyncSocket类会自动处理。

     二. 服务端

     Server端的编程与Client端的类似,下面主要介绍他的Listen及Accept函数。

     1. 建立一个CNewSocket类,重载CAsyncSocket类的OnReceive、OnSend函数,如何进行信息的显示和发送可以参考Client程序。本例中采用将收到信息原封不动发回的方法来实现Echo功能,代码如下:

     CNewSocket::OnReceive(int nErrorCOde)

     {

         m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);

         // 直接转发消息

     AsyncSelect(FD_WRITE);

     }

     CNewSocket::OnSend(int nErrorCode)

     {

         Send(m_szBuffer,m_nLength,0);

     }

     2. 建立一个CMyServerSocket类,重载CAsyncSocket类的OnAccept函数代码如下

     在MyServerSocket.h中声明变量

     public::

     CNewSocket* m_pSocket;

     void CMyServerSocket::OnAccept(int nErrorCode)

     {

         //侦听到连接请求,调用Accept函数

         CNewSocket* pSocket = new CNewSocket();

         if (Accept(*pSocket))

         {

     pSocket- AsyncSelect(FD_READ);

     m_pSocket=pSocket;

         }

         else

     delete pSocket;

     }

     3. 为对话框添加一个“侦听”按钮,添加如下代码:

     在CsockServerDlg.ccp中声明变量

     public:

         CMyServerSocket m_srvrSocket;

     void CCSockServerDlg::OnListen()

     {

         if (m_srvrSocket.m_hSocket==INVALID_SOCKET)

         {

     BOOL bFlag=m_srvrSocket.Create

     (UserPort,SOCK_STREAM,FD_ACCEPT);

     if (!bFlag)

     {

         AfxMessageBox(“Socket Error!”);

         M_srvrSocket.Close();

         PostQuitMessage(0);

         Return;

     }

         }

     //“侦听”成功,等待连接请求

     if (!m_srvrSocket。Listen(1))

     {

     int nErrorCode = m_srvrSocket.GetLastError();

     if (nError!=WSAEWOULDBLOCK)

     {

         AfxMessageBox(“Socket Error!”);

         M_srvrSocket.Close();

1条大神的评论

  • avatar
    访客 2022-07-10 下午 05:28:30

    ncle两个按钮,增加ID_Connect(连接)、ID_Send(发送)、ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在Class

发表评论