Вопрос

После учебника в 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;
}

Спасибо.

Это было полезно?

Решение 3

Оказывается, что я не добавил обработчик, используя мастер классов и поместил функцию OnSelChange() вручную, и это вызывало проблему. Большое спасибо для вашего внимания

Другие советы

Ну, видимо OnSelChange это бесплатная функция. ActiveTabDialogs является членом-функцией класса CTCGeriArama_TabCtrl. Отказ Функции членов должны быть вызваны экземпляром класса, который они являются членом. Есть два варианта:

  1. Сделать OnSelChange Функция члена CTCGeriArama_TabCtrl слишком.
  2. Изменить звонок в someObj.ActiveTabDialogs() и предоставить OnSelChange со ссылкой на CTCGeriArama_TabCtrl-пример.

Из взгляда это OnSelChange является функцией обратного вызова. Вероятно, было бы трудно сделать его элемент-функцией, так как это изменит бы его указатель-тип. Если это обратный вызов для некоторых рамок, которые вы используете, вам следует проверить, дает ли в том, что эта структура предоставляет некоторую механизм для передачи контекста-информации обратному обращению (возможно, что NMHDR* pNMHDR-параметр для).

По ссылке, заданной вами функцией OnSelchange это функция участника.

Так что попробуйте изменять

void OnSelchange(NMHDR* pNMHDR, LRESULT* pResult)

к:

void CTCGeriArama_TabCtrl::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top