5.電卓画面の表示




『今度こそ表示方法』
画面を使うための準備にG@SETUP関数を実行すると書いたが、その後にする事は、画面に表示する画像をハードディスクからメモリに読み込み、実際に画面に貼り付ける作業です。
まず、画面に表示する画像を読み込むには「G@CHRLOAD」関数を使います。同関数の仕様は次に示します。

関数名
 
G@CHRLOAD 
 
機能
 
ビットマップ画像ファイルの読み込みを行います。画像はキャラクターパターン形式で読み込まれます。読み込みを成功すると戻り値が0以外の数字となります。戻り値はキャラクターパターン番号となります。なお、キャラクターパターンが不要になった時はG@RELEASEで開放して下さい。
注意)読み込み時の画面パレットと読み込むビットマップのパレットが異なる場合、画面パレットに合わせるように最も近いパレットに変換をします。その為、パレットの変換を行った場合、思ったように変換できない事があるので気をつけてください。もし、パレットの変換を起こしたく無い場合は、先に(G@PALLOADを使い)パレットを読み画面に(G@PALCHANGEを使い)反映した後にロードを行うようにしてください。  
 
int G@CHRLOAD( " ファイル名 " )
 
パラメタ 説明
" ファイル名 " 読み込むビットマップ画像ファイル名


関数への引数(パラメタ:入力値)に画像のファイル名を指定すると、実行結果として読み込んだ画像の画像番号が戻される。
ここで補足だが、引数であるファイル名はダブルクォテーション(「””」)で囲んでほしい。これは、LGP(大方の言語も同じ)ではダブルクォテーション(「””」)(もしくはシングルクォテーション(「’’」))で囲む事になっている。ファイル名は文字列であるので、この仕様にそくしてダブルクォテーションで囲むことになっているからである。

CH2=G@CHRLOAD("DENTAKU.BMP")


『ファイル名って?』
ところで、「ファイル名についてよく知らない」と言う人はいないでしょうか?Windowsが現れる前に存在したDOSというOS(Windowsでも「MS-DOSプロンプト」として実装しています)を知っている方なら多分問題はないでしょうが、Windowsしか経験のない人にはちょっと勉強してもらいたい。

エクスプローラーを起動すると「名前」という欄があり、Windowsユーザーにはそれがファイル名であると説明している。しかし、本当のファイル名称は少し違います。エクスプローラーでどれでもよいので一つのファイルを右クリックしてみてください。そのときに開くウインドウの一番下「プロパティ(R)」を選択してみてください。



選択したファイルのプロパティ(情報)が現れます。その中に「MS-DOSファイル名」という欄がありますが、それが、G@CHRLOAD関数に指定するファイル名になります。
メモ帳で作ったファイルをエクスプローラーで見ると「ファイルの種類」には「テキスト文章」と表示されますが、ハードディスクやフロッピーに保存する際には、テキストファイルを示す「.TXT」という識別子がファイル名の後ろに付加されます。エクスプローラーはこの識別子を見て「テキスト文章」と画面に出しているにしかすぎないのです。ちなみに画像ファイルの場合「ビットマップ画像は”.BMP”」となる。



関連してもう一つ覚えてほしいことがあります。それはフォルダの指定です。
単純にファイル名の指定だけで済むのはLGPで実行させるプログラムと同じフォルダにある画像(というかLGPで扱う全てのファイル)だけである。プログラムと違うフォルダにあるファイルを指定するには、ちょっと指定に工夫が要ります。指定方法には「絶対指定」と「相対指定」があります。
絶対指定とはドライブ名からお目当ての画像までの全フォルダを指定して行く指定である。
「ディレクトリ」と言い方の方が技術者らしくみえる。フォルダの事を昔は「ディレクトリ」と呼んでいたものをWindows95からフォルダと呼ばせるようにマイクロソフトが決めたのだ。ちなみにUNIXでは「ディレクトリ」、汎用機では「データセット」と呼ぶ。

例えば「Cドライブ内のWindowsフォルダにある”花見”という画像」を示すには、

C:WINDOWS\花見.BMP


となります。ドライブ名の次にセミコロン「:」を付けお目当ての画像が格納されている所までの全階層のフォルダを後ろに円サイン記号「\」を付けて並べ、最後にファイル名を指定します。

次に相対指定ですが、これはプログラムのあるフォルダを基準にしてどこに保存されているかを指定します。
プログラムがあるフォルダの配下にあるフォルダに画像がある場合には、プログラム直下から当該画像の格納される全階層のフォルダを順番に指定します。
例えば「Cドライブ直下のTESTフォルダにプログラムがあり、その直下の「画像」フォルダにあるDENTAKU.BMP」を読み込むには次のようになる。

画像\DENTAKU.BMP


逆にプログラムのあるフォルダよりも上の階層にあるファイルを指定するにはピリオードを2個を指定します。ピリオードを2個現れるたびに階層一つ上に戻します。
例えば「Cドライブ直下のTESTフォルダにプログラムがあり、Cドライブにある(ようは最上位の階層に)ENTAKU.BMP」を読み込むには次のようになる。

..\DENTAKU.BMP

2階層下まで戻りたいときには、次のように「..\」を2回指定すれば良い。

..\..\DENTAKU.BMP


さらに「Cドライブ直下のTESTフォルダにプログラムがあり、同じくCドライブ直下の「画像」フォルダにあるDENTAKU.BMP」を読み込むには次のようになる。ようは1個フォルダを上がって「画像」フォルダに移っているのである。

..\画像\DENTAKU.BMP


『画像を画面に表示』
ちょっと横道にそれたが、次にG@CHRLOADで読み込んだ画像を画面に表示する。それにはは「G@CHRCOPY」関数を使う。この関数の仕様を次に示す。

関数名
 
G@CHRCOPY
 
機能
 
キャラクターパターン間のコピーを行います。コピー元/コピー先で任意の矩形から任意の矩形へのコピーを行う事が出来ます。コピー元とコピー先で異なる矩形を指定すると拡大縮小が行われます。このコピーでは、抜き色、反転の機能が利用できます。

書式
 
G@CHRCOPY( int CN_Src, int CN_Dest, int COPY_Mode, int Mirror )
 
パラメタ 説明
int CN_Src コピー元のキャラクタ番号
int CN_Dest コピー先のキャラクタ番号
int COPY_Mode コピーモード(0:ベタ、1:カラーキー(初期値は0:黒)を抜き色とする)
int Mirror 反転(0:通常、1:上下反転、2:左右反転、3:上下左右反転)


「 int CN_Src」はコピー元なので今回はG@CHRLOAD関数で取得した「CH2」を指定し、「int CN_Dest」にコピー先である画面を指定します。コピー先の画面とはG@SETUP関数で取得した「CH」を指定することになります。
「int COPY_Mode」と「int Mirror」は今回は0を指定してください。説明は仕様を見てもらえれば分かると思いますので省きます。プログラムでは次のようになります。

G@CHRCOPY( CH2 , CH , 0 , 0 )


『画面を最新に更新する』
G@CHRCOPY関数を使い読み込んだ画像を画面に書き込みましたが、これだけではまだ画面には見えません。これは、G@CHRCOPYでは画面の格納されているメモリに書き込んだだけであり、これを実際に画面上で見えるようにするには「G@FLIP」関数を実行する必要があるからです。プログラムは次のようになります。

G@FLIP( )


なぜ、「G@CHRCOPY関数での書き込みと同時に画面に表示されないのか?」というところに疑問を持つかもしれませんが、これには理由があります。ユーザーが見る事になるプログラムの画面は、たった一回の書き込み(LGPではG@CHRCOPYでの書き込み)だけで完成するとは限りません。普通は色々な部品(ボタンや画像)を書き込んで画面を作り上げるのですが、この時画面を作っているところをユーザーに見せるのはみっともないと思いませんか?
そこで全ての書き込みを終えユーザーに見せる画面が完成した時点に表示するような仕組みになっています。

『これまでのプログラムのまとめ』
これまでのプログラムをまとめたものを次に示します。また、画像も含めたファイルをダウンロード出来ますので実際に動作させてみてください。
4行目「LOOP命令」と6行目「ENDLOOP命令」はその間にある命令を繰り返す命令です。電卓の機能としては必要なプログラムではありませんが、一時的に指定しておきます。
もしこの命令がないとG@FLIP関数を終了した時点で即効でプログラムを終了してしまうので、それを防ぐため(すぐに終わったらつまらないでしょ?)の措置です。
なお、「ESC」キーを押すか、ウインドウの「×」ボタンを押せばプログラムは終了します。

CH=G@SETUP(320,240,16,1)
CH2=G@CHRLOAD("DENTAKU.BMP")
G@CHRCOPY(CH2,CH,0,0)
LOOP
G@FLIP( )
ENDLOOP

<<プログラムのダウンロード>>