例えば、前回作成されたステータスバーのように、複数のパーツ(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