GEOS-SC : チュートリアル : 本論 : 簡単なアプリケーションの作成
はじめに | 開発環境 | サンプル アプリケーションの使用 | 簡単なアプリケーションの作成

GEOS-SC は、GeosSC.exe という単一のプログラムです。このプログラムは、「モジュール」と呼ばれる複数のコードで構成されています。モジュールは、アプリケーション、ライブラリ、またはドライバのいずれかです。ここでは、新しいアプリケーション モジュールの作り方を説明します。

以下の例では、ボタンを使って画面に「こんにちは みなさん!」と表示するアプリケーションを作成します。アプリケーションが担当する機能と、単純なユーザー インターフェイスを作成する方法について説明します。
[アプリケーションの画面イメージ]

このチュートリアルの各ステップには、 (ヘッダー | ソース | リソース) というリンクがあります。 これらは、アプリケーションのヘッダー ファイル (.h ファイル)、メイン ソース コード ファイル (.cpp ファイル)、およびリソース ファイル (.str ファイル) にそれぞれリンクされています。リソース ファイルには、ユーザーに表示する文字列が格納されます。これについては後で説明します。

サンプル アプリケーションを作成するには、次の手順に従います。

  1. tutsamp モジュールを作成します。
  2. ユーザーに表示する文字列を tutsamp.str ファイルに記述します。
  3. システムに対してアプリケーションを表すコードを tutsamp.h ファイルに記述します。
  4. tutsamp.h ファイルで常駐アプリケーションを定義します。
  5. アプリケーションのソース コードの本体を tutsamp.cpp ファイルに記述します。
  6. 起動と終了を処理するコードをtutsamp.cpp ファイルに記述します。
  7. tutsamp.cpp ファイルでユーザー インターフェイス オブジェクトをセットアップするヘルパー関数 BuildUI() を定義します。
  8. tutsamp.cpp ファイルで BuildUI() を完成します。
  9. tutsamp.cpp ファイルでボタンの押下を処理するメンバ関数 ActionPerformed() を定義します。
  10. 実行可能ファイルをビルドし、実行します。

  tutsampp モジュールを作成します。

GEOS-SC のワークスペースをまだ開いていない場合は、[スタート] メニューで [GEOS_SC SDK] メニューの [GEOS-SC workspace] をクリックしてワークスペースを開きます。Microsoft Visual C++ からワークスペースを開くには、[ファイル] メニューの [ワークスペースを開く] をクリックし、[GeosSC.dsw] を選択してください。

[スタート メニューの画面イメージ]

アプリケーションを新しく作成するには、

  1. アプリケーション用のディレクトリを作成します。SDK を ディレクトリ C:\geos-sc\ にインストールした場合は、 C:\geos-sc\appl\ の下にディレクトリを作成します。 ここでは、ディレクトリ tutsamp を作成します。
  2. C:\geos-sc\appl\>mkdir mystuff
    
    
    
    C:\geos-sc\appl\>mkdir mystuff\tutsamp
  3. Microsoft Visual C++ を使って、このディレクトリに (tutsamp.cpptutsamp.htutsamp.str) の 3 つのファイルを作成します。
  4. まず、C++ ソース ファイルである tutsamp.cpp を作成します。 [ファイル] メニューから [新規作成] を選択します。

    ダイアログ ボックスで [C++ ソース ファイル] を選択して [ファイル名] に tutsamp.cpp と入力します。次に、tutsamp ディレクトリへのパス (この例では、C:\GEOS-SC\appl\mystuff\tutsamp) を [位置] に指定します。[OK] をクリックします。

    これらの手順を繰り返して、tutsamp.h および tutsamp.str を作成します。ただし、これらのファイルの場合は、[C++ ソース ファイル] ではなく、[C/C++ ヘッダー ファイル] を選択します。 完了すると、これらのファイルがステップ 4 で示されているように、[Geos-SC ファイル] の下に表示されます。

  5. 新規ディレクトリで、プログラム mkjam を実行します。 これにより、コンパイル ツールが使用する Jamfile という ファイルが作成されます。Jamfile は、各モジュールごとに 1 つ あります。
  6. C:\geos-sc\appl\mystuff\tutsamp>mkjam
    
    Jamfile created.
    
    No toolchain specified, using "Microsoft32"
    
    No configuration specified, using "ErrorCheck"
    
    Using NT.jam
    
    Using Microsoft32.jam
    
    Using (optional) GeosSc.jam
    
    ...found 12 target(s)...
    
    ...updating 2 target(s)...
    
    MakeDspFile ..\..\..\appl\mystuff\tutsamp\tutsamp.dsp
    
    ...updated 2 target(s)...
    
    C:\geos-sc\appl\mystuff\tutsamp>
  7. Visual C++ で、GEOS-SC のトップレベルにある Jamfile を開きます。
  8. トップレベルの JamfileModule ラインを追加します。 このラインの内容には、アプリケーションのファイル パスが反映されていなければなりません。新しいラインを他の Module ライン間に挿入します。
  9. ...
    
    Module appl samples shell envshell ;
    
    Module appl samples internet netman ;
    
    Module appl browser ;
    
    Module appl mystuff tutsamp ;
    
    Module appl javalaunch : Inactive ;
    
    ...
     
    セミコロンの前のスペースを含め、スペースは重要な意味を持ちます。

  ユーザーに表示する文字列を tutsamp.str ファイルに記述します。 (リソース | ヘッダー | ソース)

tutsamp.str ファイルを開くには、[ワークスペース] ビューの [FileView] タブで tutsamp.str のエントリ ([GeosSC ファイル] の下に表示される) をダブルクリックします。

[FileView の画面イメージ]

このファイルの内容を、前の (リソース) リンクで表示される内容で置き換えます。
 
.prefix TUTSAMPAPP



FRAME_TITLE     "サンプル"

BUTTON_LABEL    "ここをクリック"

LABEL_TEXT      "こんにちは みなさん!"
 

.str ファイルを使うことにより、モジュールのローカリゼーションをサポートできます。ユーザーに表示する文字列は、このファイルですべて定義します。1 つのモジュールに対して .str ファイルを 1 つだけ持つことができます。アプリケーションを構築すると、resource.hresource.cpp という 2 つのファイルが .str ファイルから生成されます。興味があれば、これらのファイルの内容を調べてみてください。
このアプリケーションには、ユーザーに表示される文字列が 3 つあります。これらの文字列を表示するには、.str ファイルに .prefix ディレクティブを追加し、文字列の名前と値を定義します。

アプリケーションでこれらの文字列を使うには、C++ コードで次のことを行う必要があります。

TCHAR は文字を表す型です。ASCII シンボルは各 1 バイトを必要としますが、アジア諸国の言語をはじめとする多くの言語では、文字の種類が多いため、1 文字を表すために 2 バイトが必要です。TCHAR 型は、SBCS (Single-Byte Character Set : 1 バイト文字セット) デバイスでは 1 バイト、DBCS (Double-Byte Character Set : 2 バイト文字セット) デバイスでは 2 バイトです。
DBCS システムの場合、.str ファイルの内容は Shift-JIS で記述する必要があります。Shift-JIS は ASCII の上位セットです。


  システムに対してアプリケーションを表すコードを tutsamp.h ファイルに記述します。 (リソース | ヘッダー | ソース)

[FileView] タブで、tutsamp.h ファイルを開きます。このファイルの内容を、前の (ヘッダー) リンクで表示される内容で置き換えます。

tutsamp.h の前半を調べてみましょう。
 
#ifndef _TUTSAMPAPP_H_

#define _TUTSAMPAPP_H_



#include <toolkit/uifact.h>         //UI オブジェクト (FlexFrame など) を使用します

#include <ui/appbase.h>             //AppBase クラスを使用します

#include <toolkit/lisact.h>         //ActionListenerInterface クラスを使用します

#include <resapp/resapp.h>          //ResidentApplication クラスを使用します



class TutorialApp : public ActionListenerInterface, public AppBase 

{

public:

    TutorialApp(void);



    // UI を構築するために、SetAppContext をオーバーライドします 

    virtual void SetAppContext(const TCHAR *context);



    // アプリケーションの状態を保存するために、GetAppContext をオーバーライドします

    virtual TCHAR *GetAppContext(void);



    // ボタンの押下に対応するために、ActionPerformed をオーバーライドします

    virtual void ActionPerformed(ActionEvent& event);



    // アプリケーション終了時のクリーンアップを行うために、Exit をオーバーライドします

    virtual void Exit(void);



private:



    // UI を作成するヘルパー関数です

    Result BuildUI(void);



    // UI が既に構築されているかどうかを示すフラグです

    Boolean         _builtUI;



    // このオブジェクトは "こんにちは みなさん!" という文字列を表示します。

    // コードからラベルの表示と非表示を切り替えるときに便利なように、

    // ポインタを宣言します

    FlexLabel       *_helloworldLabel;



    // アプリケーションの UI を終了するとき

    // 削除するのに便利なように、

    // ポインタを宣言します

    VerticalFlowLayout  *_layout;

};
 

ここでは、システムに対してアプリケーションを表すクラスを 2 つ定義する必要があります。
アプリケーション ベース
システムは、アプリケーションの読み込みとアンロードをアプリケーション ベース オブジェクトに通知します。
常駐アプリケーション
他のアプリケーションがメモリに読み込まれていない場合でも、常駐アプリケーションは読み込まれています。常駐アプリケーションは、アプリケーションの名前をシステムに通知し、他のアプリケーションを読み込むことができます。
初めに、アプリケーション ベース クラスを定義します。ユーザーがアプリケーションを起動すると、このクラスのオブジェクトが作成されます。このオブジェクトでは、システムが呼び出すいくつかのメンバ関数が定義されます。
システムは、重要なイベントをアプリケーション ベース オブジェクトに通知します。通知は次の場合に行われます。
これらの通知に対応するために、ここで作成するアプリケーション ベース オブジェクトでは AppBase クラスを継承し、SetAppContext()GetAppContext()、および Exit() の各メンバ関数をオーバーライドします。これらのメンバ関数の定義については後で説明します
アプリケーション ベース オブジェクトはアプリケーションの実行中は常にメモリに読み込まれているため、アプリケーションに関連付けられているリソースの管理にはアプリケーション ベース オブジェクトを使います。また、アプリケーションの「スコープ」に含まれる変数の定義にはアプリケーションのクラスを使用し、グローバルな名前空間を使わないようにします。この例では、アプリケーションの実行中に使用する値の格納に、アプリケーション ベース オブジェクトのメンバ変数 _builtUI_helloworldLabel、および _layout を使います。

アプリケーション ベース オブジェクトは、アプリケーションの周辺的な機能を定義する場所としても便利です。このアプリケーションの場合、機能と呼べるものはほとんどありません。ボタンの押下に反応するだけです。ここでは、ActionListenerInterface を継承し、ActionPerformed() をオーバーライドすることにより、ボタンの押下に対応します。このオブジェクトがボタンの押下を「受信」できるようにする方法については、後で説明します


  tutsamp.h ファイルで常駐アプリケーションを定義します。(リソース | ヘッダー | ソース)

tutsamp.h の残りのコードを調べてみましょう。
 
// ユーザーに表示されない文字列です

const TCHAR *const TUTSAMP_APP_NAME = _TEXT("tutsamp");



// システムにアプリケーションを登録する ResidentApplication のサブクラスです

class TutorialSampResidentApplication : public ResidentApplication 

{

public:

        TutorialSampResidentApplication() : ResidentApplication(TUTSAMP_APP_NAME) 

        {};

        virtual AppBase *CreateAppBase(void) 

        {

            return new TutorialApp;

        }

};



static TutorialSampResidentApplication tutsampApp;



#endif  // _TUTSAMPAPP_H_
 

常駐アプリケーション オブジェクトは、アプリケーションが実行されていない場合にも、システムに対して情報を提供します。常駐アプリケーション オブジェクトは、ResidentApplication から継承する必要があります。常駐アプリケーション オブジェクトのコンストラクタは、システムにアプリケーションを登録します。登録すると、プログラム マネージャ (envshell) は利用可能なアプリケーションのリストにこのアプリケーションを追加します。システムは、常駐アプリケーション オブジェクトのコンストラクタに渡された文字列を使ってアプリケーションを識別します。この文字列は、デバイス上で一意的なものであることが必要です。一意的な名前でない場合は、システムがアプリケーションを混同する可能性があります。
システムがアプリケーションを起動する場合は、CreateAppBase() を呼び出します。常駐アプリケーションは、これに反応してアプリケーション ベース クラスのオブジェクトを作成します。

_TEXT() マクロは、文字列定数の定義に使います。_TEXT() を使うと、TCHAR と同様に、さまざまな文字セットに対応することができます。_TEXT() は TCHAR 文字列を返します。


  アプリケーションのソース コードの本体を tutsamp.cpp ファイルに記述します。(リソース | ヘッダー | ソース)

[FileView] タブを使って tutsamp.cpp ファイルを開きます。このファイルの内容を、前の (ソース) リンクで表示される内容で置き換えます。

このコードの先頭部分を調べてみましょう。
 
#include <system.h>                 //GEOS-SC の標準データ型を使用します

#include <toolkit/uifact.h>         //UI ファクトリを使用します

#include <flexui/javaspui.h>        //UI のヒントを使用します

#include <tstring.h>                //TCHAR 文字列関数 (Tstrcpy) を使用します

#include "tutsamp.h"                //クラス定義を使用します

#include "resource.h"               //ユーザーに表示される文字列を使用します



// アプリケーションの static 変数に対してシステムが使用する名前を設定します

AppNameAttribute tutsampAppName(&tutsampApp, TUTSAMPAPP_FRAME_TITLE);



TutorialApp::TutorialApp() :

    _builtUI( FALSE ),

    _layout( NULL )

{};
 

resource.h ファイルが .str ファイルから自動生成され、アプリケーションで使用する文字列定数が含まれていることは前に説明しました。ここでは、#include を使って resource.h をインクルードしています。
次に AppNameAttribute オブジェクトを作成し、コンストラクタを使って常駐アプリケーション オブジェクトに関連付けています。AppNameAttribute オブジェクトが管理する文字列は、プログラム マネージャ (envshell) がユーザーに表示するアプリケーション名として使われます。この例では、.str ファイルで定義した文字列 TUTSAMPAPP_FRAME_TITLE を使います。また、クラスのコンストラクタを定義してメンバ データを初期化します。


  起動と終了を処理するコードを tutsamp.cpp ファイルに記述します。 (リソース | ヘッダー | ソース)

ソース ファイルの次の部分を調べてみましょう。
 
// アプリケーションの状態を更新します。必要な場合は UI を構築します

/* virtual */ void

TutorialApp::SetAppContext(const TCHAR *context)

{

    // アプリケーションの UI がまだ構築されていない場合は構築します

    if ((!_builtUI) && BuildUI() != SUCCESS) {

        EC_WARN("UI を作成できません。");

        Exit();

    } 



    // コンテキスト文字列があれば、解析して UI を更新します

    if (context) {

        if (Tstrcmp( context, _TEXT("+")) == 0) {

            _helloworldLabel->SetVisible(TRUE);

            return;

        } 

        if (Tstrcmp( context, _TEXT("-")) == 0) {

            _helloworldLabel->SetVisible(FALSE);

            return;

        } 

        EC_WARN("解釈できないコンテキスト文字列です。");

    }

} // End of TutorialApp::SetAppContext() 



// アプリケーションの状態を文字列にエンコードします

/* virtual */ TCHAR *

TutorialApp::GetAppContext(void)

{   

    if (_builtUI != TRUE ) {

        return NULL;

    }

    TCHAR scratch[30];

    if (_helloworldLabel->IsVisible() == TRUE) {

        Tstrcpy( scratch, _TEXT("+"));

    } else {

        Tstrcpy( scratch, _TEXT("-"));

    }



    TCHAR *context = new TCHAR[Tstrlen( scratch ) + 1 ];

    if ( context == NULL ) {

        EC_WARN("コンテキスト文字列を割り当てられませんでした; コンテキストは保存されません。");

        return NULL;

    }

    Tstrcpy( context, scratch );

    return context;     



} // End of TutorialApp::GetAppContext 



// アプリケーションの終了時にクリーンアップを行います

/* virtual */ void

TutorialApp::Exit(void) 

{

    delete _layout;



    // 継承したメンバ関数を呼び出してデフォルトの動作を行います

    AppBase::Exit();

} // End of TutorialApp::Exit() 
 

システムがアプリケーション ベース オブジェクトに対し、アプリケーションの起動と終了を通知すること、状態に関する情報を保存するように求めること、および保存した情報に基づいて状態を復元するように求めることは、前に説明しました
サブクラス化された AppBase のメンバ関数では、次の場合の処理を行います。
このアプリケーションでは、これらのケースのすべてに対応する必要があります。このため、次のメンバ関数でいくつかの処理を行います。
SetAppContext()
まだ行っていなければ、UI の初期化とセットアップを行います。NULL 以外のコンテキスト引数が渡された場合は、アプリケーションの状態を適切に更新します。
GetAppContext()
アプリケーションの状態を調べ、状態をコード化したコンテキスト文字列を生成します。コンテキスト文字列の解放は、GetAppContext() を呼び出したシステムまたはその他のプログラムが行います。
Exit()
クリーンアップを行ってリソースを解放します。
コンテキスト文字列の内容は任意です。このアプリケーションの UI には、"こんにちは みなさん!" を表示している状態と表示していない状態の 2 つしかありません。このため、状態文字列は "+" と "-" の 2 つだけにします。
TCHAR 文字列を使用しているので、tstring.h で定義されている、Tstrcmp()Tstrcpy()Tstrlen() の特殊文字列関数を使います。これらの関数は、関数名の頭に "T" が追加されていることを除けば、標準 ANSI C の同類の文字列関数のように使用できます。


  tutsamp.cpp ファイルでユーザー インターフェイス オブジェクトをセットアップするユーティリティ関数 BuildUI() を定義します。 (リソース | ヘッダー | ソース)

この例の関数 SetAppContext()では、ユーティリティ関数 BuildUI() を使ってアプリケーションのユーザー インターフェイスを作成します。ここでは、この関数の本体を定義します。この関数は、アプリケーションのユーザー インターフェイスを構成するオブジェクトを作成します。最初に作成されるのはフレームです。フレームは画面 (ウィンドウ) であり、ほかのオブジェクトを追加することができます。BuildUI() によるフレーム オブジェクトのセットアップを調べてみましょう。
 
Result

TutorialApp::BuildUI(void)

{

    FlexFrame *frame = 

        theUIFactory->CreateFlexFrame( HINT_FRAME_WITH_NO_CLOSE_BUTTON, 

                                       TUTSAMPAPP_FRAME_TITLE );

    if (frame == NULL) {

        EC_WARN("フレームを作成できませんでした。");

        return FAILURE;

    }

    if (Add(frame) != SUCCESS) {

        EC_WARN("フレームを AppBase に追加できません。");

        delete frame;

        return FAILURE;

    }

...
 
[FlexFrame] 
 

フレームを作成するには、グローバル オブジェクトである theUIFactory を使います。UI オブジェクトの作成は、このオブジェクトが担当します。ここでは、theUIFactory のメンバ関数 CreateFlexFrame() を呼び出し、引数として lookHint とフレームのタイトルを渡します。lookHintHINT_FRAME_WITH_NO_CLOSE_BUTTON は、デバイス標準の「ルック」のうち、このフレームで使用するものを指定します。Java UI 擬似デバイスのルックは、<flexui/javaspui.h> で定義されています。
フレームを作成するときに単に new FlexFrame としないのは、このフレームが FlexFrame そのものではなく、FlexFrame のサブクラスであるためです。サブクラスはデバイスの UI によって定義され、それぞれ固有の方法で動作します。指定した lookHint によっては、異なったサブクラスが返される場合があります。ただし、このオブジェクトを操作するときは、FlexFrame と同じように操作します。

文字列 TUTSAMPAPP_FRAME_TITLE は、.str ファイルで定義したものです。

メモリの割り当てが失敗していないか、常に調べるようにしてください。ここでは、フレームの作成に成功したかどうかを確認します。成功しなかった場合は、UI の作成を中止し、FAILURE を返します。また、EC_WARN() マクロを使って問題を報告します。EC_WARN() は "printf() デバッグ" に相当し、DOS シェルにメッセージを出力します。EC (エラー チェック) コードの利点と詳細については、「Coding Conventions: Error Checking Code」を参照してください。sys_info ライブラリの API リファレンスには、EC マクロの一覧があります。

フレームの作成に成功したら、アプリケーション ベース オブジェクトの「 UI ツリー」に追加します。このツリーは、UI オブジェクトを階層化し、オブジェクト間の親子関係を管理するものです。ある UI オブジェクトが別の UI オブジェクトに含まれている場合は、前者を「子」、後者を「親」と呼びます。たとえば、あるボタンがダイアログ ボックス内に表示される場合、このボタンはダイアログ ボックスの子オブジェクトと呼ばれます。ほかのオブジェクトを含むことができるのは、FlexContainer から派生したオブジェクトのみです。ある UI オブジェクトを別の UI オブジェクトの子オブジェクトにするには、親オブジェクトのメンバ関数 Add()を使います。OS の関数で失敗する可能性のあるものについては、必ず戻り値を調べるようにしてください。ここでは、アプリケーション ベース オブジェクトの Add() の戻り値を調べ、フレームの追加が成功したかどうかを確認しています。

アプリケーション ベース オブジェクトへのフレームの追加で問題が発生した場合は、delete を使ってフレームを削除します。フレームは削除しますが、アプリケーション ベース オブジェクトは削除しません。このオブジェクトはアプリケーション終了時に自動的に削除され、UI ツリーのオブジェクトもすべて削除されます。フレームは UI ツリーに追加されないため、削除する必要があります。


  tutsamp.cpp ファイルで BuildUI() を完成します。 (リソース | ヘッダー | ソース)

関数 BuildUI() の定義の残りの部分を調べてみましょう。
 
...

    _layout = new VerticalFlowLayout;

    if ( _layout == NULL ) {

        EC_WARN("フレームのレイアウトを割り当てられませんでした。");

        return FAILURE;

    }

    frame->SetLayout(_layout);



    FlexButton *button = theUIFactory->CreateFlexButton(

                                         HINT_BUTTON_JAVA_LOOK_AND_FEEL);

    if (button == NULL) {

        EC_WARN("ボタンを作成できませんでした。");

        return FAILURE;

    }

    if ( frame->Add(button) != SUCCESS ) {

        EC_WARN("ボタンをフレームに追加できませんでした。");

        delete button;

        return FAILURE;

    }

    button->SetLabelString(TUTSAMPAPP_BUTTON_LABEL);

    if ( button->AddActionListener(*this) != SUCCESS ) {

        EC_WARN("ボタンにアクション リスナーを追加できませんでした。");

        return FAILURE;

    }



    _helloworldLabel = theUIFactory->CreateFlexLabel();

    if ( _helloworldLabel == NULL ) { 

        EC_WARN("ラベルを作成できませんでした。");

        return FAILURE;

    }

    if ( frame->Add(_helloworldLabel) != SUCCESS ) {

        EC_WARN("ラベルをフレームに追加できませんでした。");

        delete _helloworldLabel;

        return FAILURE;

    }

    _helloworldLabel->SetText(TUTSAMPAPP_LABEL_TEXT);

    _helloworldLabel->SetVisible( FALSE );



    frame->SetVisible(TRUE);



    _builtUI = TRUE;

    return SUCCESS;



}       // End of TutorialApp::BuildUI() 
 

関数 BuildUI()の残りの部分では、フレームのセットアップと同じ方法でオブジェクトを作成し、Add() を使ってツリーに追加します。
ここでは、VerticalFlowLayout オブジェクトを作成し、フレームに関連付けます。これにより、フレームの子オブジェクトが縦方向に配置されます。ほかのレイアウト オブジェクトを使うと、子オブジェクトは異なる方法で配置されます。

 
[FlexButton] 
 
レイアウト オブジェクトはアプリケーション終了時に自動的に削除されないため、このオブジェクトを参照するポインタを作成しておき、アプリケーション ベース オブジェクトのメンバ関数 Exit()で削除できるようにします。
ボタンを作成したら、ボタンのメンバ関数 SetLabelString()を使用し、表示する文字列 ("ここをクリック") を設定します。また、ボタンのメンバ関数 AddActionListener()を使用し、ユーザーがボタンを押したらアプリケーション ベース オブジェクトに通知するようにします。このアプリケーションは ActionListenerInterface を継承しているため、ボタンのリスナー オブジェクトとして機能することができます。アプリケーション ベース オブジェクトによるボタン押下の処理については、後で説明します

 
[FlexLabel] 
 
"こんにちは みなさん!" というテキストを表示するオブジェクトはラベルです。これは FlexLabel のサブクラスです。ここでは、ボタンの場合と同じような方法で、ラベルを作成してフレームに追加します。ラベルのテキストはメンバ関数 SetText() を使って設定します。アプリケーションの起動時にラベルが表示されないように、メンバ関数 SetVisible() を使ってラベルを隠しています。
ユーザー インターフェイス モデルの詳細については、Flex UI を参照してください。


  tutsamp.cpp ファイルでボタンの押下を処理するメンバ関数 ActionPerformed() を定義します。 (リソース | ヘッダー | ソース)
 
/* virtual */ void

TutorialApp::ActionPerformed(ActionEvent& event)

{

    USE_IT( event );



    if (_helloworldLabel->IsVisible()) {

        _helloworldLabel->SetVisible(FALSE);

    } else {

        _helloworldLabel->SetVisible(TRUE);

    }

} // End of TutorialApp::ActionPerformed() 
 

ボタン押下に対するアプリケーションの反応を定義するには、メンバ関数 ActionPerformed()をオーバーライドします。ユーザーがボタンを押すと、この関数がボタンによって呼び出されます。
この関数には、ボタン押下に関する情報を表す event という引数があります。この情報は不要なため、ここでは無視します。ただし、このままでは引数の不使用に関する警告を C++ コンパイラが生成してしまうので、USE_IT() マクロを使って回避します。このマクロは何も行いません。警告の回避のみを目的としています。


  実行可能ファイルをビルドし ([ビルド ツール])、実行します ([実行ツール])。

[アウトプット] ウィンドウの [ビルド] タブに「jam の実行エラー」というメッセージが表示された場合は、コンパイルかリンクでエラーが発生しています。エラーや警告の通知を確認してください。

GEOS-SC エミュレータのディスプレイ ウィンドウにほかのアプリケーションが表示された場合は、作成したアプリケーションを前面に移動する必要があります。ディスプレイ ウィンドウにほかのアプリケーションが表示されている場合は、ディスプレイ ウィンドウをアクティブにし、F1 キーを押します。次に、表示されたダイアログ ボックスで [サンプル] を選択し、[Switch To] をクリックします。

[画面イメージ]

[ここをクリック] をクリックして "こんにちは みなさん!" ラベルを表示します。

[画面イメージ]

プログラムによる状態の保存を見るには、次の手順に従います。

  1. GEOS-SC ディスプレイ ウィンドウをアクティブにし、F1 キーを押します。
  2. ダイアログ ボックスが表示されます。

  3. 一覧の [サンプル] を選択し、[Unload] をクリックします。
  4. ダイアログ ボックスの背後でアプリケーションが閉じます。これでアプリケーションは終了しました。

  5. [Switch To] をクリックします。
  6. ダイアログ ボックスの背後でアプリケーションが再び表示されます。これでアプリケーションは起動し、状態を復元しました。

  7. アプリケーションを見るには、ダイアログ ボックスの [Close] をクリックします。
これでサンプル アプリケーションは完成です。おめでとうございます。


はじめに | 開発環境 | サンプル アプリケーションの使用 | 簡単なアプリケーションの作成