MFC中自定义C函数中使用MFC对象

来源:互联网 发布:淘宝申请售后是多少天 编辑:程序博客网 时间:2024/04/28 17:43

在我们编写MFC程序的过程中,难免会用到c(SDK)函数,虽然MFC对大部分win32 API进行了封装,但是很多的时候,使用SDK函数更加易于我们使用,有很强的灵活性。如果是标准的SDK函数一般没有什么问题,但是有的SDK函数,需要你提供一个回调函数,那么这个回掉函数是不能是MFC对象的成员函数。就需要我们在cpp文件中自定义一个C回调函数。既然是回调函数,当然是希望我们在这个回调函数中做一些事情,然而在MFC中,我们的方法都是MFC类的对象来操作方法的。但是在这个我们自定义的回调函数中,我们不能使用MFC对象。这样不就矛盾了。下面,我通过的一个实例来描述这个问题。

在我编写的一个播放器程序中,需要一个定时器来定时调用回调函数,来更新播放时间

hTimerQueue = CreateTimerQueue();
CreateTimerQueueTimer( &hTimer, hTimerQueue, 
            (WAITORTIMERCALLBACK)TimerProc, 0 , 1000, 1000, WT_EXECUTEINPERSISTENTTHREAD);

由上面可以看见,需要一个TimerProc的回调函数,当然名字是可以取别的,我这里取的这个名字。于是,我声明并定义了一个这样的回调函数

VOID CALLBACK TimerProc(PVOID lpParameter,BOOLEAN TimerOrWaitFired);///源文件开头声明函数

.............................

VOID CALLBACK TimerProc(PVOID lpParameter,BOOLEAN TimerOrWaitFired)////在源文件中实现它
{
this->.....
}

在回调函数中,我定期的调用mfc类的方法来进行时间更新,然而,在这个我定义的回调函数中,是一个c函数,不能使用对象的方法,直接错误提示:“未定义的标示符”;那么应该如何做呢,如下:

VOID CALLBACK TimerProc(PVOID lpParameter,BOOLEAN TimerOrWaitFired)
{
::SendMessage(hcwnd,WM_TIMEPROC,0,0);
}

先在全局声明一个窗口句柄来保存这个窗口类的窗口句柄。然后在这个回调函数中是用发送消息给窗口的形式,那么在消息的处理中,我们就可以调用这个类的方法了,当然这里的消息是自定义消息(WM_TIMEPROC)。这时候也许有人会问,为什么在一个线程中使用SendMessage没有出现程序死锁呢,这是因为这个回到函数的调用者不是本线程的,而是在thread pool中,所以没有出现程序死锁。

下面是重新虚函数WindowProc中处理虚函数,当然,你可以用mfc的标准私有消息处理办法,使用宏ON_MESSAGE来处理私有消息:

case WM_TIMEPROC:
{
this->TimeStart();
}
break;

上面说的这个情况呢,是我们无法避免的,我们必须要一个回调函数,其他情况应该尽量避免这样的使用。如果一个我们自定义的c函数,在MFC类的成员函数中调用并不存在这个情况,可以任意调用我们自定义的c函数,但是反过来就不行。