シンプルモードステータスバー

シンプルモード

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