OXlib++プログラム
コールバック構造
OXlib++のコールバックはアプリケーションとGUIとの通信をおこなうための機構である。
本来 GUI とアプリケーションは美しく分離されていなければならない。
美しさは設計者の思想そのものである。
OXlib++は分離の美しい分離方法を実現するために複数のコールバック機構を提供している。
コールバックの種類
コールバックは OXcallbackC::SRcallback() にて設定する。
SRcallback()の引数により自動的 にコールバック機構が決まる。
-
ユーザクラスのメンバ関数にコールバック
ユーザが GUI の動作を記述するクラスを定義し、そのオブジェクトにコールバックする場合に用いる。
例えばダイアログ・ボックス単位に処理をクラス化し、ダイアログに載るボタンのコールバックをそれぞれ対応するメンバ関数に割り当てる場合に用いる。
- 設定書式
- SRcallback(&OXtopCサブクラスのユーザオブジェクト, メンバ関数のポインタ);
- 起動関数は void func(OXbaseC*, int, int) な OXtopCサブクラスのメンバ関数でなければならない。
- メンバ関数が省略されれば Callback(OXbaseC*, int, int)が呼び出される。
- 使用例
- class UserC : public OXtopC {
- public:
- MyCback(OXbaseC* box, int iKind, int iArg){}
- } UserObj;
- SRcallback(&UserObj, (TBACK)&UserC::MyCback);
- デフォルトのメンバCallback()を呼び出す場合。
- SRcallback(&UserObj, Null);
-
任意のstatic関数にコールバック
最も手軽に、かつ、乱暴に普通の静的 な関数にコールバック関数 を設定する。
本来 C++では使うべきではないが、エラー処理など共通処理を記述するのは便利だろう。
- 設定書式
- SRcallback(static関数のポインタ);
- 起動関数は static void func(OXbaseC*, int, int) でなければならない。
- 使用例
- static MyFunc(OXbaseC* box, int iKind, int iArg){}
- SRcallback(MyFunc);
-
別プロセスの起動
GUIをプロセスの集合として設計した場合に使用する。
コールバックは常に新しいプロセスを起動するので、GUIとアプリケーションの分離はほぼ完全である。
- 設定書式
- SRcallback("起動されるファイル名", "起動時の引数文字列");
- 指定したファイルを指定した引数で起動する。
- 以降、パイプで接続して各種メッセージのやりとりをお こなう。
- 使用例
- SRcallback("MyScript", "cb1");
- キーボードより「MyScript cb1」と打ったときと同じ。
-
メッセージパッシング方式のコールバック
OXshell にて起動された OXlib++アプリケーションの場合のみ使用できる機構。
OXshell はパイプによりGUIとアプリケーションを通信する。詳細は OXshell 参照。
- 設定書式
- SRcallback("メッセージ文字列");
- OXshell にメッセージ文字列を送信する。
- 使用例
- SRcallback("CB1");
-
任意のBOXのコールバック指定をそのまま適用
任意のBOXのコールバック指定と同じ内容で設定する。設定のコピーと考えられる。
指定した BOX は 必ず OXcallbackC のサブクラスの BOX でなければエラーとなる。
- 設定書式
- SRcallback(OXcallbackCのサブクラスのBOX);
- 使用例
- SRcallback(&boxCb);
このBOXを boxCb と同じコールバック設定とする。
-
コールバック関数
コールバックが起こり、実際にアプリケーションを呼び出す関数は常に以下の引数を持った形をしてる。
- void Cback(
- OXbaseC* pboxOrg, //IN:コールバックが発生したBOX(オブジェクト)
- int iKind, //IN:コールバックの種別(部品により異なる)
- int iArg //IN:rOXargumentの値
- );
pboxOrg は Cback が呼び出されたBOX のポインタである。
この BOX ポインタを活用することにより、コールバックが発生したGUIに関する情報を得ることができる。
例えば、pboxOrg->GetTopBox() はコールバック発生BOXの最上位BOXのポインタを返す。
その下の "OK" とういう名前のBOXのポインタは以下のように表すことができる。
OXbaseC *pboxMain = pboxOrg->GetTopBox();
OXbaseC *pboxOK = pboxMain->BOX("OK");
2つ目の引数 iKind は部品が決めたコールバックの種類 である。
どの場面でコールバックが起こったかを知ることができる。
例えば、OXbarSlider クラスでは、iKind により以下のようにコールバックの種別が定義されている。
0=減少側(上又は左側)のページ部が押された
1=増加側(下又は右側)のページ部が押された
2=スライダをドラッグしている最中
3=スライダをドラッグした後Releaseされた
最後の引数 iArg はアプリケーションが自由に指定できるコールバック引数である。
リソース rOXargumentの値そのものを引数にしている。コールバックが起こる前にアプリケーションから SRargument()にて数値を設定しておく。
コールバックを起動する部品が固有の値を持つ場合に使用する。
例えば、ボタンが10個並んでいて、単に1~10までの数字を処理する場合は、リソースに1~10を指定しておくと、共通のコールバック関数 で処理できる。







