PlusGライブラリについて

PlusGは組込みLinux上で動作するグラフィカルなアプリケーションを作成するライブラリとツールの キットです。
ライブラリはコアエンジンに「DirectFB」を使用しています。
「DirectFB」はCPUパワーを必要とするX-Windowシステムなどを使わずに直接フレームバッファに 描画するライブラリで、CPUパワーの低い組込み機器でもストレスなく動作させることができます。
ウィンドウシステムやボタン、画像、タイマー機能などを備えたイベントドリブン型GUIプログラムを 簡単に作成することが可能です。
また、ボタンやエディットボックスなどのオブジェクトはユーザオリジナル画像(png) から生成しますのでデザインも思いのままです。
ライブラリの他、開発ツールとして、プロジェクト管理機能付き高機能エディタ(統合開発環境SWEET)、 ダイアログエディタ、カラーパレットエディタ(減色、共通パレット)が付いています。
PlusGとPlusGが必要とするライブラリは全てソースコードが付いていますのでLinuxが動く環境であれば アーキテクチャに依存することなくいろいろな環境で使用可能です。

PlusGライブラリ

DirectFB

PlusGのグラフィック表示はDirectFBを使用しています。
DirectFBはハードウェアグラフィックアクセラレーション機能を持ったスリムなライブラリです。 ハードウェアグラフィックアクセラレーション機能を持っていない環境においても Linux Framebuffer Deviceを持つすべての機器で使用可能です。
キーボードやマウスなどのデバイス入力、透明機能を備えたウィンドウシステム、複数モニタ、 レイヤ機能などを提供します。

サーフェースとウィンドウ

サーフェースとは透明な画用紙です。文字を書く、画像、図形などを描くことが可能です。
しかし、それ以外の機能は持っていません。
ウィンドウは1つのサーフェースを持っていて、描くこと以外にも沢山の機能を備えます。
サーフェースとサーフェースの重なりに対する処理(レイヤ機能)やマウス、タッチパネル、 キーボードなどのデバイスからの通知、ウィンドウ間の通知(メッセージ管理)などを処理します。

オブジェクト

オブジェクトはサーフェースから出来ています。
オブジェクトには、ボタン、エディットボックス、フレーム、テキスト、ピクチャーなどがあり、 それぞれのオブジェクトは1つ以上のサーフェースを持っています。このサーフェースには、ボタン やエディットボックスなどのリソース画像が保持されています。
また、エディット文字やウィンドウやボタンのタイトル文字など、文字列の表示、マウス、キーボードなどからの メッセージ処理など、いろいろな機能が拡張されています。

ダイアログ

ダイアログはウィンドウです。
ダイアログは複数のオブジェクトを保持し、管理します。オブジェクトを使用して 値の設定、文字、数値の表示など、ボタンの押下など、ユーザインターフェース機能を提供します。 また、タイマー機能なども備えています。
メッセージ(イベント)処理、オブジェクトのコントロール、画面遷移(他のダイアログの表示、消去)など、 アプリケーション開発は、ダイアログ関数が請け負う場面が多く存在します。 (もっとも多く利用する関数と言えます)

メッセージ(イベント通知)

PlusGで作成されるアプリケーションはメッセージドリブン型です。
PlusGのダイアログにはいくつかのメッセージ処理用のコールバック関数(Virtual)が用意されていて、 オブジェクトやデバイス、タイマーなどからイベントを受け取ると、それらの関数をコールします。
代表的なイベント通知関数に次のものがあります。

※分かりやすい表現の為「メッセージドリブン」という表現を採用しています。
一般的には「イベントドリブン」「イベント駆動」という呼び方の方が多く使われているようです。

オブジェクトの種類

PlusGのオブジェクト

リソース画像とオブジェクト

オブジェクトはリソース画像(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:下段部分
    

ボタンメッセージ(Click Down Up Push)

メッセージタイプ

登録されたボタンオブジェクトからは次のメッセージが発行されます。

SG_ACT_DOWN  :押された
SG_ACT_UP    :離された
SG_ACT_CLICK :同一オブジェクトで、押され離された
SG_ACT_REPEAT:長押しによりリピートが発生した

メッセージのタイプにより通知関数が変化します。

通知イベント

画像の更新(Flip Upadte)

画像の更新
サーフェースは画像を描画、保持することができますが、サーフェースにある画像は メモリのどこかに書かれているだけで、実際に見ることはできません。
Flip()関数をコールするタイミングで実際にフレームバッファなどにコピーされ、 視認できるようになります。オブジェクトクラスの関数はサーフェースの中身や状態を 変更することが目的で実際に表示するにはFlip()を実行する必要があります。
オブジェクトクラスの中で、使用頻度の高い一部の関数はダイアログクラスに包括されて いて簡単に呼び出すことができるようになっています。この時、ダイアログクラスからは 内部でFlip()を呼び出しますのでFlip()を行う必要はありません。
画像の更新 複数部分の変更
Flip()はCPU負荷の高い処理です。複数のオブジェクトを変更する場合、変更とFlip()を 繰り返すと処理が重たくなることがあります。
このような場合はFlipOff()、FlipOn()を使うと頻繁なフレーム バッファ アクセスを 抑えることができます。関数内部でFlip()が呼ばれる関数を使用するまえにFlipOff() を使用すると以降、FlipOn()を実行するまでFlip()が抑制されます。
SetText()とUpdate()の違い
オブジェクトの属性や文字列、表示位置などを変更する方法は2種類あります。

この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を使用する必要があります。

ピクセルフォーマット(1ピクセルのビット数)

フレームバッファのビット数は8ビット、16ビット、24ビット、32ビットに対応しています。
しかし、サーフェースが内部で保持している状態では、8ビットと32ビットの2種類です。

PlusG リファレンスマニュアル Ver 2.0.0