WEB开发网
开发学院软件开发VC VC精华教程:MFC入门系列(一) 阅读

VC精华教程:MFC入门系列(一)

 2007-03-22 21:31:43 来源:WEB开发网   
核心提示: 后面的参数都带有一个等号和一个默认的值,我们再看在看第二个类,VC精华教程:MFC入门系列(一)(3),继承CWinApp类的App类,class App:public CWinApp{public:BOOL InitInstance();BOOL ExitInstance();};在这个

后面的参数都带有一个等号和一个默认的值。

我们再看在看第二个类,继承CWinApp类的App类。

class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};

在这个类中仅仅重写了两个函数,一个InitInstance(),一个ExitInstance(),这个类是控制整个应用程序的,所以称为CWinApp类,是不可或缺的一个类。而且要运行程序,要将该类实例化。实例化会自动调用构造函数,并调用InitInstance()这个函数(调用该函数是MFC写好的, InitInstance()并不是凭空就调用的,而是MFC包装了API函数WinMain,在全局对象实例化后(App a; ),就进入WinMain函数,在里面由MFC这个框架已经写好对InitInstance()的调用,我们进入MFC的源码即可看到),因为该函数是一个虚函数,所以我们实例化继承CWinApp类的App类时,会自动调用App::InitInstance()(如果不明白,请复习c++的虚函数),这样就开始了一个应用程序实例的进程。来到的App::InitInstance()函数。

BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}

在这个函数,首先法一个消息框出来,使用MessageBox函数,然后声明一个sample类的指针obj,第三行,为该obj分配内存,即实例化,类的实例化要调用构造函数的初始化,程序的控制点到达sample类的sample函数:

sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}

这里才创建窗体,并且有一个消息框出现,然后程序控制点回到App::InitInstance()的m_pMainWnd=obj;位置。

这一块是个难点,刚开始学的时候,我不明白m_pMainWnd,你从哪里来,来了干什么。他从类CWinThread里来,他的定义为 CWnd* m_pMainWnd;

他凭什么直接用?class CWinApp : public CWinThread 因为MFC中的CWinApp类继承于CWinThread子类中用父类的成员变量,儿子用老爸的钱,当然可以拉,所以他可以直接用。

他有什么用,我们看

sample *obj;
obj=new sample;

这两个是在InitInstance()这个成员函数声明的,也就是说,这个函数结束了,这个指针变量必然要析构,而这个指针是代表窗体框架的,这个指针释放了,那么,窗体也跟着消失了,所以,我们要把这个地址留下来,就给了m_pMainWnd这个指针了,他是在线程类中的,有线程他就在,程序结束了,没线程了,他也消失了,窗体框架也就结束了。

到现在我们还只是在内存中,创建了一个窗体,没有显示出来,那么

  obj->ShowWindow(SW_SHOWMAXIMIZED);

通过这一句,用指针调用类的成员函数,在CFrameWnd中,还封装了ShowWindow这个API函数,用法和API函数一样。

在return TRUE;这句之后该函数结束。

程序进入了运行状态,在关闭程序的时候,会调用ExitInstance()这个函数,该函数仅仅输出一个消息框就结束了。那么这个简单的MFC程序就讲到这里了。

上一页  1 2 3 

Tags:VC 精华 教程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接