1、建立一個基於對話方塊的工程,預設添加一個對話方塊資源A,再添加一個對話方塊資源B
在A中調用B顯示
在B中添加回呼函數指標(B 資源對應的類CDlgCall)
在DlgCall.h中添加
typedef int (*MyCallFunc)(CWnd *, int, int);//定義回調指標
在類中聲明
public: void setCallFunction(int x,int (*Add)(CWnd *, int , int )); int a,b; MyCallFunc m_Func;//定義回調指標的變數
在DlgCall.cpp初始化a,b
BOOL CDlgCall::OnInitDialog(){CDialog::OnInitDialog();// TODO: 在此添加額外的初始化a=3;b=4;return TRUE; // return TRUE unless you set the focus to a control// 異常: OCX 屬性頁面應返回 FALSE}
// CDlgCall 訊息處理常式void CDlgCall::OnBnClickedBtnCall(){//CWnd是MFC中的視窗類別,此處將this賦值到函數中,//也就是將這個類的指標通過這個回呼函數傳到了調用這個視窗類別的方法中m_Func(this,a,b);}//傳遞函數void CDlgCall::setCallFunction(int x,int (*Add)(CWnd *, int, int)){m_Func=Add;//賦值到該類中的一個函數指標}
2、在A中調用
//這個函數在寫調用它的函數的前面,這樣不用再聲明int Add(CWnd *pWnd,int a,int b){ //這些參數都是從B中傳遞過來的 (((CDlgCall*)pWnd)->GetDlgItem(IDC_EDIT_A))->SetWindowText("Welcome");(((CDlgCall*)pWnd)->GetDlgItem(IDC_EDIT_B))->SetWindowText("Dll");return 0;}//A中的一個按鈕的事件clickvoid CCallBackTestDlg::OnBnClickedBtnDlg(){CDlgCall *dlg=new CDlgCall;if (!dlg->m_hWnd){dlg->Create(IDD_DIALOG1);dlg->a=5;dlg->b=4;dlg->setCallFunction(2,Add);dlg->ShowWindow(SW_SHOW);}}
邏輯,在A中實現業務函數,在B中調用函數,將A中的函數地址通過函數指標傳遞過去