イベントに応じた処理を行う
[1] 主筆嬢 06/01/25 20:55
一応、目次はこちら。
前回、イベント登録時にX-Designerが生成したコードを修正しなくて良いような方法でのGUI作成を紹介したから、今回はそれを踏まえてイベント登録の方法を紹介する。
[2] nabiki_t 06/01/25 20:56
ようやくイベントドリブン型のプログラムになるわけだ。
[3] 主筆嬢 06/01/25 20:58
まぁ、そう言うこと。
[4] 主筆嬢 06/01/25 20:59
今回は前回作ったTestPrj2に、OKボタンが押された時の処理を追加してみることにする。
まずは、Sun Studio 11からX-Designerを起動する。

X-Designerは*.xdファイルをダブルクリックするか、あるいは右クリックしてX-Designerを選択すれば起動することが出来る。
[5] 主筆嬢 06/01/22 21:01
当たり前だけど、前回作った物が表示される。

[6] 主筆嬢 06/01/25 21:02
この状態から、OKボタンが押下されたときのコールバックを登録する。
まずは、設計画面中のOKボタンを選択して、「ウィジット(W)」-「コールバック」メニューを選択する。
ところで、>>5の画面を見てもらえば判ると思うけど、設計画面中にはbotunn1とbutton2とbutton3という三つのボタンが表示されてる。でも、この中のどれがOKボタンなのかが一見しただけでは判らない。
これを見分けるには、画面上部のウィジット名というところを見る。ここに"(OK)"と表示されるのが本物のOKボタン。それ以外の奴はキャンセルボタンとヘルプボタン。
ここで間違えるとどつぼにはまるから、十分に気を付ける必要がある。

[7] nabiki_t 06/01/25 21:04
この横着なねぇちゃんが説明を省略しようとしてるみたいだから、ちょっと補足しておく。
Windowsの世界で言うところの「イベント」は、Motif・Xtの世界では「コールバック」と「イベントハンドラ」に相当する。
「コールバック」というのは「イベントハンドラ」より抽象的な機能で、一般的な事象の発生を捕捉するための機能だ。例えばウィジットの構築やボタンの押下などだ。
それに対して「イベントハンドラ」はもう少し低レベルな機能で、コールバックでは捕捉できない事象の発生を捕まえることが出来る。でも、ちょっと面倒くさい。
X-Designerはコールバックに対しては手厚いサポートを提供するが、イベントハンドラに対しては結構冷淡だ。だから俺は、コールバックで済ませることができるものは極力コールバックを使用するようにしている。
[8] 広告 06/01/25 21:07
[9] 主筆嬢 06/01/25 21:08
これがコールバックの登録画面。

この画面で、「コールバックのリスト」の中から「活性化(activate)M」を選択、「メソッドの名前」のところに"OnOK"と入力、画面左下の「追加」ボタンを押す。
そうすると「コールバック」と書かれたリストに"CAppShell::OnOK()"というのが追加される。
ついでに言っておくと、この"OnOK"という名前は自分の好きなもので構わない。ただ、必ずC++の識別子として有効な名前を入力すること。X-Designerは名前の正当性を確認しないから。
用が済んだら「更新」「閉じる」を押して、この画面を閉じる。
[10] 主筆嬢 06/01/25 21:09
本来ならここでX-Designerを閉じても構わないんだけど、でもその前に一つやらなきゃならないことがある。まぁ、これは前回やり忘れてたことなんだけど。
まず、X-Desingerのメニューから「コード生成」ダイアログを表示させる。

そして、「スタブ」と書かれたところの横にあるチェックボックスにチェックを入れる。
これをやらないと、後でリンク時に失敗することになる。
で、例のごとく「適用」ボタンを押した後、「生成」は行わないで、ダイアログを閉じる。「生成」すると不要なファイルがプロジェクトのディレクトリにばらまかれる上にMakefileが上書きされてしまう。
もし、間違えそうで不安だというのであれば、「コード生成」ダイアログの上部にある「ディレクトリ」のところに"Sun-sparc-Solaris"というディレクトリ名を付け加えておけばいい。
[11] 主筆嬢 06/01/25 21:11
X-Designerはこれで終わり。
後はイベントに対する処理を記述してコンパイルすればいい。
X-Designerはコールバック用のメソッドをCAppShell::OnOK()に仮想関数として生成する。だから、人間様はCTP2Shell::OnOK()を作成してあげればいい。

[12] 主筆嬢 06/01/25 21:13
追加するメソッドのプロトタイプは
void OnOK( Widget, XtPointer );
だからこれをTP2Shell.hとTP2Shell.ccに追加してあげればいい。
ついでに言うと、この例ではボタンが押されたときにウインドウのタイトルを変更する様にしておいた。
// OKボタンが押下されると呼び出される
// とりあえずウインドウにタイトルを設定してみる
void CTP2Shell::OnOK( Widget wgt, XtPointer d )
{
Arg al[3];
int ac = 0;
string w;
w = "とりあえずタイトル";
XtSetArg(al[ac], XmNtitle, w.c_str() ); ac++;
XtSetArg(al[ac], XmNiconName, w.c_str() ); ac++;
XtSetValues( TestPrj2Shell, al, ac );
}
|
もう一つついでに言っておくと、アプリケーションシェルのウィジットは、CAppShell::TestPrj2Shellに保持されている。でもって、CTP2Shellクラスのインスタンスはグローバル変数のTestPrj2Shellに保持されてる。変数名が同じだから気を付けなきゃいけない。
[13] 主筆嬢 06/01/25 21:15
プログラムができたら、コンパイルして実行してみる。

ここで「了解」ボタンを押下する。

めでたくタイトルが変更された。
ついでに、アイコン化したときの絵も。

[14] nabiki_t 06/01/25 21:17
・・・一応これで、めでたしめでたし、なのか?
自動生成されるコードを修正する事なくイベントを記述することができたんだし・・・?
[15] 名無しさん 06/01/25 21:19
目次はこちら。
|