如何在MFC对话框之间自定义消息传递

如何在MFC对话框之间自定义消息传递,第1张

1消息发送方:发送消息

  首先在A的头文件(h)中自定义这个消息:

1 #define WM_MyMessage WM_USER+100

或者: 

1 const UINT WM_MYMESSAGE = WM_USER + n

 需注意以下几点: 

所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数n来表示的, n一般至少大于100

该消息一般加在stdafxh 或resourceh 或h中,一般都是全局变量头文件

A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息。

回到顶部

2消息接收方:接受消息

  消息接收方对象接受一个消息,需有以下三部分:

在头文件(h)中有该消息的处理函数的原型;

在实现文件(cpp)中有接受消息映射的宏;

在实现文件(cpp)中有该消息的处理函数的具体实现。

21 头文件中加上自定义消息的处理函数原型

  在DECLARE_MESSAGE_MAP()语句之前,加如下形式的函数原型:

1 afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

对Win32来说,wParam, lParam是传递消息最常用的手段。

22 实现文件中加上接受消息映射的宏

  在cpp文件里,BEGIN_MESSAGE_MAP语句之后,加如下形式的代码:

1 ON_MESSAGE(WM_MyMessage, OnMyMessage)

 也就是说WM_MyMessage消息对应OnMyMessage函数。注意,上面是不用分号结尾的。

23 在实现文件中给出消息处理函数的具体实现

1 LRESULT CBDlg::OnMyMessage( WPARAM wParam, LPARAM lParam )

2 {

3 //处理用户自定义消息

4

5 return 0;

6 }

你可以设置一个全局变量bool stop = false,

点击按钮,启动线程,线程函数开始采集

再次点击,修改stop=true,线程函数检测到stop改变,于是退出采集

  在类视图中选择要添加消息相应函数的类,右击->属性,消息选项卡选择要添加的函数。

  把输入光标定在一个类的类名上,然后 “Ctrl+Enter”,调出属性面板,在面板上就可以看到有消息映射的按钮了。

  切换过去只后,就可以看到所有能自动添加消息映射的消息了。

在MFC中,可以通过以下步骤建立消息响应函数与控件对应的关系:

打开MFC应用程序的资源视图,双击对应的对话框资源文件(dlg文件)打开对话框编辑器。

在对话框编辑器中,选择要添加消息响应函数的控件。例如,选择一个按钮控件,然后右键单击该控件,在d出的上下文菜单中选择“添加事件处理程序”。

在d出的“添加事件处理程序”对话框中,选择要添加的消息类型。例如,选择“BN_CLICKED”表示添加“单击”消息的响应函数。

在“添加事件处理程序”对话框中,选择要添加响应函数的类。这里需要选择的是包含响应函数的类,通常是该对话框所在的类。

在“添加事件处理程序”对话框中,输入要添加的响应函数的名称。这个名称需要以“On”开头,后面跟上消息类型和控件的ID,例如“OnBnClickedButton1”。

点击“添加”按钮,将响应函数添加到代码中。然后,在响应函数中编写具体的处理逻辑。

完成上述步骤后,消息响应函数就与控件对应起来了。当用户 *** 作控件时,MFC会自动调用相应的消息响应函数来处理该消息。

vc60 afx_msg void OnAdd(WPARAM wParam, LPARAM lParam);vc6+ afx_msg LRESULT OnAdd(WPARAM wParam, LPARAM lParam);

  MFC基于对话框——右键d出菜单,并响应函数。

  1、新建一个菜单资源,比如把菜单的ID号为IDR_MENU1。

  2、在ClassWizard中

  void CArcSoft_EffectDlg::OnRButtonDown(UINT nFlags, CPoint point)

  {// TODO: Add your message handler code here and/or call default

  CMenu menu; //定义下面要用到的cmenu对象

  menuLoadMenu(IDR_MENU1); //装载自定义的右键菜单;

  CMenu pContextMenu=menuGetSubMenu(0); //获取第一个d出菜单,所以第一个菜单必须有子菜单;

  CPoint point1;//定义一个用于确定光标位置的位置;

  GetCursorPos(&point1);//获取当前光标的位置,以便使得菜单可以跟随光标

  pContextMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point1x,point1y,AfxGetMainWnd()); //在指定位置显示d出菜单;

  CDialog::OnRButtonDown(nFlags, point1)};

  这时,当右键点击对话框,就可以将菜单调出来了,如何响应菜单项有如下 *** 作:

  3、在资源视图中右键单击菜单项,建立类向导(ClassWizard),此时会d出一个对话框,点击第二个,加入到已存在的类,按确定。

  4、在资源视图中为菜单中的每一项建立类向导,并添加Command响应函数,然后在这个函数中加入语句就可以啦。

  ON_COMMAND(ID_COPY, OnCopy)//加Command响应函数,自动出现的灰色语句

  void CArcSoft_EffectDlg::OnCopy()

  {// TODO: Add your command handler code here

  MessageBox("复制成功!");

  MFC文档的菜单栏中添加一个command响应函数

  基于CFormView的应用程序,经常会在菜单栏中添加一个按钮,点击该按钮时,会d出一个对话框~~

  具体实现方式如下

  1新建一个对话框资源,同时新建一个对话框类和该资源对应,舍对话框类名为CTestDialog;

  2在资源视图中找到Menu 这个文件夹,双击里面的文件IDR_MAINFRAME,在这里可以添加自己想要的菜单,也可把原来的文件、编辑等菜单给删掉~~

  添加菜单的方法:右击右侧空白区域,选择properties,d出的对话框中,把pop_up勾选掉,添加一个ID和CAPTION,设ID为ID_MYTEST,caption|为测试

  (要注意的是,最好选择View类,而不是Frame类或其他类)

  3Ctrl+Wd出类向导,message maps中的class name 选择为View类,

  从Object IDs中找到我们上一步设置的ID_MYTEST,右侧的message选择Command命令,添加一个命令响应函数;

  4在该函数中添加

  CTestDialog dlg;

  dlgDoModal();

  5对应的菜单项添加WM_COMMAND消息,在命令响应函数中DoModal/Create/ShowWindow()你的对话框即可。

  6消息映射:

  ON_COMMAND(菜单编号,处理函数)

  h

  public:

  处理函数

  cpp

  处理函数

  {

  CDialog dc;

  dcdomodal();

  }

  d出非模态对话框的方法:

  (1)用类向导给菜单栏中菜单添加一个响应函数

  (2) 在头文件中加入

  #include "Dlgh"

  public:

  CDlg Dlg;

  (3)在代码中加入

  Dlg=new CDlg(this);

  Dlg->Create(IDD_DIALOG1); // IDD_DIALOG1为对应的菜单栏中那个按钮的ID

  Dlg->ShowWindow(SW_RESTORE);

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13494932.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存