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中的一個按鈕的事件click
void 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中的函數地址通過函數指針傳遞過去