04) 窓を使おう
 以前、どこかの掲示板に、CreateWindow、というコマンドに関する疑問を書きこんだことがあります。
AmiSolもAmiKujiも、CreateWindowを使わなくても、デフォルトでスクリーンに書きこまれるため、どうしてこのコマンドがあるのだろう?と言う疑問でした。
次のアプリのアイディアを考えている時、ふと、思いついたことがありました。
CreateWindowで定義したグラフィックエリアよりも大きな画像を表示したらどうなるんだろう?
と言うことです。

まず、手始めに、このような大きな画像(98x151)を用意して、小さな定義エリア(60x60)に書きこんでみました。

      定義:CreateWindow("Test",50,50,60,60)
      描画:SetCurrentWindow "Test"
         DrawBitmap 1005,0,0

 +  = 

予想通り、定義したグラフィックウィンドウ内のみ、描画されました。
それも、座標は、定義したウィンドウ部分の左上が(0,0)になるようです。

では、座標を変えてみましょう。

         DrawBitmap 1005,10,5


この場合、座標に0以上の数字を入れたときは動作しました、しかし、
         DrawBitmap 1005,-10,5
のように、どちらかにでも負の数を指定すると、コンパイル時にエラーになりました。負の数を指定するとエラーになるのでしょうか?ゲームに使おうと思ったのに残念です。

とはいえ画像をウィンドウ内でグリグリ動かすのは魅力です。そこで、グローバルな変数を用意して、次のような画面を作りました。
[U][D][L][R]のボタンをタップすると、ウィンドウ内で画像が上下左右に動くものです。もちろん、画像の方は、上下左右に1ピクセルずつの空白をつけるテクニックは忘れていません。(「02)そこを動くな?!」を参照して下さい。)


この時、座標が負になってもいいや、と思ってチェックルーチンをつけずに、とりあえず作ってみました。最悪の場合、Palmがハングしますが、POSEだしいいや、と思って実行してみました。すると、ちゃんと負の数を受け付けているではありませんか。



これで、グラフィックウィンドウの有用性が1つ分かった気がします。このような手法を使えば、結構、表現の凝ったゲームなどができるかもしれませんね。
しかし、疑問に思うのは、定数で指定した時のコンパイルエラーです。
これは推測ですが、DrawBitmapの引数は、アルファベットか数字のみ、コンパイラ側で通るのではないでしょうか?あくまでも推測ですが、もしそうであるなら、そういうコマンド類が他にあるかもしれませんね。

その他、気が付いたことですが、タップ時のGetPen で得られる座標は、現在、カレントになっているウィンドウ内の座標系が使われるようです。これは、タップした時の座標を表示するコードを追加して調べてみました。
(そのプログラムは、sample03.prcです。CreatorIDは、"Test"ですので、前のsample02.prcがある場合等はこれを削除してからインストールして下さい。)
試す方法は、簡単です、まず、U,D,L,Rをタップしてイメージを移動させます。イメージが描画されたこの時点で、グラフィックのカレントは、中央のマスにあります。
今、ラベルには、タップしたボタンの座標が表示されているはずです。(0,0)-(159,159)の座標系なので、おおよそあっているかどうか分かりますね。この状態のまま、中央のイラスト部分をタップします。すると、中央のイメージ内での座標系で表示されるはずです。(0,0)-(59,59)の間の数字ですね。
次に、画面の何もないところをタップしてください。これで、カレントが画面全体になります。そこで、画面中央のイメージ部分をタップします。すると、座標系は画面全体系になりますね。
このように、GetPenなどで現在の座標を得る場合、カレントがどこにあるのか注意しなければなりません。

一方、これは、仕様上のバグでしょうか。
画面の上のラベルオブジェクトですが、中央のイメージにカレントがあるときにTextプロパティを変更して値を変えると、画面上の位置ではなく、カレントウィンドウ内でラベルの置かれている相対位置に座標の値が表示されてしまいました。


丸印の中に、座標が表示されているのが分かりますか?

このプログラムでは、CreateWindows("main",0,0,160,160,)、というウィンドウを定義して、タップした時の座標表示をするときに、こちらをカレントにしています。
カレントウィンドウが描画対象になるのは、わかりますが、オブジェクトの位置まで変わってしまうのは、納得できませんね。

このように、不具合もありますが、CreateWindowで定義したグラフィックエリアを使えば、NS Basic上でも簡単にスクロールを実現できることが分かりました。
これで、疑問の1つがクリアされた気がすると同時に、使い道が多くなった気がしますね。