MFC中系统消息和自定义消息的发送

*系统消息的发送:

MFC中两种消息发送的方式

  • 第一种是同步发送的PostMessage(),这个函数将一个消息放入窗口的消息队列,然后直接返回,并不等待对应的窗口处理消息。消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。
  • 第二种是异步发送的SendMessage(),这个函数向窗口发送指定的消息。SendMessage成员函数直接调用窗口过程并在窗口过程处理了消息以后才返回。这与PostMessage成员函数形成对比,该函数将消息放入窗口的消息队列并立即返回。

一般软件内部的消息都是由MFC中的类向导自己生成和维护,而窗口之间发送消息需要自己发送。下面是一个窗口体之间发送的例子。
1、使用SetCapture捕获选择窗口外面的鼠标。

void C发送消息Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (point.x>= m_trCtrl.left && point.x <= m_trCtrl.right||
		point.y>= m_trCtrl.top && point.y<=m_trCtrl.bottom)
	{
		m_bCapturing = TRUE;
		SetCapture();//捕获窗口之外的鼠标
		SetCursor(m_hCursor);
	}

	CDialogEx::OnLButtonDown(nFlags, point);
}

2、通过捕获的鼠标位置(基于客户区)将其转化为屏幕区的位置。通过屏幕区的位置获取鼠标所指位置所在的窗口体句柄。通过窗口提句柄获取窗口类和窗口标题。

void C发送消息Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	if (m_bCapturing)
	{
		ReleaseCapture();
		m_bCapturing = false;
		POINT pt = point;
		ClientToScreen(&pt);//将客户区的坐标转化为屏幕区的坐标
		m_hwndDest = ::WindowFromPoint(pt);//获取窗口句柄
		TCHAR szBuf[MAX_PATH] = {0};
		CString str;
		str.Format(_T("0x%.8X"), m_hwndDest);
		//_stprintf(szBuf,_T("0x%X"), m_hwndDest);
		SetDlgItemText(IDC_EDT_HWND, str);
		GetClassName(m_hwndDest, szBuf, MAX_PATH);//通过窗口句柄获取窗口类
		SetDlgItemText(IDC_EDT_CLASS, szBuf);
		::SendMessage(m_hwndDest,WM_GETTEXT,MAX_PATH,(LPARAM)szBuf);//通过窗口句柄发送															//获取窗口标题
		SetDlgItemText(IDC_EDT_TEXT, szBuf);

	}

	CDialogEx::OnLButtonUp(nFlags, point);
}

3、建立按钮单击函数发送窗体之间的函数。

void C发送消息Dlg::OnBnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码
	CString str;
	GetDlgItemText(IDC_EDT_TEXT,str);
	::SendMessage(m_hwndDest, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)str);//向窗口体发送设置窗															//口体标题。
}

在这里插入图片描述

自定义消息的发送:

自定消息的定义有两种,下面我们分别介绍:
第一种:使用#define 定义消息ID。
1、在使用自定义消息的类中定义消息。注意自定义效益都要大于0x0400,如果小于0x0400,则消息为系统消息。一般定义的时候都是WM_USER+ * 定义消息ID。

#define WM_MY_DEFINED_MSG (WM_USER + 101)

2、在类中.CPP创建消息映射函数

ON_MESSAGE(WM_MY_DEFINED_MSG, &C自定义消息Dlg::OnEn)

3、在类中.h定义消息映射函数

afx_msg LRESULT OnEn(UINT nID, LPARAM lParam);

4、具体实现消息映射函数


LRESULT C自定义消息Dlg::OnEn(WPARAM wParam, LPARAM lParam)
{
	CString str;
	str.Format(_T("收到消息:WM_MY_DEFINED_MSG,ID=0x%X"), 
		WM_MY_DEFINED_MSG);
	SetDlgItemText(IDC_EE, str);
	return 0;
}

第二种方式:RegisterWindowMessage()函数注册ID
1、在使用自定义消息的类中定义一个注册的字符串。

#define MY_REGISTERED_MSG_STR  _T("MY_MSG_STRING")

2、定义一个UINT型的ID

UINT WM_MY_REGISTERED_MSG;

3、使用RegisterWindowMessage(定义的字符串)函数注册ID,返回值为消息映射的ID

WM_MY_REGISTERED_MSG = 
RegisterWindowMessage(MY_REGISTERED_MSG_STR);

4、在类中.CPP创建消息映射函数,注意是ON_REGISTERED_MESSAGE

ON_REGISTERED_MESSAGE(WM_MY_REGISTERED_MSG, &C自定义消息
Dlg::Onddd)

5、在类中.h定义消息映射函数

afx_msg LRESULT Onddd(UINT nID, LPARAM lParam);

6、具体实现消息映射函数


LRESULT C自定义消息Dlg:: Onddd(UINT nID, LPARAM lParam)
{
	CString str;
	str.Format(_T("收到消息:WM_MY_DEFINED_MSG,ID=0x%X"), 
	WM_MY_DEFINED_MSG);
	SetDlgItemText(IDC_EE, str);
	return 0;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值