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。メンバー関数は、メンバーであるクラスのインスタンスで呼び出す必要があります。2つのオプションがあります。

  1. のメンバーOnSelChange関数CTCGeriArama_TabCtrlも作成します。
  2. -instanceへの呼び出しを変更し、-instanceへの参照をsomeObj.ActiveTabDialogs()提供します。OnSelChangeCTCGeriArama_TabCtrl

見た目から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

クラスウィザードを使用してハンドラーを追加せず、関数OnSelChange()を手動で配置したことが問題の原因であることが判明しました。ご清聴ありがとうございました

于 2010-10-25T08:53:30.717 に答える