按照http://www.codersource.net/mfc/mfc-tutorials/ctabctrl.aspx的教程,我在头文件中声明了函数ActivateTabDialogs()
,并在我的类中的另一个函数内调用它。编译器在函数C2065: 'ActivateTabDialogs' : undeclared identifier
的定义内的行ActivateTabDialogs();
处给出错误OnSelChange()
。我在这里违反了什么?
这是头文件TCGeriArama_TabCtrl.h
class CTCGeriArama_TabCtrl : public CTabCtrl
{
// Construction
public:
CTCGeriArama_TabCtrl();
// Attributes
//Array to hold the list of dialog boxes/tab pages for CTabCtrl
int m_DialogID[2];
int m_nPageCount;
//CDialog Array Variable to hold the dialogs
CDialog *m_Dialog[2];
public:
// Operations
//Function to Create the dialog boxes during startup
void InitDialogs();
//Function to activate the tab dialog boxes
void ActivateTabDialogs();
以下是ActivateTabDialogs()
的定义以及我在TCGeriArama_TabCtrl.cpp
内调用它的部分
void CTCGeriArama_TabCtrl::ActivateTabDialogs()
{
int nSel = GetCurSel();
if(m_Dialog[nSel]->m_hWnd)
m_Dialog[nSel]->ShowWindow(SW_HIDE);
CRect l_rectClient;
CRect l_rectWnd;
GetClientRect(l_rectClient);
AdjustRect(FALSE,l_rectClient);
GetWindowRect(l_rectWnd);
GetParent()->ScreenToClient(l_rectWnd);
l_rectClient.OffsetRect(l_rectWnd.left,l_rectWnd.top);
for(int nCount=0; nCount < m_nPageCount; nCount++){
m_Dialog[nCount]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_HIDEWINDOW);
}
m_Dialog[nSel]->SetWindowPos(&wndTop, l_rectClient.left, l_rectClient.top, l_rectClient.Width(), l_rectClient.Height(), SWP_SHOWWINDOW);
m_Dialog[nSel]->ShowWindow(SW_SHOW);
}
//Selection change event for the class derived from CTabCtrl
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
ActivateTabDialogs(); // HERE'S WHERE THE COMPILER GIVES THE ERROR
*pResult = 0;
}
感谢。
答案 0 :(得分:2)
显然OnSelChange
是免费功能。 ActiveTabDialogs
是类CTCGeriArama_TabCtrl
的成员函数。必须在它们所属的类的实例上调用成员函数。有两种选择:
OnSelChange
也成为CTCGeriArama_TabCtrl
的成员函数。someObj.ActiveTabDialogs()
,并为OnSelChange
提供CTCGeriArama_TabCtrl
- 实例的引用。从它的外观来看OnSelChange
是一个回调函数。它可能很难使它成为一个成员函数,因为它会改变它的指针类型。如果这是您正在使用的某个框架的回调,则应检查该框架是否提供了一些机制来将上下文信息传递给回调处理程序(可能是NMHDR* pNMHDR
- 参数的用途)。
答案 1 :(得分:1)
在您提供的链接中,函数OnSelchange
是一个成员函数。
所以尝试改变
void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
为:
void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)
答案 2 :(得分:0)
事实证明我没有使用类向导添加处理程序,并手动放置函数OnSelChange()
,这导致了问题。非常感谢您的关注