初探MFC

人比较懒,一直没有写博客的习惯,但学的东西多了,就把前面的给望了,现在是到了逼不得已的时候了。

  以前没有接触MFC,只对SDK有点研究。现在要用到MFC。就把学习笔记写到这里吧。这是第一篇。

  MFC是微软的类库。开发MFC应用程序时,我们可以使用VC的lassWizard创建向导,它帮我们省去了很多事情。

但是,省去的这些事情。是我们必须得明白的。不然,对一个初学者来说,会很难搞懂他在干些什么。最大的疑惑就是

我们的WinMain去哪里了。。。主函数数都没有,程序怎么跑起来的。现在我来贴一份代码。代码工程是VC6.0的Win32

application工程的空工程。


#include 
<AFXWIN.H>

#define IDC_BUTTON 100

class CButtonApp:public CWinApp
{
public:
	virtual BOOL InitInstance();
};

CButtonApp ButtonApp;



class CButtonWindow:public CFrameWnd
{
	CButton* button;
public:
	CButtonWindow();
	 void HandleButton();
	 void OnSize(UINT,int,int);
	DECLARE_MESSAGE_MAP()
};



BOOL CButtonApp::InitInstance()
{
	m_pMainWnd = new CButtonWindow();
	m_pMainWnd-> ShowWindow(m_nCmdShow);
	m_pMainWnd -> UpdateWindow();
	return TRUE;
}

void CButtonWindow::HandleButton()
{
	MessageBeep(-1);
}

void CButtonWindow::OnSize(UINT nType,int cx,int cy)
{
	CRect r;
	GetClientRect(&r);
	r.InflateRect(-20,-20);
	button->MoveWindow(r);
}

BEGIN_MESSAGE_MAP (CButtonWindow,CFrameWnd)
	ON_BN_CLICKED(IDC_BUTTON,HandleButton)
	ON_WM_SIZE()
END_MESSAGE_MAP()

CButtonWindow::CButtonWindow()
{
	CRect r;
	//创建主窗口
	Create(NULL,
		   "HuErr",
		   WS_OVERLAPPEDWINDOW,
		   CRect(200,200,400,400));
	GetClientRect(&r);
	r.InflateRect(-20,-20);
	button = new CButton();
	//创建按钮
	
button->Create("按
下",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(20,20,180,180),this,IDC_BUTTON);
}

这就是一个最简单的MFC框架,比VC的MFC向导创建的简单很多。我们现在就来讲解下这几行代码。</p>

我们发现这个框架中也没发现WinMain。那么,程序是怎么运行起来的呢?关键就是这个 CWinApp类

这个类是在程序创建的时候使用。并且每个程序只能使用一次。我们能过

class CButtonApp:public 
CWinApp
这行代码来派生出来一个新类。CButtonApp 我们就可以重载 InitInstance();函数。
CButtonApp ButtonApp; 
我们通过这行代码给我们派生出来的这个类定义了一个实例,这个实例是全局的。
当程序装载到内存后,程序会调用 CWinApp 的构调函数。该构造函数再去调用 InitInstance()函数。

下面我们再通过 
class CButtonWindow:public 
CFrameWnd
CFrameWnd 这个类又派生出一个新类。CButtonWindow 它就是应用程序显示的窗口。我们自己的处理的代码会写在
这个构造函数里面。如创建一个按钮这样的细节。
在SDK里面我们要自己处理消息。也就是我们说的消息回调函数WndProc。那么在MFC里面我们该怎么处理我们的消息呢?

关键代码就在窗口类 CButtonWindow 中的 DECLARE_MESSAGE_MAP() 这个宏

MFC提供了三个宏管理消息映射,它们是DECLARE_MESSAGE_MAP(),BEGIN_MESSAGE_MAP()和
END_MESSAGE_MAP()。

在每一个CCmdTarget的派生类的定义中,都包含DECLARE_MESSAGE_MAP(),用于声明一个消息映射表的构成。
在该类的实现文件中都包含BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP(),构成一张消息映射表,前者标志着消息映射表的开
始,
后者标志着消息映射表的结束。

我们在代码中可以看到
BEGIN_MESSAGE_MAP (CButtonWindow,CFrameWnd)
    ON_BN_CLICKED(IDC_BUTTON,HandleButton)
    ON_WM_SIZE()
END_MESSAGE_MAP()
这里我们实现了Button的按下。

我也只是刚刚开始MFC。有很多细节还不是很清楚。我只是把我每天学的东西都记下来,以后望了,有个查处。。。今天就记到这里了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值