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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很经典的MFC教程。 目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值