VC 回呼函數及使用方法
回呼函數說白了就是事件響應程式,Windows的每個訊息可以理解為一個事件,事件的響應代碼要由使用者自己來定義。使用者定義了事件響應的代碼,但還要Windows知道這段代碼的位置(要不然Windows就不知道如何去調用,這也沒有用),於是使用者需要將回呼函數的指標告訴Windows,最典型的例子是在視窗類別的結構(WNDCLASS)中給lpfnWndProc分量賦回呼函數指標值。
回呼函數的參數格式是由回呼函數的調用者(一般是Windows)來定義的,而回呼函數的實現者必須遵循這種格式。Windows程式是以事件驅動模型為基礎的,這就必然要用到回呼函數這種機制。
要透徹瞭解回呼函數,多看看SDK Samples。而MFC中的訊息映射機制已經將視窗訊息響應的回呼函數隱藏起來了,這也符合C++的編程思想,回呼函數終究是一種全域函數,它不能在類中實現,而訊息映射機制的目的是使訊息響應的代碼最終封裝在視窗類別(CWnd類的子類)中。
如果有時間,不妨看看MESSAGE_MAP宏,訊息映射是回呼函數,只是這種回呼函數的用法不同而已。普通的回呼函數是要你提供地址,傳進某個函數,由它去調用;而訊息映射函數,卻是由你定義函數,由MESSAGE_MAP宏去取得地址,並實現它的調用。
回呼函數是一個程式員不能顯式調用的函數;通過將回呼函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指標。儘管定義的文法有點不可思議,但如果你熟悉函式宣告的一般方法,便會發現函數指標的聲明與函式宣告非常類似。
CODE:#include "stdafx.h"
#include "stdio.h"void (*fun1)();
void A()
{
printf("fun1/n");
}void caller(void(*fun1)())
{
printf("fun1 start/n");
fun1();
printf("fun1 end/n");
}bool func2(int * i)
{
printf("From func2() = %d, Hello World!/n", (*i)++);
return true;
}void caller2(bool func2(int *),int *j)
{
func2(j);
}int main(int argc, char* argv[])
{
printf("From main(), Hello World!/n");
printf("/n");
caller(A); int i = 0;
for (int j = 0; j < 10; j++)
{
caller2(func2, &i); //* 傳遞函數地址到調用者 */
}
getchar();
return 0;
}