MFC程序编写注意事项

本文总结了MFC编程中的重要知识点与注意事项,包括控件变量类型、对话框类管理、消息处理机制等内容,适用于初学者及有经验的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MFC程序编写注意事项

一、重要知识点总结

1、control型变量可以获得控件的实例,通过这个变量,你可以操纵控件。而value只是用来传递数据,不能对控件进行其它的操作。例如:程序中要设置某控件变灰的话就要设置该控件的变量为Control类别。 如果你添加了一个m_CtrlEditcontrol型变量你可以调用控件支持的所有函数,如:m_CtrlEdit.GetStyle(...)

2、若为对话框新建的类觉得类名没取好,直接删除对应生成的.h.cpp文件再编译一下即可。

3、注意一旦已为对话框生成新的类后不可再更改对话框的ID

4、如果已为某一控件添加变量的话就不要再更改其ID号了。

5、MFC程序的执行步骤是1theApp全局对象定义处,TestApp构造函数,Winmain函数。

6、每一个MFC程序有且仅有一个从应用程序CWinApp派生的类,每一个MFC程序有且仅有一个该派生类的实例化对象,也就是theApp全局对象,该对象表示了应用程序的本身。

7、一个子类构造之前会调用其父类的构造函数,若父类构造函数有形参,则子类需显示的调用父类带参数构造函数,问若父类的构造函没有形参,子类调用父类的构造函数还需写出函数名吗?不用

8、某父类和子类都有同一个函数A,而子类的该函数是一个虚函数,根据多态性原理,程序实际调用的是子类的函数A ???(待验证)

9、MFC应用程序在其AfxWinMain()函数中调用的三个函数完成 设计、注册、创建、显示、更新、消息循环Run()、消息过程函数DefWindowProc()

10、注意:MFC并不是把所有的消息都交给WindowProc()这一过程函数来处理,而是采用消息映射机制来处理各种消息的。(消息映射机制最终还是会调用WindowProc()函数)

11、一个对象能索引出来的元素或函数并不代表带元素或该函数是该对象对应的类的成员。

12、UpdateData(TRUE);// 将各控件中的数据保存到相应的变量 

UpdateData(FALSE); // 根据各变量的值更新相应的控件。

13、程序在什么编译模式下,对应的根据报错添加的路径与宏定义就应在什么模式下添加。

14、CRulesConfDlg(CWnd* pParent = NULL);// 标准构造函数//= NULL意思就是CRulesConfDlg这个窗口没有父窗口

15CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(IDD_LOGIN, pParent)//如果定义一个CLoginDlg类对象时没有(利用CLoginDlg的构造函数)初始化的话,根据CDialogEx函数的构造函数的定义pParent是等于NULL

16、IMPPS_Initial(pParentWnd->GetDlgItem(IDC_SHOW)->GetSafeHwnd());//IDC_SHOW控件只能通过所在类CRulesConfDlg的对象或指针来获得其指针,而不能通过其他方法

16、注意:删除通过MFC向导生成的变量、函数、类都要删除两处

17、可以通过AfxGetApp()->m_pMainWnd方法获得主对话框的指针。

15、每个窗口类都有一m_hWnd成员变量,对话框也不例外??

16、MFC的主对话框的头文件是被两次包含了的,所以不能在主对话框的头文件定义全局变量(对象)的。标准的做法是:在.cpp文件中定义,在.h文件中将其声明为外部的。

17、模态对话框是这样的对话框,当它弹出后,本应用程序其他窗口将不再接受用户输入,只
有该对话框响应用户输入,在对它进行相应操作退出后,其他窗口才能继续与用户交互 (DoModal)

18、非模态对话框则是,它弹出后,本程序其他窗口仍能响应用户输入。非模态对话框一般用
来显示提示信息等。 (由creat函数创建)

19、要在自定义的类中访问主对话框空间,须获得主对话的指针。(方法见总结的文档)

20、向导自动生成的MFC程序是单线程的,即使有很对函数与对话框,除非自己用专门的函数去创造新的线程。

21、什么是父窗口(窗口之间的是没有父子关系的,但是窗口里面的控件与窗口是有父子关系的)

23、模态对话框:要想实现登录对话框中显示登录界面,必需有两个按钮,因为当点击的ID号为IDOK的按钮后,模态登录对话框就自动销毁了,此时一切试图获取登录对话框指针的行为都是非法的。

24、非模态对话框:登录对话框弹出后,即使没点击的ID号为IDOK的按钮,后面的程序会继续执行,注意对于非模态对话框因为是通过new函数动态创建的,故需要手动销毁对于的登录对话框对象的指针(要在主对话框的构造函数对登录对话框对象的指针初始化为空,在主对话框的析构函数销毁登录对话框对象的指针)。

25、UpdateData(TRUE);//有这个函数说明要从外部输入数据

26、树形控件中的每个节点都可以由一个HTREEITEM类型的句柄表示。 

27对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

28GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

29、注意:MFC自己创建的对话框类写的成员函数一定是有对应实例的(对象),鸡琢米的对象都在InitInstance()函数里。

 

二、MFC程序模块化编程

1、主对话框的实例(对象)在通过向导生成对话框模板的时候就会在CRulesConfApp::InitInstance()函数中建立。

2、写模块化MFC程序有两种思路:

其一、其他自己创建的每一个对话框最好在各自生成的对话框类的.cpp文件中定义一个全局的实例,然后在.h中将该对象声明为外部的。在需要用到对话框A的实例的其他对话框B中只需在B.cpp文件中加入A.h文件即可。

其二、在各自生成的对话框类的.cpp文件中定义一个全局的实例,不要在.h中将该对象声明为外部的。在需要用到对话框A的实例的其他对话框B中也不要加入什么头文件,直接在B.cpp文件中将A中定义的全局对象加extern声明一下便可。

注意,以上两种方法也完全适合全局变量。

3、只要定义的是全局对象,则在对象销毁之前对象的所有成员便具有全局的功能。可在另一对话框中通过全局对象引用即可。

4、MFC中的类都是在函数为定义,故都为全局类,类成员便都为全局,不涉及到多个同类对象的话,几乎用不上static修饰符。

5、.cpp文件一般都会有#include "stdafx.h"头文件,.h文件一般都会包含#include "afxcmn.h"#include "afxwin.h"头文件

stdafx.h文件中包含了一些必要的头文件(如afxwin.h

afxwin.hMFC编程的必需文件,其中包含如CStringCEdit类运行所必需的头文件,最好保证该句在头文件首行;它还会调用windows.h,该头文件包含有数据类型的定义、API入口点定义和其它有用的参数信息

afxcmn.h中声明了MFC常用的一些控件类(CListCtrlCProgressCtrlCToolTipCtrl等)


注:由于笔者水平有限,若博文中存在错误或不周之处,还望各位大牛多多指教,有新的经验的时候也会及时更新本博文,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值