MFC中消息映射实例

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

会查询这个表,对于感兴趣的消息会调用其响应函数,对于没有处理的消息,会继续查询其父类的映射表。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

1、新建MFC工程MsgInMfc;

2、在其上添加一个多行文本框,其ID为IDC_EDT_INPUT;

3、在其上添加一个静态文本控件,其ID为IDC_LEN;

4、将“确定”按钮ID改为IDC_BTN_CLEAR,并将其文本改为“清空”;

///主对话框头文件中添加
         afx_msg void OnBtnClear();///清楚按钮的响应函数
	afx_msg void OnEdtInputChange();  
	afx_msg void OnEraseBackGround(WPARAM wp ,LPARAM lp);///自定义消息:参数格式一定


//清空按钮响应函数
void CMsgInMfcDlg::OnBtnClear() 
{
	// TODO: Add your control notification handler code here
	//清除输入文本框中的字符
	SetDlgItemText(IDC_EDT_INPUT ,_T(""));
	OnEdtInputChange();
}
//EN_CHANGE消息的响应函数
void CMsgInMfcDlg::OnEdtInputChange() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	///获取输入文本框句柄
	HWND hEdit = ::GetDlgItem(m_hWnd ,IDC_EDT_INPUT);
	///获得文本框中文字的长度
	int nLen = ::SendMessage(hEdit , WM_GETTEXTLENGTH ,0 , 0);
	//显示长度到界面
	TCHAR szBuf[128] = {0};
	_stprintf(szBuf , _T("已输入:%d") , nLen);
	SetDlgItemText(IDC_LEN ,szBuf);
	// TODO: Add your control notification handler code here
	
}
///WM_ERASEBKGND消息的响应函数
void CMsgInMfcDlg::OnEraseBackGround(WPARAM wp ,LPARAM lp)
{
	///用自定义的颜色填充窗体背景
	HDC hDC = (HDC )wp;  ///*****************************
	RECT rc = {0};
	GetClientRect(&rc);
	HBRUSH hb = CreateSolidBrush(RGB(100,150 ,200));
	FillRect(hDC , &rc ,hb);
	DeleteObject(hb);
}
///主对话框源文件中添加映射消息和响应函数
        ON_BN_CLICKED(IDC_BTN_CLEAR, OnBtnClear)
	ON_EN_CHANGE(IDC_EDT_INPUT, OnEdtInputChange)
	ON_MESSAGE(WM_ERASEBKGND, OnEraseBackGround)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()




说明:

1、在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加消息映射代码时要注意:手动添加的代码要放在特殊的注释行“//}}AFX_MSG_MAP”之后,以免影响类向导的运行;

2、程序中,映射WM_ERASEBKGND消息时,采用了ON_MESSAGE宏。使用类似的方法,此宏可以映射任何一个系统消息

3、MFC预先对常用的消息都做了专门的映射宏以简化代码,如本例中的WM_REASEBKGND消息对应的宏是ON_WM_REASEBKGND。这些宏都定义在MFC的头文件“AFXMSG_.H”中





你可能感兴趣的:(Windows,消息)