初学者分析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)
{
}
- 初学者分析MFC代码3
- 初学者分析MFC代码
- 初学者分析MFC代码
- 初学者分析MFC代码1
- 初学者分析MFC代码2
- 初学者分析MFC代码4
- 初学者分析MFC代码5
- 初学者分析MFC代码6
- 初学者分析MFC代码7
- 初学者这样分析MFC代码(Dialog based工程)- -
- 初学者这样分析MFC代码(Dialog based工程)
- MFC代码架构分析
- MFC初学者
- MFC OnFileNew OnFileOpen过程分析代码
- MFC OnFileNew OnFileOpen过程分析代码
- 090918(星期五):MFC消息路由3, Frame8代码分析2
- 090919(星期六):MFC消息路由4, Frame8代码分析3CWinApp的聚合情况
- DLL初学者指南(非MFC)
- socket网络编程的一些基础知识
- [3-21]论web项目小组的流程以及成员该如何组成
- 初学者分析MFC代码2
- WebService中实现 上传下载文件
- 使用 WebLogic Server 开发Spring 应用程序参考
- 初学者分析MFC代码3
- 360最新cnnic专杀工具-360SuperKill“破冰”技术逆向分析
- C#实现Socket传输简单数据
- 扭曲变换加密
- java 调用存储过程
- 一个jdbc的例子(包含sql语句的批处理,事务处理,数据绑定prepare,)
- 股票的内外盘(转贴收藏)
- Fedora Core 6 服务详解
- Oracle中大批量删除数据的方法