需求:
在类A的界面上有一个tab控件。tab控件上面有那个页面。在MFC编程中一个tab的一个页面就应该是一个新的类。在tab的一个页面上有一个list控件。现在需要将list控件的点击事件,双击事件等在类A里面处理。
解决:
在类B里面给控件list添加点击事件。在点击事件里面回调类A的函数。从而实现。
部分代码:
类B:
定义回调函数指针
// 回调函数指针
std::function<void(NMHDR *, int,int)> m_ItemChangedCallback;
定义设置回调指针的函数
void DlgRadarItemTabI002::SetItemChangedCallback(std::function<void(NMHDR *, int,int)> callback)
{
m_ItemChangedCallback = callback; // 设置回调函数
};
在事件里面回调
void DlgRadarItemTabI002::OnLvnItemchangedListI002(NMHDR *pNMHDR, LRESULT *pResult)
{
// 检查回调是否有效
if (m_ItemChangedCallback)
{
m_ItemChangedCallback(pNMHDR,111,2); // 调用回调,传递变化的项索引
}
*pResult = 0; // 表示消息处理成功
}
类A:
给类B对象设置回调函数指针;
m_radarItemTab1.SetItemChangedCallback(std::bind(&CRadarSetupTestDlg::OnTab1ItemChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
m_radarItemTab2.SetItemChangedCallback(std::bind(&CRadarSetupTestDlg::OnTab1ItemChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
m_tab.AddPage(_T("I001"), &m_radarItemTab1, IDD_DIALOG_I001);
m_tab.AddPage(_T("I002"), &m_radarItemTab2, IDD_DIALOG_I002);
m_tab.Show();
定义回调函数
void CRadarSetupTestDlg::OnTab1ItemChanged(NMHDR *pNMHDR, int type,int tabPage)
{
if (tabPage == 1)
{
}
else if(tabPage == 2)
{
}
if (type == 111)
{
}
else if (type == 222)
{
}
else if(type == 333)
{
}
};
回调函数需要传什么参数可以按需求设置,这里没有用自定义消息是因为类A中包含了类B的头文件。自定义消息在类B里面拿到到类A的对象。所以使用回调函数