目次に戻る
コールバックによるイベントの取得
2002/02/02 update.
ウィンドウ・キーボード・マウスなどのイベントを取得するときに、C-Partsでは「コールバック」を使用しています。
イベントが発生したときに指定のルーチン(関数)の処理を実行するしくみを「コールバック」といいます。
C-Partsではstaticな関数をコールバック関数として利用します。



コールバックを使用するイベントとしては、
ウィンドウの生成・破棄・再描画・アクティブ化・非アクティブ化、
マウスの移動処理・クリック処理、
キーボードが押された・離された、
タイマー(100msごとの割り込み)、
各GUI部品の選択・変更、 などがあります。

コールバック関数の指定は、「Attachxxxx」で始まるメソッドで登録します。
詳しくは、リファレンスの各クラスを参照してください。


クラスでのコールバック関数からのアクセス


例えば、「CPWindow::AttachWindowEvent」で指定したコールバック関数から、クラスの変数などにアクセスしたい、ということが起こり得るかと思います。
以下の例では、staticな関数「OnWindowEvent」より、クラス内のpublicな「m_val」「m_cpBut」にアクセスしたいのですが、そのままではアクセスできません。


class CMyClass
{
    public:
        int m_val;
        CPPushButton m_cpBut;

    private:
        CPWindow m_win;

        static void OnWindowEvent(CPWindow *lpWin,CPSTWindowEvent ev);
        void Init();
};

//ウィンドウイベントのコールバック関数
void CMyClass::OnWindowEvent(CPWindow *lpWin,CPSTWindowEvent ev)
{
    //m_val / m_cpButにアクセスしたい!!
    ...
}

//初期化処理を行う
void CMyClass::Init()
{
    m_win.CreateNewDialog("TestWindow",120,120,200,200);
    m_win.AttachWindowEvent(OnWindowEvent);
    ....
}
		


このような場合に、「m_val」「m_cpBut」をグローバルにしてクラスから出してしまう、というのも手ですがあまりきれいではありません。
そこで、(これもあまりきれいではないですが)クラスのポインタを外に持たせて、それより参照するようにします。


class CMyClass;
CMyClass *pThis=NULL;

class CMyClass
{
    public:
        int m_val;
        CPPushButton m_cpBut;

    private:
        CPWindow m_win;

        static void OnWindowEvent(CPWindow *lpWin,CPSTWindowEvent ev);
        void Init();
};

//ウィンドウイベントのコールバック関数
void CMyClass::OnWindowEvent(CPWindow *lpWin,CPSTWindowEvent ev)
{
    int val;
    if(pThis){
        val=pThis->m_val;
        pThis->m_cpBut.Repaint();
    }
    ...
}

//初期化処理を行う
void CMyClass::Init()
{
    //クラスのポインタを保持
    pThis=this;

    m_win.CreateNewDialog("TestWindow",120,120,200,200);
    m_win.AttachWindowEvent(OnWindowEvent);
    ....
}
		


このように対処することで、クラスのpublicな変数・関数にアクセスすることができるようになります。
ただし、クラスが複数定義されている場合などは、うまく切り替えていく(もしくはグローバルのクラスのポインタを配列で管理する)必要があります。
また、この方法ではクラス内のprivateのものにはアクセスできません。