回调函数在MFC中的使用--发布日期:2007-8-26

原创 2008年10月02日 18:34:00

回调函数的简单定义就是你定义的由Windows来调用。以下两个函数摘自《Programming Windows with MFC》,这里暂且不管函数的具体作用,在FillListBox中有一个API函数,它调用的回调函数是EnumFontFamProc,回调函数的声明形式一般都是相对固定的,具体可以参考MSDN

static int CALLBACK EnumFontFamProc (ENUMLOGFONT* lpelf,

              NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam);

void CMainWindow::FillListBox ()

{

    m_wndListBox.ResetContent ();

    CClientDC dc (this);

    ::EnumFontFamilies ((HDC) dc, NULL, (FONTENUMPROC) EnumFontFamProc,

        (LPARAM) this);

}

int CALLBACK CMainWindow::EnumFontFamProc (ENUMLOGFONT* lpelf,

    NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam)

{

    CMainWindow* pWnd = (CMainWindow*) lParam;

    if ((pWnd->m_wndCheckBox.GetCheck () == BST_UNCHECKED) ||

        (nFontType & TRUETYPE_FONTTYPE))

        pWnd->m_wndListBox.AddString (lpelf->elfLogFont.lfFaceName);

    return 1;

}

请注意这里的函数EnumFontFamilies中的最后一个参数传递的是this即该CMainWindow对象的指针,为什么要这样呢,可以看到EnumFontFamProc的声明是static,在C++static函数是不能调用非static成员的,所以这里传递一个this就不是很奇怪了。但是为什么要将该函数声明为static呢,这就要归咎于C++的特殊性了,众所周知C++编译器在编译的时候都会在对象中添加一个this指针,在成员函数调用中又会附加一个参数保存this指针,但是Windows的回调函数有严格的定义就是必须按照参数列表传递的参数,加了this指针后参数列表就会与Windows期望的参数列表不一致了,因此这里将其声明为staticstatic成员函数不会传递this指针,这点说起来总是知道,但是真正用时总是忘了,唉)。

       另外在Windows中使用callback函数很常见,恰好许多支持回调函数的API函数都像这里的EnumFontFamilies一样支持自定义的LPARAM参数,刚好可以传递this,如果使用的API函数不支持这样的自定义的LPARAM参数,就需要其他的方法了,一种比较简单的方法是将this复制为global变量使得回调函数可以使用。

回调函数中使用MFC类的成员或对话框控件的简单方法

在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量、类成员函数,亦或者对话框控件的句柄。由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.....
  • lunatic7
  • lunatic7
  • 2017年05月27日 00:39
  • 270

VC/MFC中使用回调函数 关于回调函数的作用

这些天在练习的时候,很多在win32控制台里了回调函数。再次基础上移植到VC/MFC中的时候发现有点问题,于是查阅资料,解决方法如下(直接代码): 不过我在查阅资料的时候,看见有的朋友说回调函数需要...
  • LJH0600301217
  • LJH0600301217
  • 2013年04月15日 14:40
  • 1013

VC中回调函数的用法

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就 是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可 以在回调函数里完成你要做...
  • HiRuyue
  • HiRuyue
  • 2014年01月03日 13:58
  • 2129

VS2013MFC中回调函数的使用&出现的问题

MFC中回调函数的使用
  • HHXUN
  • HHXUN
  • 2017年10月15日 17:16
  • 315

MFC的回调函数

MFC中应该有两类回调函数:一类是源自C的传统回调函数,此类回调函数若非定义为全局函数,而定义在类中的话,要添加static约束,常见的有EnumXXX();一类是消息响应函数,通过成员函数指针实现回...
  • biao2010
  • biao2010
  • 2014年11月04日 10:49
  • 877

MFC 关于回调函数定义问题

使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:36
  • 1727

在回调函数中发布消息:Call to publish() on an invalid Publisher

在ROS中,想在回调函数中发布消息,有两个思路: (1)把函数写成类的形式,把需要的一些变量在类中声明为全局变量。 (2)在函数中,把回调函数需要调用的变量声明为全局变量。也可以解决这个问题。 ...
  • u012700322
  • u012700322
  • 2016年06月30日 11:46
  • 912

MFC中(TCP/IP)回调函数简析

文章出处:http://blog.csdn.net/houqi02/article/details/52205311 1、基础知识 所谓回调,就是模块A要通过模块B的某个函数b...
  • ljsant
  • ljsant
  • 2016年09月09日 09:58
  • 883

VS2015在共享 DLL 中使用 MFC 发布细节 同时支持XP

1.项目属性平台工具集选 2.到vs2015安装目录下负责依赖的dll,因为新版vc启用了新的c/c++运行时,xp版本没有发布对应的补丁,所以需要自己复制进去安装目录。 这里要兼容32位故只需...
  • yeshiqimu
  • yeshiqimu
  • 2016年11月16日 10:30
  • 2023

OpenCV学习笔记之鼠标响应回调函数setMouseCallback

openCv中的鼠标回调函数是为了处理鼠标操作消息的响应事件,函数原型为:                      C++:   void   SetMouseCallback(const str...
  • my_lord_
  • my_lord_
  • 2016年12月29日 15:51
  • 1597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回调函数在MFC中的使用--发布日期:2007-8-26
举报原因:
原因补充:

(最多只允许输入30个字)