ダイアログを追加する
[1] 主筆嬢 06/01/29 15:04
念のため、目次。
今回は新しくダイアログボックスを追加してみる。
[2] 主筆嬢 06/01/29 15:05
いつもの通りSun Studio 11を起動して、X-DesignerでTestPrj2Shell.xdファイルを開く。

[3] 主筆嬢 06/01/29 15:06
この状態で、画面左側上部の「シェル」と書かれたところにあるボタンを押す。今回は一番左側にある奴を使っておいた。

そうすると、こういう状態になる。
今まで表示されていたのが全部消えちゃったけど、別にこれは前のが削除されちゃった訳じゃない。画面右上に表示されてる「TestPrj2Shell」を選択すれば、また表示される。
[4] 主筆嬢 06/01/29 15:07
新しく作った「shell2」に適当にウィジットを追加する。

今回は「ダイアログ構造」の中の ボタンを押しておいた。
[5] 主筆嬢 06/01/29 15:09
シェルとダイアログの各ウィジットの名前を変更する。

一番上のシェルのウィジットには「AdditionShell」、上から二番目に表示されてるダイアログのウィジットには「AdditionDlg」と命名しておいた。
[6] 主筆嬢 06/01/29 15:11
シェルウィジットのコアリソースを編集する。
X-Designerの画面の一番上の表示されてる「AdditionShell」を選択して、 ボタンを押す。

ダイアログ中の「コード生成」タブを開き、「クラス名」のところに「CAdditionShell」、「インスタンス名」のところには「CTP2AdditionShell」を入力しておく。
命名規則についてはこの辺を参照。
[7] 広告 06/01/29 15:15
[8] 主筆嬢 06/01/29 15:17
X-Designerの作業はここで終わり。ここからはプログラムの作成を行う。
[9] 主筆嬢 06/01/29 15:19
まずは「GUIアプリケーションを作ってみる2」のTP2Shellと同じ要領でTP2AdditionShell.ccとTP2AdditionShell.hを作成する。
それと、CTP2AdditionShellクラスに、下記のメソッドを追加する。
// 画面に表示させる
void CTP2AdditionShell::Show()
{
XtManageChild( AdditionDlg );
}
|
これはダイアログを表示させるためのコード。これによってShowメソッドを呼べばダイアログを表示することができるようになる。
注意しなきゃならないのは、XtManageChildの引数はAdditionDlgだということ。ついAdditionShellとしたくなるけどそれは間違い。
[10] nabiki_t 06/01/29 15:22
また横着を働いてるぞ。このネェちゃん。
下記にX-Designerが生成するコードと合わせたクラスの概略を示しておく。

また、X-Designerはグローバル変数「CAdditionShell* AdditionShell;」と、CTP2AdditionShellのインスタンスを生成して、そのアドレスをグローバル変数AdditionShellに設定するコードを生成する。
だから、プログラム中で今回追加したダイアログを表示させる必要が生じたら「AdditionShell->Show();」としてあげればいいことになる。人間がCTP2AdditionShellのインスタンスを生成したり、ダイアログを構築する処理を記述する必要はない。
[11] 主筆嬢 06/01/29 15:23
なにも仕事してない奴が、人のことを横着呼ばわりするな。
[12] 主筆嬢 06/01/29 15:25
CTP2AdditionShellクラスを作る以外にも、多少やることがある。
まずはTestPrj2_gol.hに下記の記述を付け加える。
#include "TP2AdditionShell.h"
|
これはつまり、X-Designerが生成したコードでCTP2AdditionShellクラスを使用するため。
それと、あとはMakefileをいじる必要がある。
まず「OBJS_TestPrj2」という変数に値を設定しているところを修正する。
## ターゲット: TestPrj2
OBJS_TestPrj2 = \
$(TARGETDIR_TestPrj2)/TP2Shell.o \
$(TARGETDIR_TestPrj2)/TP2AdditionShell.o \
/opt/SUNWspro/prod/src/xdclass/lib/libxdclass.a
|
それと、TP2AdditionShell.ccをコンパイルしてTP2AdditionShell.oを生成するためのコード
$(TARGETDIR_TestPrj2)/TP2AdditionShell.o: \
$(TARGETDIR_TestPrj2) \
TP2AdditionShell.cc
$(COMPILE.cc) $(CCFLAGS_TestPrj2) \
$(CPPFLAGS_TestPrj2) -o $@ TP2AdditionShell.cc
|
を追加する。(上の奴は長いから\を付けて改行してるけど、強いてそうする必要はない。)
[13] 主筆嬢 06/01/29 15:27
それで最後に、了解ボタンが押されたときのイベントとして今回追加したダイアログを表示するためのコードを、CTP2Shellクラスに記述しておく。
// OKボタンが押下されると呼び出される
void CTP2Shell::OnOK( Widget wgt, XtPointer cd )
{
// ウインドウのタイトルを変更するコードは削除
// CTP2AdditionShellを表示するコードを記述
AdditionShell->Show();
}
|
[14] 広告 06/01/29 15:29
[15] 主筆嬢 06/01/29 15:30
ここまで出来たらコンパイルして実行する。

[16] 主筆嬢 06/01/29 15:32
ついでだから、CTP2AdditionShell::Show()のXtManageChildの引数にAdditionShellを渡したらどうなるか、をやってみる。
// 画面に表示させる
void CTP2AdditionShell::Show()
{
XtManageChild( AdditionShell );
}
|
こういう風に記述すると、

こうなる。
左上にある矮小な奴がAdditionShellの失敗作。
今回はこれで以上終了。
[17] nabiki_t 06/01/29 15:35
おいおい、勝手に終わらせるなよ。まだいうべき事があるだろう。
まず一つは、今回作ったウインドウはモーダルではないということだ。
だからAdditionShellのウインドウが表示された後に「ほげほげ」と書いてあるウインドウをクリックすると、そっちにフォーカスが移ってしまう。
それに、当然だが「XtManageChild( AdditionDlg )」はウインドウを表示したら、すぐに制御を返す。ウインドウが閉じられるまで待ち合わせるとかそういう機能はない。
二つ目は、今回いじったソースコードを公開しておく、ということだ。
Makefile
TestPrj2_gol.h
TestPrj2Shell.xd
TP2AdditionShell.cc
TP2AdditionShell.h
TP2Shell.cc
TP2Shell.h
[18] 主筆嬢 06/01/29 15:37
はい、おつかれさん。
じゃ、そういうことで。
[19] 名無しさん 06/01/29 15:40
目次はこちら。
|