初学者分析MFC代码3

来源:互联网 发布:十二楼李渔知乎 编辑:程序博客网 时间:2024/06/11 06:28

作者:liguisen

blog:http://blog.csdn.net/liguisen/

从前两篇我们得出一个经验:要删代码,先从cpp文件找起(废话,这是实现文件啊)。
    闲话休提,看看Test1.cpp:(为了看起来方便一些,我不得不一次又一次的贴代码,还好,代码会越来越少)
/////////////////////////////////////////////////////
Test1.cpp:
#include "stdafx.h"
#include "Test1.h"
#include "Test1Dlg.h"
CTest1App::CTest1App()
{
}

CTest1App theApp;

BOOL CTest1App::InitInstance()
{
 CTest1Dlg dlg;
 m_pMainWnd = &dlg;
 dlg.DoModal(); 
 return FALSE;
}
///////////////////////////////////////////////////
    CTest1App::CTest1App()
    {
    }
    这是什么?CTest1App出现了2次,函数名和类名一样?对,这就是构造函数!可是它里面是空的,什么都没有构造,不说了,删!当然,.h中的声明也要一起删啊。
    还有,m_pMainWnd = &dlg这一句,仅仅是一个赋值操作,并且我们发现m_pMainWnd在整个代码中只出现了一次(可利用搜索功能),似乎没有用到,于是把它也删了。编译,运行,还是没有问题。

    细心的你还发现CTest1App theApp这一句仅仅是声明了一个变量,并且theApp也只出现了一次,毫不犹豫,删,编译,没问题,运行,咣当,出现了一个对话框,什么什么内存不能读。这种问题对初学者是致命的,大不了不删呗,加回去!让我们记住,theApp是一个很重要的东西。

    再仔细观察Test1Dlg.cpp。
///////////////////////////////////////////////////////////
Test1Dlg.cpp:
#include "stdafx.h"
#include "Test1.h"
#include "Test1Dlg.h"

CTest1Dlg::CTest1Dlg(CWnd* pParent )
 : CDialog(CTest1Dlg::IDD, pParent)
{
}

BEGIN_MESSAGE_MAP(CTest1Dlg, CDialog)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
END_MESSAGE_MAP()

BOOL CTest1Dlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 return TRUE; 
}

void CTest1Dlg::OnSysCommand(UINT nID, LPARAM lParam)

 CDialog::OnSysCommand(nID, lParam);
}

void CTest1Dlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this);
 }
 else
 {
  CDialog::OnPaint();
 }
}
///////////////////////////////////////////////////////////////
    先看OnSysCommand这个函数,从函数名来看,Sys是system的意思,这是系统命令函数?要小心!回忆一下我们在这个应用程序上的操作,上面有两个按钮,“确定”、“取消”,都可以退出程序;在标题栏上有个单击右键的操作,出来一个菜单,现在只剩下“移动”和“关闭”两个操作了,对了,对话框右上角还有个“×”可以关闭。所有的操作都在这里了,会不会和OnSysCommand有关?删掉试一试,同时也删掉它在.h中的声明afx_msg void OnSysCommand(UINT nID, LPARAM lParam)以及在BEGIN_MESSAGE_MAP(CTest1Dlg, CDialog)里面的一句ON_WM_SYSCOMMAND(),这是什么就先不要管了;。又要编译运行了,没有任何变化,是不是意味着我们这些操作和OnSysCommand无关?实际上是有关的,目前不必理会。
    跟着我们再看看OnInitDialog(),从函数名来看,是做对话框初始化工作的,但我们好像没有做什么初始化啊,删!不用编译运行了,我保证,程序还可以运行:)。
    还有一个OnPaint函数,看函数名应该是画东西的(奇怪,画什么东西啊?)。先告诉你IsIconic()是判断是否有最小化的,我们的对话框不能最小化,所以这段代码可以删,剩下:
void CTest1Dlg::OnPaint()
{
 CDialog::OnPaint();
}
运行没问题,干脆把它一整个删掉吧,同时.h中的声明也可以删掉,那么
BEGIN_MESSAGE_MAP(CTest1Dlg, CDialog)
ON_WM_PAINT()
END_MESSAGE_MAP()
中的ON_WM_PAINT()也可以删掉(都有paint嘛),就剩下BEGIN_MESSAGE_MAP然后就马上END了,应该也可以删掉,它在.h中的声明DECLARE_MESSAGE_MAP()也可以删掉,啊,删了好多,运行,没问题!
    还能再删吗?不能了吧?

 

 

看看我们的成果(代码少得不能再少了,大部分是include头文件):
////////////////////////////////////////////////////////
StdAfx.h:
#include <afxwin.h>        
#include <afxext.h>        
#include <afxdisp.h>       
#include <afxdtctl.h>
///////////////////////////////////////////////////////////
StdAfx.cpp:
#include "stdafx.h"
////////////////////////////////////////////////////////
Test1.h:
#include "resource.h"
class CTest1App : public CWinApp
{
public:
 virtual BOOL InitInstance();
};
///////////////////////////////////////////////////////
Test1.cpp:
#include "stdafx.h"
#include "Test1.h"
#include "Test1Dlg.h"
CTest1App theApp;
BOOL CTest1App::InitInstance()
{
 CTest1Dlg dlg;
 dlg.DoModal(); 
 return FALSE;
}
//////////////////////////////////////////////////
Test1Dlg.h:
class CTest1Dlg : public CDialog
{
public:
 CTest1Dlg(CWnd* pParent = NULL); 
 enum { IDD = IDD_TEST1_DIALOG };
};
/////////////////////////////////////////////////////
Test1Dlg.cpp:
#include "stdafx.h"
#include "Test1.h"
#include "Test1Dlg.h"
CTest1Dlg::CTest1Dlg(CWnd* pParent )
: CDialog(CTest1Dlg::IDD, pParent)
{
}

 
原创粉丝点击