MFC课程设计报告

贵州大学课程设计报告

学院:明德学院                 专业:信息安全                       班级:071

程序源代码

头文件:

Comm.h:

#include"WinSock.h"

#define socklen_t int

#pragma comment(lib, "wsock32.lib")

class CComm

{

private:

 SOCKET ListenSocket;     //等待接收数据的socket

 sockaddr_in srv;       // 绑定地址

 sockaddr_in client;   // 发送数据过来的地址

public:

 CComm();

 ~CComm();

 static void ListenThread(void *data);

 bool SendMsg(char *Msg, int Len, char *host, short port);

 bool Listen(int PortNum);

};

stdafx.h:

// stdafx.h : 标准系统包含文件的包含文件,

// 或是经常使用但不常更改的

// 特定于项目的包含文件

//

#pragma once

#include "targetver.h"

#include <stdio.h>

#include <tchar.h>

// TODO: 在此处引用程序需要的其他头文件

targetver.h:

#pragma once

// 以下宏定义要求的最低平台。要求的最低平台

// 是具有运行应用程序所需功能的Windows、Internet Explorer 等产品的

// 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以

// 正常工作。

// 如果必须要针对低于以下指定版本的平台,请修改下列定义。

// 有关不同平台对应值的最新信息,请参考MSDN。

#ifndef _WIN32_WINNT            // 指定要求的最低平台是Windows Vista。

#define _WIN32_WINNT 0x0600     // 将此值更改为相应的值,以适用于Windows 的其他版本。

#endif

源文件:

Comm.cpp:

#include "StdAfx.h"

#include "Comm.h"

CComm::CComm()  

    //构造函数  

    ListenSocket = INVALID_SOCKET;  // 开始设置为INVALID_SOCKET   

    #ifdef _WIN32   // 如果是win32系统,则执行如下代码  

        WORD VersionRequested = MAKEWORD(1,1);//第一个参数为低位字节,第二个为高位字节,      

                                              //A   or   B   shl   16,二进制为     

                                              //函数的结果是,也就是把两个byte组合成word型  

        WSADATA wsaData;//WSA为Windows Sockets API 的缩写   

        WSAStartup(VersionRequested, &wsaData); // 启动winsock服务  

        if ( wsaData.wVersion != VersionRequested )  

        {  

            printf("Wrong version or WinSock not loaded\n");  

            fflush(0);  //fflush()函数的作用是:将所有的缓冲结果写入一个文件中  

        }  

    #endif   

}  

 //析构函数  

CComm::~CComm()  

{  

    if (ListenSocket!=INVALID_SOCKET )

  closesocket(ListenSocket);    // 如果已经创建、则关闭  

    #ifdef _WIN32   // 调用WSACleanup   

        WSACleanup();  

    #endif

}  

//地址绑定,注意在UDP协议中,不需要listen,这里函数listen只是绑定一个端口  

bool CComm::Listen( int PortNum )  

{  

 //创建socket

    ListenSocket = socket(PF_INET, SOCK_DGRAM, 0);  

    if (ListenSocket ==INVALID_SOCKET )  

    {  

        printf("Error: socket创建失败\n");  

        fflush(0);  

        return false;  

    }

 ///设定地址

    srv.sin_family = PF_INET;  

    srv.sin_addr.s_addr = htonl( INADDR_ANY );  // 任何地址 

 //绑定端口

    srv.sin_port = htons(PortNum );  

    if (bind(ListenSocket,(struct sockaddr *)&srv, sizeof(srv)) != 0 )  

    {  

        printf("Error: 绑定失败\n");  

        fflush(0);  

        closesocket( ListenSocket );  

        return false;  

    }  

    int ThreadID;   // 线程ID

 DWORD thread;

 //调用createthread创建线程

 ThreadID = (int)CreateThread(NULL, 0,

         (LPTHREAD_START_ROUTINE)(CComm::ListenThread),

         (void *)this,0,

         &thread );

 ThreadID=ThreadID?0:1;    // 如果成功,则返回为  

    if(ThreadID)  // ThreadID如果不为,则线程创建失败  

    {  

        printf("线程创建失败\n");  

        return false;  

    }  

    else

  return true;

}

void CComm::ListenThread( void *data )  

{  

    char buf[4096];

    CComm *Comm = (CComm *)data;  

    int len = sizeof(Comm->client);  //////获得地址的长度

    while(1)    // 获取数据,一直循环  

    {  

        //接收数据  

        int result = recvfrom( Comm->ListenSocket, buf, sizeof(buf)-1, 0,

                                      (sockaddr*)&Comm->client, (socklen_t *)&len);

        if ( result > 0 )//////////////如果获得数据

        {  

            buf[result] = 0;  

   //获得发送端的地址和端口号

            printf("Message received from host %s port %i\n",

                     inet_ntoa(Comm->client.sin_addr),ntohs(Comm->client.sin_port));

            printf(">> %s", buf);                           //输出接收到的数据

            fflush(0);  

        }     

    }     

}

bool CComm::SendMsg(char *Msg,int Len,char *host,short port )  

{  

    signed int Sent;  

    hostent *hostdata;  

    if ( atoi(host) )   // 是否IP地址为标准形式  

    {  

        u_long ip = inet_addr( host );//将一个点间隔地址转换成一个in_addr   

        hostdata = gethostbyaddr((char *)&ip, sizeof(ip),PF_INET );// 返回对应于给定地址的主机信息  

    }  

    else// 否则可能是机器名  

    {  

        hostdata = gethostbyname( host );  

    }   

    if ( !hostdata )  

    {  

        printf("获得机器名错误\n");  

        fflush(0);  

        return false;  

    }  

    sockaddr_in dest;   // 发送目标地址  

    dest.sin_family = PF_INET;  

    dest.sin_addr = *(in_addr *)(hostdata->h_addr_list[0]);  

    dest.sin_port = htons( port );//将主机的无符号短整形数转换成网络字节顺序  

    //该函数原形为u_short PASCAL FAR htons( u_short hostshort);    

    printf("信息已经被发送到主机%s 端口为%i\n",

                              inet_ntoa(dest.sin_addr), ntohs(dest.sin_port));

    //数据发送  

    Sent = sendto(ListenSocket, Msg, Len, 0, (sockaddr *)&dest, sizeof(sockaddr_in));  

    if( Sent != Len )  

    {  

        printf("错误发送UDP信息\n");  

        fflush(0);  

        return false;  

    }

 else

    return true;

}

stdafx.cpp:

// stdafx.cpp : 只包括标准包含文件的源文件

// wyh.pch 将作为预编译头

// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

// TODO: 在STDAFX.H 中

// 引用任何所需的附加头文件,而不是在此文件中引用

Wyh.cpp:

// why.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include"Comm.h"

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

 char buffer[4096]; //缓冲区

 short listeningport; //要绑定的绑定接收端口

 short destport; //要发送的对方端口

 char *desthost; //目标端口

 printf("Initialization...\n");

 listeningport=2000; //设定UDP绑定端口,这里是监听端口,也是另外程序的发送端口

 destport=3000; //设定发送端口,也是另外一个程序的监听端口

 desthost="192.168.2.59"; //设定目标地址

 CComm myComm;

 if(!myComm.Listen(listeningport)) //绑定地址

 {

  printf("端口%d绑定失败\n",listeningport);

  return 0;

 }

 printf("聊天程序成功建立:<Ctrl_C>退出\n\n");

 while(fgets(buffer,sizeof(buffer),stdin)) //获得输入数据

 { //发送数据到目标地址

  myComm.SendMsg(buffer,strlen(buffer),desthost,destport);

 }

 return 0;

}

 

第二篇:MFC(对话框控件设计)课程设计报告

C++程序设计(下)

——对话框控件的高级应用

姓    名:   吴明仕

班    级:    1020551

学    号:      33

指导老师:   孔 令 德

时间:20##年12月6日

 一、设计描述

该设计充分利用控件的不同属性实现“变幻莫测”的功能。在左边的“测试文本框属性栏”单击相应的单选按钮可以是文本编辑框处于“可以输入”、“不能输入”或者“隐藏”的状态。在图片变换栏上的图标上单击鼠标,可以实现图标的切换。启动进度条,在进度条推进过程中图片变换栏的图标会自动变换。通过点击确定可以退出该控件应用。

程序完成后如图1所示。(图1)

二、设计分析

1.执行VC程序,选择FileNew命令,弹出New对话框,单击工程标签,转到工程选项卡,选择MFC AppWizard(exe),然后在工程名称文本框中输入“对话框控件的高级应用”,单击确定后在弹出的MFC应用程序向导中选择基本对话框              (图2)

2.点击完成进行编程。

3.进行编程是还需将“启动键”、“进度条”、“图片”以及“文本编辑框”等的属性。

3.1、启动键的属性修改如下图。

3.2、进度条的属性修改如下图。

3.3、图片的属性修改如下图。

3.4.文本编辑框的属性修改如下图。

4、属性修改完后按Ctrl+W进入MFC ClassWizard的Message Maps为锁所增添的文件添加映射,然后再Member Variables中设置如下图

5、程序的最终运行 效果如下图所示。

三、源代码

1,定义全局变量

    m_str = _T("");

    m_str="测试一下CEdit控件的功能";

    m_tag=FALSE;

    m_Progress=0;

2,为添加的文件添加函数代码

// TODO: Add extra initialization here

    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);

    UpdateData(FALSE);

    m_ComboBox.AddString("亚龙湾");

    m_ComboBox.AddString("石梅湾");

    m_ComboBox.AddString("日月湾");

    m_ComboBox.AddString("五指山");

    m_ComboBox.SetCurSel(1);

    CProgressCtrl * pProgress=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);

    pProgress->SetRange(0,50);

    pProgress->SetPos(0);

   

return TRUE;

}

void CExDlg::OnPic()

{

    // TODO: Add your control notification handler code here

    if(m_tag==FALSE)

    {

        m_icon.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON2));

        m_tag=TRUE;

    }

    else

    {

        m_icon.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));

        m_tag=FALSE;

    }

}

void CExDlg::OnRadio1()

{

    // TODO: Add your control notification handler code here

    GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);

    GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);

    UpdateData(FALSE);

}

void CExDlg::OnRadio2()

{

    // TODO: Add your control notification handler code here

    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);

    GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW);

   

    UpdateData(FALSE); 

}

void CExDlg::OnRadio3()

{

    // TODO: Add your control notification handler code here

    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);

    GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE);

   

    UpdateData(FALSE); 

}

void CExDlg::OnCloseupCombo1()

{

    // TODO: Add your control notification handler code here

    m_str.Empty();

    m_str="运行关闭下拉菜单函数";

    OnRadio1();

    UpdateData(FALSE);

}

void CExDlg::OnStart()

{

    // TODO: Add your control notification handler code here

    m_timer=SetTimer(1,50,NULL);

}

void CExDlg::OnTimer(UINT nIDEvent)

{

    // TODO: Add your control notification handler code here

    CProgressCtrl * pProgress=(CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);

    pProgress->SetPos(++m_Progress);

   

    if(m_Progress%5==0)

        OnPic();

    if(m_Progress>=50)

        KillTimer(m_timer);

}

四、设计总结

我做的是“对话框的控件高级应用”。通过这一次的课程设计,我巩固了上课时所学过的有关对话框方面的知识,同时还通过查找学到了课上没有涉及的知识!感受到了课外知识的重要性,可谓是受益匪浅。

相关推荐