母婴用品网站模板,电商设计类插画,我想做教育网站那里做,网站开发厦门在MFC框架下#xff0c;有很多系统已经定义好的消息#xff0c;例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我们在使用的时候只需要声明并调用就可以了#xff0c;最简单的用法。
提升了一点难度的用法就是自己设置自定义消息#xff0c;再提升一点难度的就是如何…在MFC框架下有很多系统已经定义好的消息例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我们在使用的时候只需要声明并调用就可以了最简单的用法。
提升了一点难度的用法就是自己设置自定义消息再提升一点难度的就是如何模拟系统消息了一般情况下只是做普通的项目开发功能是用不到的。
在这里我首先讲解下如何实现自定义消息再深层次的讲述如何模拟系统消息有需要的可以了解下哟~
自定义消息
在有些时候系统定义的消息不能完全满足程序的应用这时候就需要进行消息自定义了那么该如何实现自定义消息呢
第一步定义自定义消息名称以及ID
在MFC框架下分配了WM_USER之后的消息都是开发人员可以自定义的消息ID。
假设定义一个选中触发消息
#define WM_USER_CLICKED WM_USER1
这种写法就代表了定义了一个自定义消息消息名称叫做WM_USER_CLICKED消息ID号是WM_USER1
在这里温馨提示一句在做大型的绘图开发程序当中为了方便管理自定义消息一般都不会直接使用WM_USER进行编号自增而是使用自定义宏代替WM_USER为了后续方便管理格式如下
#define UIXML_WM_BASE WM_USER 20000#define WM_USER_CLICKED1 UIXML_WM_BASE 0
#define WM_USER_CLICKED2 UIXML_WM_BASE1
#define WM_USER_CLICKED3 UIXML_WM_BASE2
#define WM_USER_CLICKED4 UIXML_WM_BASE3
如果要是你的程序中只存在了一两个自定义消息就没有必要写成上面的格式了。
这种格式的好处
可以根据功能划分自定义消息区域。假设你目前正在开发一个仅供公司内部使用的基础框架类在自定义消息的时候需要区分哪些是自己开发使用的哪些是对外开发者调用的。分工明确不容易消息错乱。
第二步发送自定义消息
想要在哪里触发自定义消息就需要在哪里发送消息。
在MFC框架中有两种发送消息机制SendMessage、PostMessage。
::SendMessage(GetParent()-GetSafeHwnd() , WM_USER_CLICKED ,参数2 , 参数1);
只是举例子说明具体的根据实际功能来确定~
第三步自定义消息映射
ON_MESSAGE(WM_USER_CLICKED1, OnCustomClicked1)
参数一定义的自定义消息
参数二实际窗口中响应的映射消息
第四步自定义消息实现
afx_msg LRESULT OnCustomClicked1(WPARAM wParam , LPARAM lParam);
具体的操作应用可以在OnCustomClicked1中编写了这要根据实际的需求应用了这里不再做过多的说明到这里应该都知道该如何应用了吧~
模拟系统消息
简单的自定义消息方法已经在自定义消息中讲述了下面来一个更深层次的提高吧如何模拟系统消息为了通俗易懂的讲解这里我们模拟ComboBox控件CBN_SELCHANGE消息。
使用过MFC框架下控件开发的人都知道该消息是由系统发送的平时我们只是应用下就可以了要是让自己写一个这样的触发消息该如何实现呢
前提条件继承CWnd类模拟ComboBox控件这时候所有的控件消息都需要自己内部模拟那么想要让外部开发人员调用起来与系统的ComboBox中的消息一致该怎么实现呢
假设我们应用SendMessage进行消息发送此时也是需要发送消息但是需要发送命令消息WM_COMMAND
WM_COMMAND在什么时候被触发呢
1当用户从菜单中选择命令项时
2当控件向其父窗口发送消息时
3当加速键击被翻译时
其实在WINDOW9X以上都是在发送WM_NOTIFY但是为了做成兼容基类所以依旧采用的是WM_COMMAND消息。
一旦指定了使用WM_COMMAND来进行消息发送这时候wParam以及lParam该发送什么数据呢
wParam参数
在发送自定义消息中wParam参数是分成了高字节与低字节之分的需要采用MAKEWPARAM进行发送。
该宏创建了一个32位的无符号值用作消息中的wParam参数该宏连接两个指定的16位值。
在传递参数时高位是当前模拟发送的ID号每个窗口甚至是每个控件都有属于自己的编号不难获取到。
低位是需要触发的系统消息前面说到了模拟的是CBN_SELCHANGE消息所以wParam参数的写法如下
MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE)
LPARAM参数
对于这个参数就当对来说简单了只需要传递当前窗口的HWND转换成LPARAM参数就可以了。
整体的模拟系统发送格式
::SendMessage(pwnd-GetSafeHwnd(), WM_COMMAND, MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE), (LPARAM)GetSafeHwnd());
对于模拟系统发送消息来说最重要的就是SendMessage的第二个参数以及第三个参数了。同样的道理也可以使用PostMessage的方式发送。
消息发送出去之后在外界的使用方式是如何呢
既然我们模拟的是系统消息在外部窗口调用的地方与MFC自带的控件消息方法是一致的
消息映射
ON_CBN_SELCHANGE(ID_CUSTOMCOMBOBOXID, CTestComboboxDlg::OnCbnSelchangeComboSd)
看着这个方法是不是很熟悉与自带的ComboBox方式是不是一模一样后续的使用方式都是一致的啦
我是糯诺诺米团一名C开发程序媛~