ウィンドウ・キーボード・マウスなどのイベントを取得するときに、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のものにはアクセスできません。