HSP3 プログラミングの基礎X | |
(3) スクリーンセーバー 3
◎ 設定(コンフィグ)
スクリーンセーバーの動作に関する設定などを行う。例えば、表示する文字列を「SCREEN SAVER」から別の文字列に、表示する個数を設定できる、などである。
ただし、設定のウィンドウは[設定(T)]ボタンをクリックすると"ssaver /c"で起動されて、設定が終了するとプログラムも終了してしまうので、設定したデータはどこにも残らない。設定したデータはディスクやレジストリなどに保存しておかなければならない。
ここでは、メモリノートパッドを利用して設定したデータをファイルとして保存する方法でプログラムを作成していくことにする。
ここまでのサンプルでは、文字列や個数のデータを変更できるようにはなっていない。まずは、データを変更できるようにする。
(ssaver05.hsp)
表示個数(回数)と表示メッセージが変更できるようにする。
;ssaver05.hsp #packopt name "screensaver" ;実行ファイル名 #packopt type 2 ;スクリーンセーバー randomize para = dir_cmdline ;パラメータ取得 para = strmid(para, 0, 2) if para = "/p" | para = "/P" : goto *preview ;プレビュー if para = "/s" | para = "/S" : goto *ssaver ;フルスクリーン if para = "/c" | para = "/C" : goto *config ;コンフィグ dialog "無効なオプションです。" + "[" + para + "]" end *config mes "CONFIG" stop *preview win_x = ginfo_winx ;ウィンドウサイズ(幅) win_y = ginfo_winy ;ウィンドウサイズ(高さ) font "MS ゴシック", 12 goto *ssmain stop *ssaver win_x = ginfo_dispx ;ディスプレイサイズ(幅) win_y = ginfo_dispy ;ディスプレイサイズ(高さ) bgscr 1, win_x, win_y ;枠なしのウィンドウ *ssmain notesel cfg ;メモリノートパッド設定 exist "screensaver.dat" ;設定データファイル if strsize = -1 { ;ファイルなし kaisu = 20 moji = "SCREEN SAVER" } else { ;ファイルあり noteload "screensaver.dat" noteget dd, 0 ;回数(文字型) noteget moji, 1 ;文字列 kaisu = 0 + dd ;数値変換 } *ssmain2 color 0, 0, 0 ;黒色 boxf ;画面消去(四角塗りつぶし) repeat kaisu color rnd(255), rnd(255), rnd(255) ;文字色 pos rnd(win_x), rnd(win_y) mes moji stick key ;test if key = 128 : end ;test await 500 loop goto *ssmain2 end
起動オプションに"/s"を設定してから実行する。これまでと変わらず「SCREEN SAVER」と表示される。
プログラムは、ラベル*ssmain以降がスクリーンセーバー本体の処理である。前のサンプルとは、それ以外の部分に変更はない。
exist命令はファイルのサイズを調べる命令である。結果はシステム変数strsizeに格納される。ファイルが存在しなければシステム変数strsizeに-1が格納される。
サンプルでは、設定データファイルscreensaver.datがなければ、変数kaisuを20、変数mojiを"SCREEN SAVER"にして動作し、ファイルがあれば読み込んで変数kaisuとmojiにデータを設定して動作するようにしている。
メモ帳などで設定データファイルscreensaver.datを作成する。1行目に数字(回数)、2行目に表示するメッセージを入力して、サンプルと同じフォルダに保存してから実行する。メッセージと表示個数が変わればOKである。
設定画面では、表示回数と表示メッセージを設定するだけである。
設定画面作成中は起動オプションに"/c"を設定して実行するとよい。
(ssaver06.hsp)
表示個数(回数)と表示メッセージが変更できるようにする。
;ssaver06.hsp #packopt name "screensaver" ;実行ファイル名 #packopt type 2 ;スクリーンセーバー #packopt xsize 320 #packopt ysize 120 randomize para = dir_cmdline ;パラメータ取得 para = strmid(para, 0, 2) if para = "/p" | para = "/P" : goto *preview ;プレビュー if para = "/s" | para = "/S" : goto *ssaver ;フルスクリーン if para = "/c" | para = "/C" : goto *config ;コンフィグ dialog "無効なオプションです。" + "[" + para + "]" end ;設定画面 ----- *config title "スクリーンセーバー" notesel cfg exist "screensaver.dat" ;設定データファイル if strsize = -1 { ;ファイルなし skaisu = "20" moji = "SCREEN SAVER" } else { ;ファイルあり noteload "screensaver.dat" noteget skaisu, 0 ;回数(文字型) noteget moji, 1 ;文字列 } pos 10, 8 : mes "表示回数" ;設定画面作成 pos 100, 8 : input skaisu pos 10, 40 : mes "メッセージ" pos 100, 40 :input moji, 200 pos 240, 80 : button "OK", *settei stop *settei noteadd skaisu, 0, 1 noteadd moji, 1, 1 notesave "screensaver.dat" ;設定データファイル書き込み end ;プレビュー画面 ----- *preview win_x = ginfo_winx ;ウィンドウサイズ(幅) win_y = ginfo_winy ;ウィンドウサイズ(高さ) font "MS ゴシック", 12 goto *ssmain stop ;スクリーンセーバー本体 ----- *ssaver win_x = ginfo_dispx ;ディスプレイサイズ(幅) win_y = ginfo_dispy ;ディスプレイサイズ(高さ) bgscr 1, win_x, win_y ;枠なしのウィンドウ *ssmain notesel cfg ;メモリノートパッド設定 exist "screensaver.dat" ;設定データファイル if strsize = -1 { ;ファイルなし kaisu = 20 moji = "SCREEN SAVER" } else { ;ファイルあり noteload "screensaver.dat" noteget dd, 0 ;回数(文字型) noteget moji, 1 ;文字列 kaisu = 0 + dd ;数値変換 } *ssmain2 color 0, 0, 0 ;黒色 boxf ;画面消去(四角塗りつぶし) repeat kaisu color rnd(255), rnd(255), rnd(255) ;文字色 pos rnd(win_x), rnd(win_y) mes moji ;stick key ;test ;if key = 128 : end ;test await 500 loop goto *ssmain2 end
一応、完成である。
実行ファイルを作成して、画面のプロパティ のダイアログから動作を確認する。
プログラムは、ラベル*config以降*previewjまでが設定賭面の処理である。前のサンプルとは、それ以外の部分に変更はない。
ラベル*config以降が追加した処理である。まず、設定データファイルがあればそれを読み込んで変数kaisuとmojiに格納している。スクリーンセーバー本体とほぼ同じ処理である。
次に、画面を作成している。これば実行しながらpos命令で位置を調整した。最初は640×480ドットの画面だが配置が完了した時点で大きすぎるので320×120ドットにした。ウィンドウサイズはscreen命令でも設定できるが、ここでは#packoptでウィンドウサイズを320×120ドットに設定している。
このように、スクリーンセーバ本体はプレビュー画面と関係しており、さらに、これらと設定画面が関係しているので、プログラムを作成するときはこの関係を頭の片隅に入れて考える必要がある。しかし、単純にスクリーンセーバーだけをプログラムするのであればスクリーンセーバー本体の部分だけを考えればよい。まずは、できるところからやってみよう。ただし、スクリーンセーバーのプログラムであるから同じ場所に同じものが長時間表示されるようなものではスクリーンセーバーの意味がなくなるので注意すること。
2007 © Hiroshi Masuda |