深入VC回調(diào)函數(shù)的使用詳解
更新時(shí)間:2013年05月17日 15:05:03 作者:
本篇文章是對(duì)VC回調(diào)函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
回調(diào)函數(shù)說(shuō)白了就是事件響應(yīng)程序,Windows的每個(gè)消息可以理解為一個(gè)事件,事件的響應(yīng)代碼要由用戶自己來(lái)定義。用戶定義了事件響應(yīng)的代碼,但還要Windows知道這段代碼的位置(要不然Windows就不知道如何去調(diào)用,這也沒(méi)有用),于是用戶需要將回調(diào)函數(shù)的指針告訴Windows,最典型的例子是在窗口類的結(jié)構(gòu)(WNDCLASS)中給lpfnWndProc分量賦回調(diào)函數(shù)指針值。
回調(diào)函數(shù)的參數(shù)格式是由回調(diào)函數(shù)的調(diào)用者(一般是Windows)來(lái)定義的,而回調(diào)函數(shù)的實(shí)現(xiàn)者必須遵循這種格式。Windows程序是以事件驅(qū)動(dòng)模型為基礎(chǔ)的,這就必然要用到回調(diào)函數(shù)這種機(jī)制。
要透徹了解回調(diào)函數(shù),多看看SDK Samples。而MFC中的消息映射機(jī)制已經(jīng)將窗口消息響應(yīng)的回調(diào)函數(shù)隱藏起來(lái)了,這也符合C++的編程思想,回調(diào)函數(shù)終究是一種全局函數(shù),它不能在類中實(shí)現(xiàn),而消息映射機(jī)制的目的是使消息響應(yīng)的代碼最終封裝在窗口類(CWnd類的子類)中。
如果有時(shí)間,不妨看看MESSAGE_MAP宏,消息映射是回調(diào)函數(shù),只是這種回調(diào)函數(shù)的用法不同而已。普通的回調(diào)函數(shù)是要你提供地址,傳進(jìn)某個(gè)函數(shù),由它去調(diào)用;而消息映射函數(shù),卻是由你定義函數(shù),由MESSAGE_MAP宏去取得地址,并實(shí)現(xiàn)它的調(diào)用。
回調(diào)函數(shù)是一個(gè)程序員不能顯式調(diào)用的函數(shù);通過(guò)將回調(diào)函數(shù)的地址傳給調(diào)用者從而實(shí)現(xiàn)調(diào)用。要實(shí)現(xiàn)回調(diào),必須首先定義函數(shù)指針。盡管定義的語(yǔ)法有點(diǎn)不可思議,但如果你熟悉函數(shù)聲明的一般方法,便會(huì)發(fā)現(xiàn)函數(shù)指針的聲明與函數(shù)聲明非常類似。
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); //* 傳遞函數(shù)地址到調(diào)用者 */
}
getchar();
return 0;
}
回調(diào)函數(shù)的參數(shù)格式是由回調(diào)函數(shù)的調(diào)用者(一般是Windows)來(lái)定義的,而回調(diào)函數(shù)的實(shí)現(xiàn)者必須遵循這種格式。Windows程序是以事件驅(qū)動(dòng)模型為基礎(chǔ)的,這就必然要用到回調(diào)函數(shù)這種機(jī)制。
要透徹了解回調(diào)函數(shù),多看看SDK Samples。而MFC中的消息映射機(jī)制已經(jīng)將窗口消息響應(yīng)的回調(diào)函數(shù)隱藏起來(lái)了,這也符合C++的編程思想,回調(diào)函數(shù)終究是一種全局函數(shù),它不能在類中實(shí)現(xiàn),而消息映射機(jī)制的目的是使消息響應(yīng)的代碼最終封裝在窗口類(CWnd類的子類)中。
如果有時(shí)間,不妨看看MESSAGE_MAP宏,消息映射是回調(diào)函數(shù),只是這種回調(diào)函數(shù)的用法不同而已。普通的回調(diào)函數(shù)是要你提供地址,傳進(jìn)某個(gè)函數(shù),由它去調(diào)用;而消息映射函數(shù),卻是由你定義函數(shù),由MESSAGE_MAP宏去取得地址,并實(shí)現(xiàn)它的調(diào)用。
回調(diào)函數(shù)是一個(gè)程序員不能顯式調(diào)用的函數(shù);通過(guò)將回調(diào)函數(shù)的地址傳給調(diào)用者從而實(shí)現(xiàn)調(diào)用。要實(shí)現(xiàn)回調(diào),必須首先定義函數(shù)指針。盡管定義的語(yǔ)法有點(diǎn)不可思議,但如果你熟悉函數(shù)聲明的一般方法,便會(huì)發(fā)現(xiàn)函數(shù)指針的聲明與函數(shù)聲明非常類似。
CODE:
復(fù)制代碼 代碼如下:
#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); //* 傳遞函數(shù)地址到調(diào)用者 */
}
getchar();
return 0;
}
您可能感興趣的文章:
- vc中SendMessage自定義消息函數(shù)用法實(shí)例
- 如何使用VC庫(kù)函數(shù)中的快速排序函數(shù)
- 解析VC中創(chuàng)建DLL,導(dǎo)出全局變量,函數(shù)和類的深入分析
- VC中SendMessage和PostMessage的區(qū)別
- VC++獲得當(dāng)前進(jìn)程運(yùn)行目錄的方法
- VC打印word,excel文本文件的方法
- VC文件目錄常見操作實(shí)例匯總
- VC讀配置文件實(shí)例
- VC++進(jìn)度條process Bar的用法實(shí)例
- VC++中內(nèi)存對(duì)齊實(shí)例教程
- VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例
- VC++實(shí)現(xiàn)CStdioFile寫入及讀取文件并自動(dòng)換行的方法
- VC自定義消息響應(yīng)函數(shù)postmessage用法示例
相關(guān)文章
利用簡(jiǎn)潔的C語(yǔ)言代碼解決跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題
這篇文章主要介紹了利用簡(jiǎn)潔的C語(yǔ)言代碼解決跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題的方法,跳臺(tái)階問(wèn)題與約瑟夫環(huán)問(wèn)題是常見的基礎(chǔ)算法題目,需要的朋友可以參考下2016-02-02C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷算法簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C語(yǔ)言實(shí)現(xiàn)倒置字符串的兩種方法分享
這篇文章主要和大家詳細(xì)介紹了利用C語(yǔ)言實(shí)現(xiàn)倒置字符串的兩種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-08-08C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)時(shí)間復(fù)雜度及空間復(fù)雜度簡(jiǎn)要分析
我們?cè)谶M(jìn)行編程時(shí),往往會(huì)開發(fā)諸多的算法,那么我們?cè)趺丛谀敲炊嗨惴ㄖ姓业阶詈玫哪莻€(gè)呢?本文主要介紹時(shí)間和空間復(fù)雜度概念及時(shí)間復(fù)雜度的求解,預(yù)祝讀者學(xué)習(xí)愉快2021-10-10C++實(shí)現(xiàn)LeetCode(29.兩數(shù)相除)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(29.兩數(shù)相除),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++使用TinyXml實(shí)現(xiàn)讀取XMl文件
常見C/C++?XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,本文為大家介紹的是使用TinyXml實(shí)現(xiàn)讀取XMl文件,需要的可以參考一下2023-06-06