一、创建MFC项目

创建MFC项目时,高级功能一般默认即可,但如果用不上“ActiveX 控件”可以去掉勾选;如果需要涉及网络编程就把 “Windows 套接字” 选上。 不过没选上也不要紧, 在程序中可以自己添加部分代码导入套接字。

二、整体架构

学会看资源视图和类视图来快速寻找某些需要的东西
比如通过类视图可以快速访问类的头文件和源文件,双击类名打开头文件,点击下方的函数可直接跳转到对应的函数定义处

整个项目文件系统中会有两个 debug 文件夹,项目的直接目录下的 debug 文件夹包含了生成的 exe 文件,其中的.ilk 文件用于编译连接
项目名称下的文件夹里包含了应用程序用到的资源,头文件,源文件等

项目名称下的文件夹包含一个 res 文件夹,是用来存放应用程序图标的,可以自己替换从而更改应用图标,不过名称和格式要一致,否则无法识别

三、程序执行流程

每创建一个项目,一般会包含 3 个类,“关于”对话框类、主对话框类以及用于初始化项目的 App 类,假如项目名称为 Demo,那么这三个类分别为CAboutDlg、CDemoDlg、CDemoApp

1、项目生成后,都会生成一个属于 CDemoApp 类的 theApp 对象,对本应用程序实例化,这个在 CDemoApp.cpp 文件中定义, 创建时调用构造函数 CDemoApp::CDemoApp(); 这就是程序创建的第一步

2、接下来程序会调用 winmain 函数, 这个在项目文件中找不到,但可以在 VS2013 的安装路径下找到

3、调用完 winmain 后,就通过 InitInstance()函数初始化窗口, 包括注册、 创建和显示对话框,InitInstance 函数是 CDemoApp 类中除构造函数以外唯一的成员函数

4、应用程序创建完了,程序开始运行了,于是进入消息循环,windows 程序的事件都是消息驱动的,每产生一个消息就触发一个响应事件,消息和事件通过消息映射
DECLARE_MESSAGE_MAP()联系在一起
默认包含三个消息:
ON_WM_SYSCOMMAND() //响应控制指令
ON_WM_PAINT() //响应绘图消息,用于刷新窗口
ON_WM_QUERYDRAGICON()//当用户拖动最小化窗口时取得光标

5、当用户关闭应用程序时,会发送一个 WM_CLOSE 消息,程序响应后结束程序,如何在点击关闭时需要弹出其他对话框(比如用于提示保存),可以通过类向导添加 WM_CLOSE 消息处理函数,变添加相关处理程序

四、对话框类

首先看看对话框类的继承关系, 新建的项目类派生于 CDialogEx 类, CDialogEx 在 CDialog 类的基础上进行了扩展,而 CDialog 派生于窗口类 CWnd,说明对话框也属于一种窗口

构造函数 CDemoDlg(),通过类向导生成的自定义变量或者控件的关联变量都会在构造函数中初始化一个值,不过开发者也可以直接在头文件定义变量,并手动在构造函数中添加初始化语句

DoDataExchange 函数,在对话框中添加新的控件并通过类向导定义了相关变量后,都会在这个用于数据交换的函数中说明,添加变量的最大最小值也会在这里体现

DECLARE_MESSAGE_MAP函数定义了所有消息的来源和处理函数。对于自定义消息或者某些无法通过类向导完成的消息,可以手动在这里添加映射关系,并在别处添加对应的处理函数

初始化函数 OnInitDialog,默认用来设置图标和菜单,很多时候有些操作需要在启动对话框前就做好,比如说某些控件的初始状态(按钮是否可视、是否可操作),这些初始化的设置都可以在 OnInitDialog 函数中添加

默认生成的函数就这么多,其他常用的消息有定时器消息 WM_TIMER 、窗口关闭消息 WM_CLOSE、应用程序结束消息 WM_DESTROY、按钮按下消息 WM_KEYDOWN 等。而常用的虚函数一般有 PreTranslateMessage、PreCreateWindow 等

五、按钮的使用

一般需要修改的属性只有两个,“Caption”项和“ID”项,前者表示按钮文本,后者是按钮 ID,是程序中的唯一标识

其余常用属性:
1. Disabled:使能,为真(true)表示按钮可以按下,为假(false)表示按钮为灰,不能操作
2. Visible:可见,为真表示按钮可见,为假表示按钮不可见
3. Multiline:多行,为真表示按钮文本可以多行显示,为假表示按钮文本不可换行显示

添加按钮事件处理函数:

方法一:双击按钮自动添加处理函数,自动以 OnBnClicked 开头,ID 结尾命名,这种方法最简单,但无法修改函数名称,只能生成默认的按钮按下消息的函数

方法二:类向导,对按钮右键选择“类向导”,在消息栏中选择默认的“BN_CLICKED”,然后点击“添加处理程序”

方法三:对按钮右键选择“添加事件处理程序” , 然后可以修改函数名称, 点击 “编辑程序”自动跳转到代码编辑界面

方法四:选中按钮,在属性页中有个闪电符号,它表示控件事件,点击它,可以看到许多消息,在“BN_CLICKED”消息栏中添加函数,可以修改函数名,修改完按回车就能生成处理函数

实现按钮功能:
1. 添加按钮的控件型变量, 添加方法与添加事件的方法二、 三类似, 以方法三为例,对“退出”按钮添加 CButton 型的控件变量, 这里命名为 m_Exit。 同理添加 “使能” 按钮变量 m_Enable;

说明:
1. 变量名一般以”m_”开头,后面部分为按钮功能的说明,这样方便记忆和识别;
2. 按钮只有控件型的变量

  1. 首先修改对话框初始化函数 OnInitDialog,添加一条语句:
    m_Exit.EnableWindow(false);//使“退出”按钮不可用
  2. 对两个按钮都添加按钮按下事件的处理函数,“使能”按钮用来使能退出按钮是否可用,退出按钮用于退出程序

    void CDemoDlg::OnBnClickedEnable()
    { // TODO: 在此添加控件通知处理程序代码
    CString str;
    m_Enable.GetWindowTextW(str);
    if (str ==”使能”)
    {
    m_Exit.EnableWindow(true);
    m_Enable.SetWindowTextW(_T(“不使能”));
    }
    else
    {
    m_Exit.EnableWindow(false); //不使能退出按钮
    m_Enable.SetWindowTextW(_T(“使能”)); //修改按钮文本
    }
    }
    void CDemoDlg::OnBnClickedExit()
    {
    // TODO: 在此添加控件通知处理程序代码
    SendMessage(WM_CLOSE,0,0);
    }

六、删除控件

对按钮右键“类向导”,或者直接从菜单“目”中找到类向导,并找到按钮对应的处理函数,选中事件函数后,点击“删除处理程序”

转到成员变量选项卡,选中需要删除的控件变量,点击“删除变量”

七、固定对话框

在属性页的外观选项中找到“Boder”项, 可以看到默认的属性值是“Resizing”, 表示对话框大小可以被改变

将“Boder”属性修改为最后一项“Dailog Frame”,这样就把对话框的框架固定了

八、文本超链接

最重要的一条属性是 Notify,需要点击后打开超链接的文本属性中,修改
Notify 为 true,否则无法响应鼠标点击事件

修改两个点击函数, 通过 ShellExecute 函数打开超链接,通过 SetWindowTextW 函数修改状态栏信息

ShellExecute(0, NULL, _T("这里填写网址"), NULL, NULL,SW_NORMAL);
GetDlgItem(IDC_LinkBaidu)->SetWindowTextW(_T("你好百度!"));
m_toast.SetWindowTextW(_T("已打开百度网页!"));

九、处理多个事件

在源文件的消息映射中添加:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON4, OnBnClickedXXX)
参数 1:消息类型;
参数 2:第一个控件 ID;
参数 3:最后一个控件 ID;
参数 4:响应函数

在源文件中实现函数 OnBnClickedXXX(UINT nID),可以通过 nID 减去第一个按钮 ID 确定当前按下按钮属于第几个按钮。接下来可以通过两种方法实现文本信息的修改
方法一:通过 switch 语句判断按钮编号,执行不同的程序。
方法二:定义 CString 变量,通过 Format 定义字符串格式,将按钮信息包含在字符串中,最后通过 m_toast 更新界面

十、编辑框

首先选中任意一个编辑框,看看编辑框都有哪些属性,其中常用到属性有:
Multiline:多行,表示内容可以多行显示,一般记录性的编辑框需要多行;
Password:密码,表示文本以密码形式呈现,一般用来输出密码;
Readonly:只读,表示文本内容只能读不能写;
Number:数字,表示只能输入数字;
Lowercase:小写,所有字母全部自动转换为小写显示;
Uppercase:大写,所有字母全部自动转换为大写显示;
Horizontal scroll:水平滚动条,需要先选中 Multiline 属性;
Vertical scroll:垂直滚动条,需要先选中 Multiline 属性;

修改初始化函数 OnInitDialog,添加语句:

m_record.SetWindowTextW(_T("请输入密码!\n"));
GetDlgItem(IDC_CALC)->EnableWindow(false);

这样就设置了提示语句,并将计算按钮设置为不可用,GetDlgItem 函数通过 ID 获取控件,这样就不必添加控件变量

获取数据和更新数据时需要采用 UpdateData 函数

十一、单选按钮

单选按钮最重要的属性就是 Group, 需要在同一组的按钮必须 ID 连续, 这就要求添加同组按钮时连续

十二、复选框

复选框常用函数:
GetCheck():获取复选框状态,判断是否被选中;
SetCheck():设置复选框是否选中,1 表示选中,0 表示不选中

十三、定时器消息

通过 SetTimer 函数启动定时器
参数 1:nIDEvent,定时器 ID;
参数 2:nElapse,定时器定时时间,单位为毫秒;
参数 3:回调函数,设为 NULL 即可。
通过 KillTimer 销毁定时器,只需输入一个参数(定时器ID)

十四、自定义消息

自己定义的消息 ID 要大于 WM_USER

十五、开机自启动

编辑函数 OnBnClickedAutostart 以实现自启动或取消自启动;
这个功能需要修改注册表:
1、定义注册表项 HKEYheky;
2、通过 RegOpenKeyEx 函数打开电脑的启动项;
3、通过 GetModuleFileName 函数获取本软件的全路径;
4、通过 RegSetValueEx 函数添加注册表项;
取消自启动:
1、通过 RegOpenKeyEx 函数打开电脑的启动项;
2、通过 RegDeleteValue 函数删除注册表项;

注意修改注册表时,应用程序的名称不需要加 exe 的后缀

十六、组合框

打开组合框的属性页, 可以在 data 属性中直接添加数据,用分号隔开, 再把 sort 改为 false,否则数据的就会按它的排序方式进行排序,而不一定是数据输入的顺序了。最后说是 Type属性,这个用于修改组合框的款式:
Simple:一般不用;
Drop Down:默认,可以输入数据,也可以选择数据;
Drop List:只能选择数据,无法输入数据;
第 1 个组合框选择 Drop Down,data 改为:10;20;30;40;50
第 2 个组合框选择 Drop List,data 添加为+;-;*;/
第 3 个组合框选择 Drop Down,data 暂时不填;
所有组合框的 sort 属性均为 false。

十七、多线程

多个线程最后不要在一个函数中启动,否则可能会出现某个线程不执行的情况

十八、保存txt文件

CStdioFile file;
file.Open(m_txtName, CFile::modeCreate | CFile::modeWrite | CFile::typeText);
CString str;
for (int i =0; i < m_DataNum;i++)
{ str.Format(_T("%d\t%g\n"), i + 1, Data[i]); file.WriteString(str);
}
file.Close();
AfxMessageBox(_T("已保存数据到  ")+m_txtName+_T("  文件中!"));

保存数据后别忘了用文件类的 close 函数关闭文件

Visual Studio 2013 MFC 编程相关推荐

  1. 基于C#(Visual Studio 2013)的AutoCAD2016二次开发(一)编程环境的搭建

    机械设计中一般都采用AutoCAD设计软件,在复杂 CAD问题或特殊用途的设计中,依据原有软件的功能往往难以解决问题,在此情况下,只是会使用软件的基本功能是不够的.本着自学和相互交流的原则,撰写如下学 ...

  2. Visual Studio 2013 详细安装教程(安装+注册)

    转载自:安装+注册:https://jingyan.baidu.com/article/09ea3ede3b2496c0afde3944.html IE10报错解决办法:https://jingyan ...

  3. visual studio 2013更新到2019 连接 autocad2019 (c#)

    目录 一.尝试用vs2013连接autocad2019 1.运行时候出现了错误 2.如何查询.netframework版本 二.vs2013更新到vs2019 1.完全干净的卸载vs2013 2.安装 ...

  4. Visual Studio 2013 简体中文破解版

    vs2013(Visual Studio 2013)是一款微软出品的编程开发工具,软件提供了UML工具.代码管控工具.集成开发环境(IDE)等一系列编程插件,可以满足团队在项目开发中的大部分需求:vs ...

  5. vs2013建立html页面,使用 Visual Studio 2013 创建基本 ASP.NET 4.5 Web 窗体页

    使用 Visual Studio 2013 创建基本 ASP.NET 4.5 Web 窗体页 03/03/2014 本文内容 对于新的 web 应用程序开发,我们建议 Razor Pages. 有关详 ...

  6. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...

    摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...

  7. Visual Studio 2013编译Mozilla NPAPI 示例注意事项

    1.Platform Toolset设置Visual Studio 2013 - Windows XP (v120_xp). 2.Character Set设置Use Multi-Byte Chara ...

  8. Visual Studio 2013 在使用 razor无智能提示的解决办法

    网上看到的方法都差不多,但是我感觉没怎么说详细,因此,截图备注下: 1.开始->Microsoft Visual Studio 2013->Visual Studio  Tools-> ...

  9. Visual Entity 下载列表(最新版为 2.0.0 ,已支持Visual Studio 2013)

    常见问题: http://www.cnblogs.com/ansiboy/archive/2011/04/06/2006839.html 发展线路: 2.x 将支持的功能有: 1.增加重构功能.当修改 ...

最新文章

  1. 图灵2010.09书讯
  2. Kafka 是如何保证数据可靠性和一致性
  3. mysql5.6错误代码
  4. fixed 相对于父容器定位
  5. java 返回页面_spring-mvc返回视图jsp页面及重定向
  6. @enableautoconfiguration注解作用_Spring Boot最核心的27个干货注解,你了解多少?
  7. 插入行政区划编码的sql代码
  8. vlc 网页插件的 使用与控制 API
  9. 如何使用Arduino UNO开发板编程ATtiny85
  10. Java学习笔录3(变量和常量)
  11. 解决 Minimum supported Gradle version is 5.1.1. Current version is 4.6
  12. 国内网页无法加载reCAPTCHA解决方案
  13. .sqlite后缀文件转为sql文件
  14. [转载]一步一步教你如何在Virtualbox虚拟机中安装Remix
  15. VirtualBox 虚拟机 无法启动 报错E_FAIL (0x80004005) 不能为虚拟电脑 打开一个新任务
  16. [极客大挑战2021]web wp
  17. android Google Map API V2 (key 申请)
  18. Eclipse为什么要先安装Tomcat
  19. 多彩标题文字PR字幕模板PR项目工程文件
  20. 详解准确率acc、精确率p、准确率acc、F1 score

热门文章

  1. 经验教训 软件开发_软件可靠性的教训
  2. python3 类中字典类型的实例变量被“篡改”
  3. C#: double转int , String转int
  4. 怎么恢复GoPro运动相机SD卡删除格式化丢失的MP4视频
  5. 字长、字节、字、字位的区别
  6. java drawimage 不显示_drawImage()不显示图片
  7. mysql的sid号怎么查_mysql表查询练习
  8. 关于大数据最深刻解读
  9. 企业想要搭建CRM平台该如何操作?
  10. 小扎遭 Meta 员工炮轰:元宇宙将“杀死”公司