人比较懒,一直没有写博客的习惯,但学的东西多了,就把前面的给望了,现在是到了逼不得已的时候了。
以前没有接触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。有很多细节还不是很清楚。我只是把我每天学的东西都记下来,以后望了,有个查处。。。今天就记到这里了。