
例えば、前回作成されたステータスバーのように、複数のパーツ(1つだけのパーツでもよいですが)にテキストが表示されていたとしましょう。ここで、ステータスバーに一時的に別の情報(テキスト)を表示し、その後、また元の状態に戻したいとします。
前回に説明した方法を使ってこの動作を実現させようとすると、まず、パーツを1つに設定して、そこに表示させたいテキストを設定します。次に、再び元の状態に戻すために、元のパーツの数を設定して、すべてのパーツにテキストを指定していかなくてはなりませんね。
実は、ステータスバーにはシンプルモードなる機能があり、上の例のようなことを簡単に実現してしまうのです。
ステータスバーには、シンプルモード(simple mode)と、それに対応するノンシンプルモード(非シンプルモード)(nonsimple mode)と呼ばれる、2つのモードがあります。前回に作成したのは、この2つのうち、非シンプルモードの状態のステータスバーでした。
「シンプルモード」という名前は、ステータスバーの中がいくつかの領域に分かれたりせず、単一のパーツからなる状態にあることから、そう呼ばれます。とはいっても、前回の方法で作成されたパーツが1つだけのステータスバーは、シンプルモードではなく、あくまでパーツが1つだけの非シンプルモードのステータスバーであるので、間違えないように注意しましょう。
シンプルモードの特徴は、その状態(というより、テキスト)が非シンプルモードのものとは別に保持されているということです。非シンプルモードからシンプルモードに切り替えて、そこでシンプルモード用の表示テキストを設定すると、ステータスバーにはそのテキスト1つだけが表示されます。しかし、このとき非シンプルモードのときの状態は内部で保持されていて、再び非シンプルモードに戻したときに、最初に表示されていた状態に戻るのです。
ただし、シンプルモードは、非シンプルモードのときとは違って、パーツは1つだけになってしまい、そのため、表示できるテキストも1つだけです。
一般的なアプリケーションでは、ポップアップ表示されているメニューなどでメニューアイテムがハイライト表示されているときに、そのメニューアイテムのヘルプテキスト(アイテムの説明)をシンプルモードで表示する、といったことが行なわれています。
ただし、現在のバージョンのHSP(ver 2.55)では、このようなメニューアイテムのヘルプテキスト表示を行なうことはできません。メニューアイテムのヘルプテキストを表示させるには、メッセージの割り込み処理が行なえるようになる必要があります。
シンプルモードと非シンプルモードを切り替えるには、ステータスバーに SB_SIMPLE メッセージを送信します。
#define SB_SIMPLE 0x0409
SB_SIMPLE
wParam = fSimple;
lParam = 0;
fSimple パラメータ(wParam の値)には、シンプルモードにするかどうかのフラグを指定します。このパラメータ 1 (TRUE) を指定するとシンプルモードに設定されます。また、 0 (FALSE) を指定すると、非シンプルモードに戻ります。
シンプルモード用のテキストを設定するには、非シンプルモードの場合と同様に SB_SETTEXT メッセージを送信します。
#define SB_SETTEXT 0x0401
SB_SETTEXT
wParam = iPart | uType;
lParam = pszText;
iPart パラメータには、非シンプルモードではパーツのインデックスを指定しましたが、シンプルモードテキストを設定するときには常に 255 を指定します。それ以外のパラメータについては、非シンプルモードのときと同じです。
SB_SETTEXT メッセージの iPart パラメータに 255 を指定すると、現在のモードがシンプルモードであるとみなされてしまいます。そのため、非シンプルモードのときにシンプルモードテキストを設定しないようにしなければなりません。シンプルモードテキストの設定は、 SB_SIMPLE メッセージでシンプルモードにしてから行なってください。
さて、実際にスクリプトを書いてみます。前回のスクリプトに少し手を加えて、シンプルモードと非シンプルモードの切り替えを行なってみましょう。
#include "llmod.as"
#include "hsgetmsg.as"
; コモンコントロールライブラリの初期化
dllproc "InitCommonControls", pm, 0, D_COMCTL
; ステータスバーの作成
mref bmscr, 67 ; 描画中ウィンドウのBMSCR構造体
classname = "msctls_statusbar32" ; ステータスバーのウィンドウクラス
pm.0 = 0
getptr pm.1, classname
pm.2 = 0
pm.3 = 0x50000003 ; WS_VISIBLE | WS_CHILD | CCS_BOTTOM
pm.4 = 0, 0, 0, 0 ; 位置・サイズはすべて 0 を指定
pm.8 = bmscr.13 ; 親ウィンドウのハンドル
pm.9 = 1 ; コントロールID
pm.10 = bmscr.14 ; インスタンスハンドル
pm.11 = 0 ; NULL
dllproc "CreateWindowExA", pm, 12, D_USER
hStatus = stat ; ステータスバーのウィンドウハンドル
; ステータスバーを3つのパーツに分ける
partspos = 50, 120, -1 ; パーツの位置( -1 のとき右端まで表示)
; SB_SETPARTS メッセージ送信
pm = hStatus, $404, 3
getptr pm.3, partspos
sendmsg pm
; パーツの表示テキストを設定
sdim msgtext , 128, 3
msgtext.0 = "パーツ1" ; 左揃えで表示
msgtext.1 = "\tパーツ2" ; 中央揃えで表示
msgtext.2 = "\t\tパーツ3" ; 右揃えで表示
repeat 3
; SB_SETTEXT メッセージ送信
pm = hStatus, $401, cnt
getptr pm.3, msgtext.cnt
sendmsg pm
loop
objsize winx
button "simple mode 表示", *lb_mode
button "nonsimple mode 表示", *lb_mode
stop
*lb_mode
if stat == 0 {
; シンプルモードに切り替え
; SB_SIMPLE メッセージ送信
pm = hStatus, $409, 1, 0
sendmsg pm
; SB_SETTEXT メッセージ送信
msgtext = "シンプルモードテキスト"
pm = hStatus, $401, 255
getptr pm.3, msgtext
sendmsg pm
} else {
; 非シンプルモードに切り替え
; SB_SIMPLE メッセージ送信
pm = hStatus, $409, 0, 0
sendmsg pm
}
stop