*系统消息的发送:
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;
}