0

按照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;
}

谢谢。

4

3 回答 3

2

那么显然OnSelChange是一个免费的功能。ActiveTabDialogs是类的成员函数CTCGeriArama_TabCtrl。成员函数必须在它们所属的类的实例上调用。有两种选择:

  1. 也做OnSelChange一个成员函数CTCGeriArama_TabCtrl
  2. 更改对-instance 的调用someObj.ActiveTabDialogs()并提供OnSelChangeCTCGeriArama_TabCtrl-instance 的引用。

从外观上看,它OnSelChange是一个回调函数。使它成为成员函数可能会很困难,因为这会改变它的指针类型。如果这是您正在使用的某个框架的回调,您应该检查该框架是否提供了某种机制来将上下文信息传递给回调处理程序(可能是NMHDR* pNMHDR-parameter 的用途)。

于 2010-10-25T08:12:07.300 回答
1

在您提供的链接中,该函数OnSelchange是成员函数。

所以尝试改变

void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)

到:

void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
于 2010-10-25T08:04:08.667 回答
0

Turns out that I didn't add the handler using the class wizard, and put the function OnSelChange() manually, and that was causing the problem. Thanks a lot for your attention

于 2010-10-25T08:53:30.717 回答