03手寫一個簡單的應用程序,消息映射宏的使用

mfc.h

#pragma once
//mfc.h
#include <afxwin.h>//寫mfc程序需要包含這個文件
//1)應用程序類 CWinApp, 派生類(子類)
//應用程序類 CWinApp的派生類
class MyApp:public CWinApp
{
public:
	//基類的虛函數
	//派生類只是重寫
	//MFC程序的入口地址
	virtual BOOL InitInstance() ;//這個函數不需要顯示調用,默認執行,對全局引用程序對象進行初始化
};

//2)框架類 CFrameWnd的派生類
class MyFrame:public CFrameWnd
{
public:
	MyFrame();
	//在框架類內進行鼠標的左鍵單擊應用消息,所以映射宏聲明在框架類裏面

	DECLARE_MESSAGE_MAP();//聲明消息映射宏映射表
	afx_msg void OnLButtonDown(UINT, CPoint);
	afx_msg void OnPaint();
	
};

/*
(1).定義兩個類來繼承自兩個基類,在應用程序類定義一個對象,
然後在對象的構造函數裏面創建框架類對象,進行創建窗口,更新窗口等操作,最後保存這個框架類
對象指針
mfc流程
(1)有且只有一個全局的應用程序類對象
(2)在程序入口函數實現功能InitInstance()
1.給框架類MyFrame對象動態分配空間(自動調用它的構造函數)
框架類MyFrame對象構造函數裏創建窗口CWnd::Create
2.框架類對象顯示窗口ShowWindow( int nCmdShow );
3.框架類對象更新窗口CWnd::UpdateWindow
4.保存框架類對象指針CWinThread::m_pMainWnd
(3)
注意:CWnd是所有窗口的基類,所有的函數都是繼承自這個基類
查詢的時候要加上基類,如CWnd::showwindow
(4)消息映射宏的實現原理(通過宏將指定的消息映射到派生類的成員函數)
1、MFC中用DECLARE_MESSAGE_MAP宏聲明消息映射函數;
2、MFC中用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏實現消息映射;
3、每個MFC應用程序中都存在一個消息響應鏈表,這個表由DECLARE_MESSAGE_MAP定義,並
由BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏之間的代碼填充內容。這樣,取得消息後,MFC
會查詢這個表,對於感興趣的消息會調用其響應函數,對於沒有處理的消息,會繼續查詢其父類的映射表。
afx_msg是限定符,表明是消息響應函數。

在類視圖雙擊類名就可以跳轉到類的聲明處


映射機制的原理
Windows 下的程序包括 Windows 系統都是基於消息機制的。
MFC消息映射機制的具體實現方法是:在每個能接收和處理消息的類中,定義一個消息和消息響應函數的靜態對照表,即消息映射表;
在消息映射表中,消息與對應的消息處理函數指針是成對出現的。某個類能處理的所有消息及其對應的消息處理函數的地址都列在這個類所對應的靜態表中;
當有消息需要處理時,程序只要搜索該消息靜態表,查看錶中是否含有該消息,就可以知道該類能否處理此消息;
如果能處理該消息,則同樣依照靜態表能很容易找到並調用對應的消息處理函數!



*/

mfc.cpp

//純手寫一個mfc程序,選擇win32項目,屬性裏面要不要使用“window”標準庫,選擇“在共享DLL中使用MFC”
//mfc.cpp
#include "mfc.h"

//有且只有一個全局的應用程序類對象
MyApp myapp;
//這是程序的入口地址,裏面封裝了WinMain函數
BOOL MyApp::InitInstance()
{
	/*
	1、創建框架類對象
	2、顯示(框架類)窗口
	3、更新(框架類)窗口
	4、保存框架類對象指針
	*/
	//1.創建框架類對象
	MyFrame *frame = new MyFrame;//會調用構造函數,在構造函數裏面創建一個窗口

	//2。顯示窗口
	frame->ShowWindow(SW_SHOWNORMAL);
	//3.更新窗口
	frame->UpdateWindow();
	//4、保存框架類對象指針--//這個指針是隱藏的,且必須保存,留給後面的程序使用。使用此數據成員存儲指向您的線程的主窗口對象。
	//在 CWinApp 中有一個名爲 m_pMainWnd 的成員變量。 該變量是一個 CWnd 類型的指針,它保存了應用程序框架窗口對象的指針。也就是說,是指向 CFramWnd 對象(框架窗口類對象)的指針。
	m_pMainWnd = frame;
	return TRUE;
}

//定義消息宏--通過宏將指定的消息映射到派生類的成員函數,(指定了哪一個類接受消息)
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
	ON_WM_LBUTTONDOWN()
	ON_WM_PAINT()
END_MESSAGE_MAP()
//這裏的目的主要是爲了生成類的消息映射表中項--處理的消息類型,類裏面有消息的處理函數

MyFrame::MyFrame()
{
	//CWnd類的成員函數  CWnd::Create
	//父類的父類的成員函數
	//CFrameWnd 繼承於 CWnd
	Create(NULL, TEXT("First MFC"));
}

void MyFrame::OnLButtonDown(UINT, CPoint)
{
	MessageBox(_T("這是鼠標單擊的消息的響應函數"));
}

void MyFrame::OnPaint()
{
	//在屏幕上輸出一段文字
	CPaintDC cdc(this);
	cdc.TextOutW(100, 100,_T("你好呀"));

}
/*
 * 	
	事件處理
		消息映射:
		1:所操作框架類中,聲明消息映射宏  DECLARE_MESSAGE_MAP();
		2.在對應的cpp裏面定義宏
			BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)//派生類名,基類名
			ON_WM_LBUTTONDOWN()//消息映射入口
			END_MESSAGE_MAP()//
		3.對應類中消息處理函數的聲明
			afx_msg void OnLButtonDown(UINT, CPoint);
		4.對應.cpp消息處理函數的定義
			MessageBox(TEXT("鼠標左鍵"));
 */

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章