当前在Resource 选项卡上,中左下角ClassView有很标新立异的C++类的图标,分别表示着不同的意思,进入里面慢慢看就知道,类中变量声明private的前面加锁,protected的前面加钥匙
public的就没加。
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMyDlg dlg;
m_pMainWnd = &dlg; <===这里 框架自己生成
int nResponse = dlgDoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
CWinThread类的常用重载函数如下:
1、重载InitInstance函数用与执行线程实例的初始化工作。函数声明如下:
virtual BOOL InitInstance();
2、重载ExitInstance函数用于执行清理工作,函数声明如下:
virtual int ExitInstance();
3、重载OnIdle函数用于执行线程空闲处理工作,函数声明如下:
virtual BOOL OnIdle(
LONG ICount //计数器
);
一CFormView类优点:
MFC创建基于对话框的应用程序存在对话框大小无法改变大小的问题程序移植遇到不同分辨率显示器就可能产生显示不全的问题基于CFormView的派生类可以解决这个问题
二单文档应用程序使用:
两种方法第一种是在创建单文档应用程序过程中直接将派生于CView类的CXXXView类的基类修改为CFormView,除了经典的文档视类结构之外,MFC将额外生成一个对话框资源,ID为"IDD_XXX_FORM"同时,该对话框通过枚举与"CXXXView"类关联
[cpp] view plain copy
//View类派生于CFormView
class CSDITestView : public CFormView
{
protected: // 仅从序列化创建
CSDITestView();
DECLARE_DYNCREATE(CSDITestView)
public:
//主对话框与类关联
enum{ IDD = IDD_SDITEST_FORM };
第二种方法:已经按照默认流程创建完单文档应用程序了之后再创建基于CFormView类的对话框时最好不要手动修改CXXXView的基类为CFormView,再手动添加一个对话框
而是要通过以下步骤实现:
1新建一个单文档应用程序
2菜单栏”项目”选择”类向导”,在”添加类”d出式对话框中输入类名,”基类”选择为”CFormView
3在单文档应用程序的CXXXApp的实现文件顶部添加”#include ‘新类的头文件名’”
4在CXXXApp类的”InitInstance()”函数的”CSingleDocTemplate”类型(注册应用程序的文档模板,文档模板将用作文档,框架窗口和视图之间的连接)连接视类时,将视类替换为我们新添加的CFormView类派生的对话框类
5编译通过运行之后发现对话框可以在单文档一启动就显示了
[cpp] view plain copy
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate pDocTemplate;
//pDocTemplate = new CSingleDocTemplate(
// IDR_MAINFRAME,
// RUNTIME_CLASS(CSDITestDoc),
// RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
// RUNTIME_CLASS(CSDITestView));
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDITestDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CSDIFormDlg));
接下来就可以像 *** 作对话框应用程序一样直接 *** 作单文档应用程序了需要注意的是CFormView派生类没有"OnInitDialog"函数对话框的初始化(或者说习惯开始函数)可以放在"OnInitialUpdate"中完成
三多文档应用程序中实现两个对话框以选项卡的方式显示
1按照上述方法创建两个派生于CFormView的对话框
2为了让不同的选项卡显示不同的名字,可以在字符串表(string table)里新建一个字符串资源以备使用如下图所示
3将"CXXXApp"类的CMDITestApp::InitInstance()函数中的pDocTemplate修改为该类的成员变量并且新加一个相同类型的成员变量
[cpp] view plain copy
public:
CMultiDocTemplate pDocTemplate;
CMultiDocTemplate pChildDocTemplate;
4新增的文档模板将第二个对话框与框架和文档连接起来与pDocTemplate连接方法一致函数的第一个参数可以设置为步骤2新建的那个字符串资源
5测试此时还是不能同时打开两个对话框需要注释掉程序自动生成的新建文件函数,重载本类的新建文件函数
[cpp] view plain copy
//注释掉默认的文件新建函数
//ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)
//重载使用自己的文件新建函数
ON_COMMAND(ID_FILE_NEW, &CMDITestApp::OnFileNew)
6重载的文件新建函数中内容如下
[cpp] view plain copy
void CMDITestApp::OnFileNew()
{
// TODO: 在此添加命令处理程序代码
pDocTemplate->OpenDocumentFile(NULL);
pChildDocTemplate->OpenDocumentFile(NULL);
}
第一个问题比较有意思,事实这也是C++语言的规范。一个类可以通过其基类类型的指针传递,但不应该以其派生类的类型传递。
第二个问题 与删不删没关,只与虚函数机制有关。
CWinApp pApp=theApp是有问题的,因为theApp你定义的是一个对象,可以:
CWinApp pApp=&theApp。不知道你讲的一目了然指的是什么,这里提到的都是C++知识,与MFC并没关系。
bcb默认不会给工程创建stdafxh的,要把皮肤嵌进去就有点麻烦了
,你说的是适合用在mfc的
你说的是mfc才要stdafxh,你没用过bcb你怎么知道一定要有stdafxh的?你想得也太绝对了吧。都说bcb的工程是没有stdafxh的咯
这个问题我也遇到了,但是网上没找到现成的答案,根据MFC的源码和MSDN的对InitInstance的描述猜测一下:
1,通过类向导添加的InitInstance直接return CWinThread::InitInstance();,而CWinThread::InitInstance()跟进去看了一下,也只有一句return FALSE;
2,MSDN中说道,InitInstance() 返回TRUE是成功,FALSE是失败,显然默认是返回初始化失败,所以不进入Run,而是当成初始化线程失败,直接退出线程了,所以跑到ExitInstance里去了;
解决办法:把生成的代码注掉,改成return TRUE;
深入浅出MFC中应该讲的很清楚,不过我看过了好几年了,你肯定会了,我是最近看的这本书,里面是这样说的,也算是我自己的理解哈!
首先,MFC程序先执行到TheApp实例化对象也就是通过这句CTestApp the App来实例化对象的
然后,调用CTestApp构造函数分配内存空间
然后,就调用了AfxWinMain函数(这个是MFC/SRC下的源码,安装软件后电脑上会有,跟踪也会跟踪的到)
然后,AfxWinMain指向AfxWinInit()函数
然后,AfxWinMain执行InitApplication,这个地方InitApplication是虚函数,调用的是CWinApp::InitApplication
然后,AfxWinMain指向InitInstance,在这里面调用了CTestFrameWnd的构造函数,产生了主窗口
然后,显示窗口,更新窗口发送标准消息WM_PAINT
最后回到AfxWinMain,执行run函数,进入消息循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)