七天MFC速成

来源:互联网 发布:淘宝如何添加全屏代码 编辑:程序博客网 时间:2024/05/17 21:42

这其实是一片总结文,七天学会MFC也并非没有这种可能,但是可能性更大的则是掌握一些基础性的东西。
因为学校的的课设突然需要用C++来画图,而我们所学的,只是C++的一点儿基础,画图,别开玩笑了,能给你把一个矩阵打印输出在DOS界面就不错了。
但是学校既然这样要求了,那我也没什么可说的,按要求来吧,咱也没啥可说的,大家各显神通吧。
我也是莫名其妙的就选择了MFC,而这也是我这个星期痛苦的源头。
在使用MFC做课设的时候,我遇到了以下问题:
1:基于对话框绘制图形(这个问题着实让我苦恼了很久)
2:定义一个全局的类对象(这个全局类对象在我的需求中有些特别,为了满足这个需求,也头痛了许久)
3:不同对话框中数据共享(这个在结局啊了全局变量的定义之后,便有了解决的方法)

定义一个全局的类对象:
要求:在整个程序的运行周期内,这个类对象是唯一的,且所有针对这个对象中变量的操作都会使对象成员变量的数据做出相应的改变。有很多方法可以解决这个问题,全局类声明,单例设计,构建一个除构造和析构之外所有函数和变量均为static的类,种种。
我开始时选择创建头文件做一个全局类的声明,这样这个问题在短时间内就解决掉了一半,为什么是一半,用具体的例子说话。

Global.h

#include “Matrix.h”static Matrix *matrix = new Maxtri();//静态的全局声明

将该头文件包含到所有的文件中去,实现定义一个全局变量的目的,但我说过,这只解决了一半的问题。
当我在不同的对话框对这个对象进行不同的操作时发现,在初始对话框中的数据确实是发生了改变,成员变量也对应着操作发生了变化,但是这个变化只在初始的对话框中存在,当弹出另一个对话框时,就会重新初始化这个全局变量,即:
对话框一:

Test1.h

#include “Global.h”//略void CTest1::OnClickButton1(){//弹出新对话框CTest2,设置矩阵元素个数为100CTest ct;  ct.DoModal();matrix->SetElementMount(100);}

对话框二:

Test2.h

#include “Global.h”//略void CTest2::OnClickButton2(){//在对话框二中点击按钮,得到矩阵元素个数int mount;mount = matrix->GetElementMount();}

看起来应该没有什么错误,但是最终对话框二中mount的数据值是0,而不是我在对话框一中设置的100,这也就意味着在新的对话框中matrix被再次初始化。
我查了查,看到有人说这是因为我创建的模态对话框不能与其他对话框交换数据的原因,没办法,也没有人给出验证结果,那还是得我自己来验证,只是一个对话框创建,又花不了太长时间:
对话框一:

Global.h

#include “Global.h”//略CTest1::CTest(){    //其余变量初始化略    m_test2 = NULL;//在CTest1类中创建一个private: CTest2 *m_test2;}void CTest1::OnClickButton1(){matrix->SetElementMount(100);//设置矩阵元素个数if(NULL == m_test2){    m_test2 = new CTest2();    m_test2->Create(IDD_DIALOG, this);}//如果没有创建CTest2的对话框,则创建非模态对话框m_test2->ShowWindow(SW_SHOW);//显示窗口}

对话框是改成了非模态的对话框,但是我所描述的问题依然存在,虽然这个的原因我现在还不知道,但是不妨碍解决这个问题。
这一次,我选择了构建全部静态函数及变量的类。

Matrix.h

class Matrix{    public:        Matrix(); ~Matrix();        static void SetElementMount(int mount);        static int GetElementMount();}static int mount_of_element = 0;//Matrix.cppvoid Matrix::SetElementMount(int mount){    mount_of_element = mount;}int Matrix::GetElementMount(){    return mount_of_element;}

如此定义之后,函数的使用变得就有些麻烦了,因为静态的函数使用需要用(类名::函数名)的方式引用,不过虽然变麻烦了,但是这个问题完美解决了,在非模态对话框中可以实现数据共享,这样,我的第三个问题同时被解决。

画图,我放到了最后,因为这真的让我头疼了一个星期,直到昨天才有了解决的方法,找到解决方法,我终于能松一口气儿了。
MFC画图很简单,CPen,CBrush,LineTo,Ellipse……等等,都只是个函数,调用他们就可以画出简单的图形了。
MFC单文档中可以在CxxxView类中找到OnDraw()函数,然后在这个函数下添加相应的画图代码就可以画出图形,而基于对话框的MFC程序中在CxxxDlg中可以找到OnPaint()函数,在这个函数中相应位置下添加代码也可以画出相应的图形。

CxxxView

if(....){     }else{         CDialogEx::OnPaint();    //在此段注释下添加画图代码}

但是当真正添加了画图的代码之后,我发现图形在初始对话框中就出现了,查找原因的时候发现,OnPaint()函数是在程序一开始就会被调用,而且在程序界面发生变化也会被调用,显然,这不能解决我的问题。
这个需求显然也不只我一个人想过,既然有需求,那就一定有解决的办法,而我也终于找到了方法解决:

CTest3.h

class CTest3: public CDialogEx{protect:    void OnPaint();}//新建对话框三,并且为这个对话框添加一个继承自CDialogEx的类,在类中继承OnPaint()函数

CTest3.cpp

#include “CTest.h”//实现OnPaint()函数//在消息相应事件代码中增加一句ON_WM_PAINT()BEGIN_MESSAGE_MAP(CTest3,CDialogEx)    ON_WM_PAINT()//增加的代码END_MESSAGE_MAP()

到此,我的问题就基本上解决了,我不是MFC高手,我只是才接触MFC七天,七天MFC速成不过是我在往自己的脸上贴金罢了,七天过去了,我只掌握了一点点皮毛的东西,刚好可以拿来应付学校的课设,稍微深入一些我就只能干瞪眼,写这篇总结的目的,也就是为了给那些刚接触MFC,可能遇到我所遇到的这些问题的新手一个解决方法。
其他小组做课设并没有选择MFC,而是Qt一些其他的套件,大家也都是才接触这些,有用Easyx库的同学对我说:“你们都搞了图形界面,我这还是黑黢黢的窗口(DOS界面),都没有图形,好Low啊!”我说:“这黑黢黢的窗口也是很强悍的啊,我的就画画就出来了,你这个做的就很强了。”
我觉得变成工具Low不Low并不是什么大问题,有人能用VC就能写出来好的程序,有人用VS才能勉强写出能运行的代码,这其中差的就是编程的思维以及对算法的理解程度,我们说一个工具很强大,自动补齐,代码高亮……等等特性,就是在说这个工具的使用方式很傻瓜,用着很省心,很方便而已,傻瓜相机和单反相机不就是一个这样的例子吗?
做课设的时间很紧,一个星期多一点儿,而MFC需要现学现卖,我遇到一些问题的时候又总爱跑去各种论坛发帖提问,论坛中也存在一些活跃的大神或者活跃的资深程序员,对于这些人,我厚着脸皮,抱着一丝他们可能回信的侥幸心理发私信询问问题,出乎意料的,大神们竟然抽空回复了我的站内信。
所以,在这里,我真心的向这些没有架子,热心的人们表示感谢。

1 0
原创粉丝点击