VC++ 回調函數及使用方法(轉)

轉載:http://blog.csdn.net/vsooda/article/details/7435801程序員

轉載:http://blog.csdn.net/lincyang/article/details/29175413編程

回調函數說白了就是事件響應程序,Windows的每一個消息能夠理解爲一個事件,事件的響應代碼要由用戶本身來定義。用戶定義了事件響應的代碼,但還要Windows知道這段代碼的位置(要否則Windows就不知道如何去調用,這也沒有用),因而用戶須要將回調函數的指針告訴Windows,最典型的例子是在窗口類的結構(WNDCLASS)中給lpfnWndProc份量賦回調函數指針值。

  回調函數的參數格式是由回調函數的調用者(通常是Windows)來定義的,而回調函數的實現者必須遵循這種格式。Windows程序是以事件驅動模型爲基礎的,這就必然要用到回調函數這種機制。
  要透徹瞭解回調函數,多看看SDK Samples。而MFC中的消息映射機制已經將窗口消息響應的回調函數隱藏起來了,這也符合C++的編程思想,回調函數終究是一種全局函數,它不能在類中實現,而消息映射機制的目的是使消息響應的代碼最終封裝在窗口類(CWnd類的子類)中。函數

若是有時間,不妨看看MESSAGE_MAP宏,消息映射是回調函數,只是這種回調函數的用法不一樣而已。普通的回調函數是要你提供地址,傳進某個函數,由它去調用;而消息映射函數,倒是由你定義函數,由MESSAGE_MAP宏去取得地址,並實現它的調用。spa

回調函數是一個程序員不能顯式調用的函數;經過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。儘管定義的語法有點難以想象,但若是你熟悉函數聲明的通常方法,便會發現函數指針的聲明與函數聲明很是相似。.net

typedef void (*f1) ();// 爲函數指針聲明類型定義
void (*p) (); //p是指向某函數的指針
void func1() 
{
 /* do something */
 printf("From func1(), Hello World!/n");
}指針

void caller(void(*ptrfunc1)())
{
 ptrfunc1(); /* 調用ptr指向的函數 */ 
}code

//typedef bool (*f2) (int *);// 爲函數指針聲明類型定義
//bool (*q) (int *); //p是指向某函數的指針blog

bool func2(int* t_i) 
{
 /* do something */
 printf("From func2() = %d, Hello World!/n", (*t_i)++);
 return true;
}事件

void caller2(bool (*ptrfunc2)(int *), int * i)
{
 ptrfunc2(i); /* 調用ptr指向的函數 */ 
}get


int main(int argc, char* argv[])
{
 printf("From main(), Hello World!/n");
 printf("/n");

 //無參數調用
 p = func1; /* 傳遞函數地址地址 */
 caller(p); /* 傳遞函數地址到調用者 */

 //有參數調用
 int i = 0; 
 for (int j = 0; j < 10; j++)
 {
  caller2(func2, &i); //* 傳遞函數地址到調用者 */
 }

 //有參數調用第二次

  i = 0;
 //q = func2; /* 傳遞函數地址地址 */
 //caller2(q, &i); /* 傳遞函數地址到調用者 */

 printf("/n");
 printf("From main(), Hello World!/n");

 getchar();

 return 0;
}

 1 #include <stdlib.h>
 2 #include <stdio.h>
 3 int Test1()
 4 {
 5    int i;
 6    for (i=0; i<30; i++)
 7    {
 8      printf("The %d th charactor is: %c/n", i, (char)('a' + i%26));
 9    }
10    return 0;
11 }
12 
13 int Test2(int num)
14 {
15    int i;
16    for (i=0; i<num; i++)
17    { 
18     printf("The %d th charactor is: %c/n", i, (char)('a' + i%26));
19    }
20    return 0;
21 }
22 
23 void Caller1(int (*ptr)())
24 //指向函數的指針做函數參數
25 {
26    (*ptr)();
27 }
28 
29 void Caller2(int n, int (*ptr)(int n))
30 //指向函數的指針做函數參數,這裏第一個參數是爲指向函數的指針服務的,
31 {
32    //不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。
33    (*ptr)(n);
34    return;
35 }
36 int main()
37 
38 {
39 
40    printf("************************/n");
41 
42    Caller1(Test1); //至關於調用Test1();
43 
44    printf("************************/n");
45 
46    Caller2(30, Test2); //至關於調用Test2(30);
47 
48    return 0;
49 
50 }
51 
52 /*
53 int main()
54 
55 {
56 
57    printf("************************/n");
58 
59    Caller1(&Test1); //至關於調用Test1();
60 
61    printf("&&&&&&************************/n");
62 
63    Caller2(30, &Test2); //至關於調用Test2(30);
64 
65    return 0;
66 
67 }
68 */
相關文章
相關標籤/搜索