MFC入门

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 ________hi 的 blog

该文章为学习了c和c++以及有sdk编程基础的,但还未学习mfc的人员使用,我们开始使用一个基本的内容开始:

在以下的程序中,只使用了两个类cframewnd 和cwinapp,我们先看第一个类:

class sample:public cframewnd
{
public:
sample()
{
create(null,"mfc window");
messagebox("my mfc window","cframe constructor",mb_ok);
}
};

第一个类sample继承了cframewnd类,cframe类是mfc类库中的一个类,用它来代表窗体框架,我们先用sample类继承它,在构造函数调用了create这个函数,在create这个函数时调用的cframewnd类中的函数,使mfc写好的函数,cframewnd中封装了createwindow这个api函数为它的成员函数create(),他们的参数都是像似的。但你会问,createwindow有11个参数,而这里的create函数只用了两个参数,应为这里的create有两个参数为必选参数,后面的参数有默认值

由msdn的定义可以看出

bool create( lpctstr lpszclassname, lpctstr lpszwindowname, dword dwstyle = ws_overlappedwindow, const rect& rect = rectdefault, cwnd* pparentwnd = null, lpctstr lpszmenuname = null, dword dwexstyle = 0, ccreatecontext* pcontext = null );

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

我们再看在看第二个类,继承cwinapp类的app类。

class app:public cwinapp
{
public:
bool initinstance();
bool exitinstance();
};

在这个类中仅仅重写了两个函数,一个initinstance(),一个exitinstance(),这个类是控制整个应用程序的,所以称为cwinapp类,是不可或缺的一个类。而且要运行程序,要将该类实例化。实例化会自动调用构造函数,并调用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程序就讲到这里了。

全部的代码如下:

#include <afxwin.h>

class sample:public cframewnd
{
public:
sample()
{
create(null,"mfc window");
messagebox("my mfc window","cframe constructor",mb_ok);
}
};

class app:public cwinapp
{
public:
bool initinstance();
bool exitinstance();
};

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;
}

bool app::exitinstance()
{
messagebox(0,"my window","exitinstance",mb_ok|mb_iconhand);
return true;
}

app a;

本文关键:MFC入门
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top