VS下如何建立一个新的MFC程序 网络编程 课设 基于C++ MFC 连接数据库 小应用 小项目浅析展示

  这里不知道会不会有人是真的新手 新新手 不知道怎么 如何建立一个MFC 工程 应该不会吧? 就是 打开VS 新建项目-MFC -MFC工程-点基于对话框 -和在静态库中使用 然后下一页将关于对话框取消了 不然会有两个对话框出来 然后点击完成

具体如下

步骤1:双击打开vs2013,进入起始页,按Ctrl+Shift+N组合快捷键(此时也可以一步步新建->项目操作),可以新建工程,选择模块下的Visual C++-->MFC-->MFC应用程序,设定好项目文件名和路径,点击确定。

步骤2:进入应用程序类型界面。勾选“基于对话框”,在“MFC的使用”中,勾选“在静态库中使用MFC(U)”,再点击下一步。

注:MFC可以在静态库下使用,或者在共享DLL中使用,但前者会把所有用到的dll文件集成到exe文件,因此占用内存较大,所以自己选择。

 这里选择去掉关于对话框,不然有两个对话框 

步骤3:进入用户界面功能。选择主框架样式,可以自由选择是否添加最小化框、最大化框;“关于”框也可以去掉;对话框标题一般不需要更改,默认与项目名称一致。

以上步骤结束之后我们就看到一个对话框 有确定和取消    可以双击确定进去函数  然后在CDialogEx::OnOK();下面输入 AfxMessageBox("hello word");   然后编译运行 就能出来对话框  点击确定按钮 hello word 就出来啦

上面这些完成就代表项目建立完成,然后还实现了每个初学者的hello word 哈哈哈哈哈哈 以上就是新手建立MFC教程 下面简单介绍点知识就进入主题

  这里讲一下里面几行重要的新手代码:这些都是在2.cpp里的InitInstance()函数的 看图片左边 带Dlg是对话框cpp文件 一般也是对话框的函数名字

  然后对话框的资源是放在资源视图里的 VS里面如果左边下面没有资源视图就要 在 主页面的 上面的资源视图里面 或者里面的其他窗口 找到 然后打开

CMFCApplication2Dlg dlg;     m_pMainWnd = &dlg;     INT_PTR nResponse = dlg.DoModal();

上面这三行代码 1.是用自己的对话框函数 定义一个对象

2.因为这里是第一个对话框是主对话框 所以绑定主对话框  m_pMainWnd = &dlg; 其他对话框就只要1 3 两行就能进行弹出对话框

3 。dlg.DoModal();这里就是用对话框对象发出弹出对话框指令。

有这些代码直接编译运行就能跳出对话框

注意啦 命名 都用英文 源码在这https://pan.baidu.com/s/1chRMPK

  工具:vs2013,mysql5.7.6

操作系统:win64位     注意啦 我这里是VS2013  你们要是拷贝我的工程在其他版本上可能不能用   这时候只要点击项目 - 属性-配置属性 -右边的工具集 改成你们自己的版本 就行了           

还有  我这里是 64位的   你们有可能项目是   WIN 32   的  要改     项目 -属性-右上的  配置管理器-里面的平台改成X64  不然就会出现一些 什么什么变量 在什么地方引用 之类的错误

设置一些引用文件的环境变量,基本跟opencv配置过程差不多    如果配置过OpenCV的就知道了     

点击项目->属性---改成所有配置--配置->vc++目录 然后“include目录”(包含目录)那把“C:\ProgramFiles\MySQL 5.7.6\include”给加进来  再然后“lib目录”(库目录)那里把“C:\ProgramFiles\MySQL 5.7.6\lib”和“C:\ProgramFiles\MySQL 5.7.6\lib\debug”也一起加进来。以上三个文件在mysql 的安装目录下(!!!注意啦 这是我MYSQL的安装目录  你们看自己的)    

最后在加一个 项目-属性-连接器-常规  -附加依赖项 里 加 libmysql.lib   然后在把这个MYSQL的文件 拷贝到自己MFC工程的DEBUG  或者代码放置的地方   //这里如果不加的话 就要在工程里面加上

#pragma comment (lib, "libmysql.lib")      同样还是要把文件拷贝到工程里面去     #pragma comment (lib, "mysqlclient.lib")

还有可能会因为没有加这个而报错 这个是MFC 经常的错误 #define _CRT_SECURE_NO_DEPRECATE 这个要加在stafx.h里最上面 也就是 所有头文件还没有加载的时候就要加上去

好了  下面开始进入正题:

  第一步:  除了代码给我们的 头文件  我们必要的头文件也是有要加的:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. #include <iostream>  
  5. #include "winsock.h"  
  6. #include "mysql.h" 
  7. #include “Resource.h”

mysql.h 不能打开 就是 没有配置好   检查一下   再不行就 拷贝一份到工程里面。

第二步:

  先上代码:  这里点击我对话框BUTTON 跳转出来的函数

void CMYSQLLLINKDlg::OnBnClickedButton1()
{
    // TODO:  在此添加控件通知处理程序代码

    MYSQL m_sqlCon;
    mysql_init(&m_sqlCon);
    // localhost:服务器 root/123456为账号密码 testa为数据库名 3306为端口    
    if (!mysql_real_connect(&m_sqlCon, "localhost", "root", "123456", "testa", 3306, NULL, 0))
    {
        AfxMessageBox(_T("访问数据库失败!"));
        CString e = mysql_error(&m_sqlCon);//需要将项目属性中字符集修改为“使用多字节字符集”或“未设置”  
        MessageBox(e);
        return;
    }
    else
    {
        AfxMessageBox(_T("成功!"));
        mysql_query(&m_sqlCon, "SET NAMES 'GB2312'");//解决从数据库中读取数据后汉字乱码显示的问题  也可以是UTF-8

        CString name, id, student_name, student_id, student_major;
        //LPSTR sql = (LPSTR)malloc(200);  两种格式都可以   我喜欢用sql.Format这种
        CString sql;
        GetDlgItemText(IDC_EDIT1, name);
        GetDlgItemText(IDC_EDIT2, id);
        
        sql.Format(TEXT("select student_name,student_id,student_majo from users where father_id='%s'and father_name='%s';"), id, name);
        //sprintf(sql, "select student_name,student_id,student_majo from users where father_id='%s'and father_name='%s';", id1, name1);
        AfxMessageBox(sql);//看看SQL语句
        mysql_query(&m_sqlCon, sql);

        MYSQL_RES *res;//定义获取结果集
        MYSQL_ROW row;//获取结果集中行数据

        res = mysql_store_result(&m_sqlCon);//取得查询结果,保存查询到的数据到res   
        int num = 0;
        //这个函数每次只能获取一行数据  不过每次获取完res指针会后移  所以while循环就可以不断的获取下面的数据  不过要注意存储问题 
        if (row = mysql_fetch_row(res))
        {
            CString num1 = row[0], num2 = row[1], num3 = row[2];
            student_name = num1;
            student_id = num2;
            student_major = num3;
            SetDlgItemText(IDC_EDIT3, student_name);
            SetDlgItemText(IDC_EDIT4, student_id);
            SetDlgItemText(IDC_EDIT5, student_major);
        }
        else
        {
            CString retu(_T("输入信息有误!"));
            SetDlgItemText(IDC_EDIT3, retu);
        }
    }

    
    
}

好吧  一下上代码 可能有点乱 或者难以理解     那我们一个一个来看:

        MYSQL m_sqlCon;
	mysql_init(&m_sqlCon);        

 这个就是 建立一个MYSQL的实例对象   然后对他进行初始化      还有其他写法:

    MYSQL *sock;  
    sock=mysql_init(0);  

都是差不多的意思。

下面就是连接数据库和判断:           // localhost:服务器 root/123456为账号密码 testa为数据库名 3306为端口      &m_sqlCon这个就不用说了吧

!!!注意了整个项目  我用的都是 多字节   需要在自己项目属性那里更改    没有多字节库 的可以 去网上下载一个  安装到VS里

if (!mysql_real_connect(&m_sqlCon, "localhost", "root", "123456", "testa", 3306, NULL, 0))
	{
		AfxMessageBox(_T("访问数据库失败!"));
		CString e = mysql_error(&m_sqlCon);//需要将项目属性中字符集修改为“使用多字节字符集”或“未设置”  
		MessageBox(e);
		return;
	}
	else
	{
		AfxMessageBox(_T("成功!"));
		mysql_query(&m_sqlCon, "SET NAMES 'GB2312'");//解决从数据库中读取数据后汉字乱码显示的问题  也可以是UTF-8
        }    

好了   上面这些就是 连接数据库的 简单步骤了 。接下来我们来一个小项目玩玩。。。。。

第三步 :

上面这个就是一个简单的实现 从 MFC  到数据库的   查询学生信息的小界面。

下面 就是我数据库表格 users 放在 一个testa 的数据库里面      如果数据库安装不会的可以参照我的另外一篇安装数据库的博客http://www.cnblogs.com/DOMLX/p/8094659.html

看代码解释:

CString name, id, student_name, student_id, student_major;
        //LPSTR sql = (LPSTR)malloc(200);  两种格式都可以   我喜欢用sql.Format这种
        CString sql;
        GetDlgItemText(IDC_EDIT1, name);
        GetDlgItemText(IDC_EDIT2, id);
        
        sql.Format(TEXT("select student_name,student_id,student_majo from users where father_id='%s'and father_name='%s';"), id, name);
        //sprintf(sql, "select student_name,student_id,student_majo from users where father_id='%s'and father_name='%s';", id1, name1);
        AfxMessageBox(sql);//看看SQL语句
        mysql_query(&m_sqlCon, sql);

        MYSQL_RES *res;//定义获取结果集
        MYSQL_ROW row;//获取结果集中行数据

        res = mysql_store_result(&m_sqlCon);//取得查询结果,保存查询到的数据到res   
        int num = 0;
        //这个函数每次只能获取一行数据返回的是个行数组  不过每次获取完res指针会后移  所以while循环就可以不断的获取下面的数据  不过要注意存储问题 
        if (row = mysql_fetch_row(res))
        {
            CString num1 = row[0], num2 = row[1], num3 = row[2];//将数组中的数据存储
            student_name = num1;
            student_id = num2;
            student_major = num3;
            SetDlgItemText(IDC_EDIT3, student_name);//将数据都显示到对话框中的控件中去
            SetDlgItemText(IDC_EDIT4, student_id);
            SetDlgItemText(IDC_EDIT5, student_major);
        }
        else
        {
            CString retu(_T("输入信息有误!"));
            SetDlgItemText(IDC_EDIT3, retu);
        }

完成上面这些     加上你的数据库已经打开  并且 创建好了 表 和存入了数据 就可以开始进行查询了。

大家好我是飞机,是一个想成为全栈工程师的男人。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏NetCore

Do You Know?Url Path MaxLength Limit -- 你或许以后会遇到的一个问题

最近一直在学习Asp.Net MVC,大家都知道可以用System.Web.Routing来解析一段Url,然后到达我们Route规则定下的一个Controll...

1838
来自专栏Golang语言社区

TCP、UDP、IP 协议分析

互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄...

2933
来自专栏安恒网络空间安全讲武堂

writeup分享 | 近期做的比较好的web

0x01猫头鹰嘤嘤嘤 http://124.128.55.5:30829/index.php 首先分析一下功能,随便上传一张jpg图片上传,跳转到 http...

4238
来自专栏NetCore

保护连接字符串

保护连接字符串 摘自MSDN 保护对数据源的访问是安全应用程序最重要的目标之一。为了帮助限制对数据源的访问,必须保护连接信息(例如用户标识、密码和数据源名称)的...

1785
来自专栏zhisheng

教你如何在 IDEA 远程 Debug ElasticSearch

之前在 源码阅读环境搭建文章 中写过我遇到的一个问题迟迟没有解决,也一直困扰着我。问题如下,在启动的时候解决掉其他异常和报错后,最后剩下这个错误一直解决不了:

892
来自专栏企鹅号快讯

TCP是否会乱序

问题 TCP客户端发送数据一般这样写 发送数据调用的是write函数,第一个参数是表示socket的文件指针,后面是要传送的数据指针和数据长度。如果数据长度超过...

2496
来自专栏程序员互动联盟

【专业技术】Android如何保证安全?

存在问题: 那么多小伙伴想root,root后好处多多你懂的,那么开发的小伙伴最想关心的是安全机制问题。 解决方案: 我们就以此来了解一下Android 安全...

3636
来自专栏LEo的网络日志

go语言动态库的编译和使用

4287
来自专栏Albert陈凯

Hadoop数据分析平台实战——180Oozie工作流使用介绍离线数据分析平台实战——180Oozie工作流使用介绍

离线数据分析平台实战——180Oozie工作流使用介绍 Oozie工作流介绍 Oozie的四大组件服务分别是: workflow, coordinator, b...

3815
来自专栏禅林阆苑

memcache学习笔记

下载稳定版的memcache包,http://pecl.php.net/package/memcache

882

扫码关注云+社区