PlusGは組込みLinux上で動作するグラフィカルなアプリケーションを作成するライブラリとツールの キットです。
ライブラリはコアエンジンに「DirectFB」を使用しています。
「DirectFB」はCPUパワーを必要とするX-Windowシステムなどを使わずに直接フレームバッファに 描画するライブラリで、CPUパワーの低い組込み機器でもストレスなく動作させることができます。
ウィンドウシステムやボタン、画像、タイマー機能などを備えたイベントドリブン型GUIプログラムを 簡単に作成することが可能です。
また、ボタンやエディットボックスなどのオブジェクトはユーザオリジナル画像(png) から生成しますのでデザインも思いのままです。
ライブラリの他、開発ツールとして、プロジェクト管理機能付き高機能エディタ(統合開発環境SWEET)、 ダイアログエディタ、カラーパレットエディタ(減色、共通パレット)が付いています。
PlusGとPlusGが必要とするライブラリは全てソースコードが付いていますのでLinuxが動く環境であれば アーキテクチャに依存することなくいろいろな環境で使用可能です。
- PlusGのグラフィック表示はDirectFBを使用しています。
DirectFBはハードウェアグラフィックアクセラレーション機能を持ったスリムなライブラリです。 ハードウェアグラフィックアクセラレーション機能を持っていない環境においても Linux Framebuffer Deviceを持つすべての機器で使用可能です。
キーボードやマウスなどのデバイス入力、透明機能を備えたウィンドウシステム、複数モニタ、 レイヤ機能などを提供します。
- サーフェースとは透明な画用紙です。文字を書く、画像、図形などを描くことが可能です。
しかし、それ以外の機能は持っていません。
ウィンドウは1つのサーフェースを持っていて、描くこと以外にも沢山の機能を備えます。
サーフェースとサーフェースの重なりに対する処理(レイヤ機能)やマウス、タッチパネル、 キーボードなどのデバイスからの通知、ウィンドウ間の通知(メッセージ管理)などを処理します。
- オブジェクトはサーフェースから出来ています。
オブジェクトには、ボタン、エディットボックス、フレーム、テキスト、ピクチャーなどがあり、 それぞれのオブジェクトは1つ以上のサーフェースを持っています。このサーフェースには、ボタン やエディットボックスなどのリソース画像が保持されています。
また、エディット文字やウィンドウやボタンのタイトル文字など、文字列の表示、マウス、キーボードなどからの メッセージ処理など、いろいろな機能が拡張されています。
- ダイアログはウィンドウです。
ダイアログは複数のオブジェクトを保持し、管理します。オブジェクトを使用して 値の設定、文字、数値の表示など、ボタンの押下など、ユーザインターフェース機能を提供します。 また、タイマー機能なども備えています。
メッセージ(イベント)処理、オブジェクトのコントロール、画面遷移(他のダイアログの表示、消去)など、 アプリケーション開発は、ダイアログ関数が請け負う場面が多く存在します。 (もっとも多く利用する関数と言えます)
- PlusGで作成されるアプリケーションはメッセージドリブン型です。
PlusGのダイアログにはいくつかのメッセージ処理用のコールバック関数(Virtual)が用意されていて、 オブジェクトやデバイス、タイマーなどからイベントを受け取ると、それらの関数をコールします。
代表的なイベント通知関数に次のものがあります。
- オープン時に一度だけ呼ばれる(初期化用)
virtual void PostInitial(SGHandle handledlg,int id);
- 表示の更新が必要な時に呼ばれる
virtual void Draw(SGRect region);
- ボタンオブジェクトがクリックされ時に呼ばれる
virtual void ClickButton(SGHandle handleobj,int act);
- 設定したインターバルタイマー イベントが発生した時呼ばれる
virtual void Timer(TimeVal time);
- ダイアログが閉じた時に呼ばれる
virtual void Closed(SGHandle handledlg,int id,int param);
※分かりやすい表現の為「メッセージドリブン」という表現を採用しています。
一般的には「イベントドリブン」「イベント駆動」という呼び方の方が多く使われているようです。
- PlusGのオブジェクト
- ボタン
ボタン機能を提供します。
押しボタンの他、ラジオボタン、チェックボックスもボタンオブジェクトで作成できます。
- エディットボックス
文字の挿入、削除、キャレット移動など、文字列の管理を行います。
- フレーム
ウィンドウやダイアログの枠、タブページの枠、リスト表示の枠などに使用します。
- テキスト
文字列を表示します。書体、サイズ、色、寄せ、マージンなどの属性を持っています。
- アイコン・ピクチャー
アイコンとピクチャーは非常によく似たオブジェクトです。
イラスト画像や写真画像を1つ持ち、表示を行います。
ピクチャーはパレットの管理が可能です。
- キャンバス
直線、曲線、文字、塗りつぶしなどDraw系のデータを処理します。 ベクトルデータを表示することが可能です。
- キーボード
キーボードや外部スイッチなどが押されたことを通知するオブジェクトです。
サーフェースを1つも持たないオブジェクトです。
- グループ
複数のオブジェクトをグループ管理するオブジェクトです。
グループ管理することで、相対的な座標管理で一度に移動したり、一度に消したり(見えなくする) できるようになります。
ラジオボタンのように、たえず選択は一つだけにするトグル機能も提供します。
- オブジェクトはリソース画像(pngファイル)でデザインします。 また、ボタン、エディットボックス、フレームの3つのオブジェクトは 登録されている画像を配置情報に指定されたサイズに伸長表示可能です。
横方向の伸長は、画像を3つに等分し、左端を左に、右端を右に配置し、中央の部分だけを 繰り返しタイル表示して大きくします。
ボタン、エディットボックスの伸長は横方向のみです。
フレームは上端用、中央全部用、下端用と3つの画像を持っています。
それぞれの画像はボタンと同じく横方向のみの伸長ですが、中央全部用の画像は、横方向に伸長した後 上端、下端以外の中央部分すべての領域を埋めるようにタイル表示します。
- リソース画像は一つのオブジェクトに対して複数用意し、必要とする場所や状態により使い分けます。
- ボタン
ボタンには6種類の画像が登録できます。
SG_ATTR_NORMAL :通常の状態
SG_ATTR_DISABLE:使用不可な状態(ディスエーブル)
SG_ATTR_ACTIVE :アクティブな状態
SG_ATTR_FOCUS :フォーカスを表す(選択を表す)
SG_ATTR_DOWN :押し下げ状態
SG_ATTR_ACTDOWN:アクティブな状態で押し下げられた状態
- エディットボックス
エディットボックスには4種類の画像が登録できます。
SG_ATTR_NORMAL :通常の状態
SG_ATTR_DISABLE:使用不可な状態(ディスエーブル)
SG_ATTR_ACTIVE :アクティブな状態
SG_ATTR_FOCUS :フォーカスを表す(選択を表す)
- フレーム
フレームは状態でなく表示部位の違いで3種類あり3種とも必須です。
SG_ATTR_TOP :上段部分
SG_ATTR_MIDDLE:中間部分
SG_ATTR_BOTTOM:下段部分
- メッセージタイプ
登録されたボタンオブジェクトからは次のメッセージが発行されます。
SG_ACT_DOWN :押された
SG_ACT_UP :離された
SG_ACT_CLICK :同一オブジェクトで、押され離された
SG_ACT_REPEAT:長押しによりリピートが発生した
メッセージのタイプにより通知関数が変化します。
- 通知イベント
- ボタンクリック ボタンは、押した時は SG_ACT_DOWN が、放した時にUPが発生しますが、同じボタンをDOWN、UPすると SG_ACT_CLICK が発生します。
発生する順番は SG_ACT_DOWN → SG_ACT_CLICK → SG_ACT_UP です。
- 最低押し下げ時間 ボタンは、押した時、属性が SG_ATTR_DOWN になり、放すと SG_ATTR_NORMAL に戻ります。
この時、押し下げから開放までの時間が200ms以下の場合、すぐに SG_ATTR_NORMAL に戻さず、200ms経過を待って SG_ATTR_NORMAL に戻します。
この200msは SetPushTime(time) で変更することが出来ます。
- キーリピート ボタンは、一定時間(1000ms)以上押し続けると、以降、一定の間隔(100ms)で SG_ACT_REPEAT が発生し続けます。
この開始までの時間 1000ms と、繰り返し間隔 100ms は SetRepeatTime() で変更することが出来ます。
- クリッカブル マウスやタッチパネルなどのポインティングデバイスで、押下やタッチした時に SG_ACT_DOWN や SG_ACT_UP などのメッセージ通知を 行うオブジェクトを、クリッカブルなオブジェクトと呼びます。
初期状態では、エディットボックスオブジェクトとボタンオブジェクトがクリッカブルに設定されていますが、 SetClickable() 関数で全てのオブジェクトがクリッカブルにする(しない)ことが出来ます。
- 画像の更新
- サーフェースは画像を描画、保持することができますが、サーフェースにある画像は メモリのどこかに書かれているだけで、実際に見ることはできません。
Flip()関数をコールするタイミングで実際にフレームバッファなどにコピーされ、 視認できるようになります。オブジェクトクラスの関数はサーフェースの中身や状態を 変更することが目的で実際に表示するにはFlip()を実行する必要があります。
オブジェクトクラスの中で、使用頻度の高い一部の関数はダイアログクラスに包括されて いて簡単に呼び出すことができるようになっています。この時、ダイアログクラスからは 内部でFlip()を呼び出しますのでFlip()を行う必要はありません。
- 画像の更新 複数部分の変更
- Flip()はCPU負荷の高い処理です。複数のオブジェクトを変更する場合、変更とFlip()を 繰り返すと処理が重たくなることがあります。
このような場合はFlipOff()、FlipOn()を使うと頻繁なフレーム バッファ アクセスを 抑えることができます。関数内部でFlip()が呼ばれる関数を使用するまえにFlipOff() を使用すると以降、FlipOn()を実行するまでFlip()が抑制されます。
- SetText()とUpdate()の違い
- オブジェクトの属性や文字列、表示位置などを変更する方法は2種類あります。
- オブジェクトクラスを使う方法 GetObject(objid)->SetAttr(attr); GetObject(objid)->SetText(text); GetObject(objid)->SetPosition(x,y);
- ダイアログクラスを使う方法 Update(objid,attr); Update(objid,text); Update(objid,x,y);
この2つは表示の更新をするか、しないかの違いがあります。
GetObject(objid)->SetAttr(attr);
このようにオブジェクトクラスを使用した場合、オブジェクトの内容は変更されますが、実際には表示されません。 表示するには、
FlipOff()
GetObject(objid)->SetAttr(attr);
GetObject(objid)->Update();
FlipOn() ←更新領域の再表示
もしくは
GetObject(objid)->SetAttr(attr);
GetObject(objid)->Update();
Update() ←画面全体の再表示
とします。
ダイアログクラスを使用した場合は、内部で FlipOff() FlipOn() を実行するので表示されます。
しかし、画面を更新するので、ダイアログがオープンする前には使用できません。
オープン前に、ダイアログのオブジェクトパラメータ等を変更する場合は、Update(objid,attr);などの関数は使用できません。
具体的には、コンストラクタ や、 PreInitial(); 関数がコールされる時点ではダイアログはまだオープンされていません。
そのタイミングでオブジェクトを変更する場合はダイアログのクラス経由でのオブジェクトへのアクセスは出来ません。
ダイアログがオープンされた後でも複数のオブジェクトを更新する場合は、更新する範囲を FlipOff() FlipOn() で挟む必要があります。
そうしないと、1つのオブジェクトを更新する毎に画面の更新が発生し処理が遅くなってしまいます。
FlipOff() ←画面の更新をストップ
Update(OBJID-A,attr); ←オブジェクトの更新
Update(OBJID-B,text); ←オブジェクトの更新
Update(OBJID-C,x,y); ←オブジェクトの更新
FlipOn() ←画面が更新され変更が反映する
- PlusGで使用できる文字コードはUTF-8です。
プログラムをコーディングする場合は全てUTF-8を使用する必要があります。
- フレームバッファのビット数は8ビット、16ビット、24ビット、32ビットに対応しています。
しかし、サーフェースが内部で保持している状態では、8ビットと32ビットの2種類です。