سؤال

بعد البرنامج التعليمي في http://www.codersource.net/mfc/mfc-tutorials/ctabctrl.aspx ، لقد أعلنت الوظيفة ActivateTabDialogs() في ملف Header الخاص بي واستدعاه داخل وظيفة أخرى في صفي. المترجم يعطي خطأ 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