1. 程式人生 > >VS2013MFC中回撥函式的使用&出現的問題

VS2013MFC中回撥函式的使用&出現的問題

要在MFC類的成員函式中寫一個回撥函式,首先要了解什麼是回撥函式。

回撥函式就是函式指標的呼叫,在一個函式寫成指標的形式,在另一個函式中可以把那個寫成指標形式的函式當成引數來使用。通常情況是在動態庫函式裡定義好回撥函式的形式,然後在封裝的函式裡註冊回撥函式。

這個時候在自己的工程中按照庫函式標頭檔案中定義回撥函式的格式來定義函式。然後呼叫動態庫中的註冊的回撥函式的引數裡就可以直接使用自己定義的回撥函式。

這裡概念參考回撥函式的那些事兒,寫的比較易懂。

接下來說我使用過程中出現的幾個問題:

1.回撥函式定義時一定要和庫函式中的定義完成一致。

我使用的庫中回撥函式定義為

typedef
BOOLEAN(__stdcall *XXX_CALLBACK)(unsigned char*cXXX, unsigned long uXXX);

我在我的工程時定義沒有加__stdcall,這個錯誤找了好久才找到。

2.回撥函式在MFC類中只能是靜態函式或者全域性函式

這樣會有個問題,那就是沒有直接使用當前類中的控制元件。我是使用的回撥函式中使用MFC類的成員或對話方塊控制元件的簡單方法中的方式。但是沒有辦法直接呼叫StatusBar類來顯示。現在還有個問題,沒法獲取tab子視窗的控制代碼,來操作子視窗中的控制元件。網上有說採用傳送訊息的方式,可是回撥函式在庫檔案中已經定義好了,不能再修改。沒法通過引數傳送訊息的方法。現在使用的方法是設定全域性變數來傳遞引數,不推薦這種方式。

3.在子視窗中使用回撥函式

我是在主視窗類中定義的靜態回撥函式,要在幾個tab子視窗中同時使用。在使用的時候就不能直接把主視窗中定義的回掉函式名傳遞給註冊回撥函數了。這時必須得先在子視窗中獲取主視窗的控制代碼才能使用主視窗類中的成員。
在這裡我使用的
CXXXDlg *pdlg = (CXXXDlg*)GetParent()->GetParent();