メニューアイテムにビットマップを使ってみる

ビットマップメニュー

前回のビットマップオブジェクトをさっそく使ってみましょう。今回はメニューのアイテムとしてビットマップを使います。

さほど難しいことはありません。あらかじめビットマップオブジェクトを作成しておき、メニューアイテムを追加する際に、 AppendMenu 関数の第2引数に 4 (MF_BITMAP) を指定し、第4引数に表示するビットマップのハンドルを指定するだけです。

サンプルスクリプト

説明することはほとんどないので、さっそくスクリプトを書いてみましょう。今回のスクリプトは、以前メニューバーを作成したときのスクリプトに手を加えただけです。ここでは前回のビットマップオブジェクト作成モジュールを使用しています。

ここで示すスクリプトでは次のビットマップファイルを使用します。この画像は、左右ぞれぞれのサイズが 100×50 で、あわせて全体のサイズが 200×50 になっています。

menuitem.bmp (menuitem.bmp)

ビットマップファイルのダウンロード

    #include "llmod.as"
    #include "hsgetmsg.as"

    #define WM_COMMAND    0x0111

    ; メニューアイテムIDを定義
    #define CMD_MESSAGE    1      ; 「表示」アイテムのID
    #define CMD_QUIT       2      ; 「終了」アイテムのID

    #module ;-----ビットマップオブジェクト作成モジュール-----------

    #deffunc CreateBitmap int, int, int, int
    mref px, 0              ; HSPウィンドウx座標
    mref py, 1              ; HSPウィンドウy座標
    mref sx, 2              ; xサイズ
    mref sy, 3              ; yサイズ
    mref stt, 64            ; stat
    mref bmscr, 67          ; 描画中ウィンドウのBMSCR構造体

    ; ディスプレイのデバイスコンテキストのハンドル取得
    devname = "DISPLAY"
    pm = 0,0,0,0
    getptr pm, devname      ; "DISPLAY"のアドレス
    dllproc "CreateDCA", pm, 4, D_GDI@
    hdcScreen = stat        ; ディスプレイのデバイスコンテキスト

    ; ディスプレイ互換ビットマップオブジェクト作成
    pm = hdcScreen, sx, sy
    dllproc "CreateCompatibleBitmap", pm, 3, D_GDI@
    hbitmap = stat          ; ビットマップオブジェクトのハンドル

    ; ディスプレイ互換デバイスコンテキスト作成
    pm = hdcScreen
    dllproc "CreateCompatibleDC", pm, 1, D_GDI@
    hdcMemory = stat        ; メモリデバイスコンテキストのハンドル

    ; ビットマップをデバイスコンテキストに選択
    pm = hdcMemory, hbitmap
    dllproc "SelectObject", pm, 2, D_GDI@

    ; HSPウィンドウからビットマップにイメージをコピー
    pm = hdcMemory, 0, 0, sx, sy, bmscr.4, px, py, $CC0020
    dllproc "BitBlt", pm, 9, D_GDI@

    ; デバイスコンテキストを削除
    dllproc "DeleteDC", hdcMemory, 1, D_GDI@
    dllproc "DeleteDC", hdcScreen, 1, D_GDI@

    stt = hbitmap           ; ビットマップオブジェクトのハンドル
    return

    #global ;------------------------------------------------------


    ; ビットマップオブジェクトを作成
    buffer 2,,, 0
    picload "menuitem.bmp"
    CreateBitmap 0, 0, 100, 50    ; ビットマップ1作成
    hbitmap1 = stat               ; ビットマップ1のハンドル
    CreateBitmap 100, 0, 100, 50  ; ビットマップ2作成
    hbitmap2 = stat               ; ビットマップ2のハンドル

    ; メニューを作成
    dllproc "CreateMenu", pm, 0, D_USER
    hmenu = dllret                ; メニューハンドル

    ; メニューアイテムを追加
    pm.0 = hmenu                  ; メニューハンドル
    pm.1 = 4                      ; MF_BITMAP
    pm.2 = CMD_MESSAGE            ; コマンドID
    pm.3 = hbitmap1               ; 表示するビットマップ1のハンドル
    dllproc "AppendMenuA", pm, 4, D_USER

    pm.0 = hmenu
    pm.1 = 4
    pm.2 = CMD_QUIT
    pm.3 = hbitmap2               ; 表示するビットマップ2のハンドル
    dllproc "AppendMenuA", pm, 4, D_USER

    ; ウィンドウのサブクラス化
    set_subclass
    hwnd = stat                   ; HSPウィンドウのハンドル
    set_message WM_COMMAND        ; 取得メッセージ設定

    ; メニューをウィンドウに割り当てる
    pm.0 = hwnd                   ; ウィンドウハンドル
    pm.1 = hmenu                  ; メニューハンドル
    dllproc "SetMenu", pm, 2, D_USER

    ; メニューを再描画
    pm.0 = hwnd                   ; メニューハンドル
    dllproc "DrawMenuBar", pm, 1, D_USER

    ; メッセージパラメータ用変数
    dup msg,  msgval.1            ; メッセージが格納される変数
    dup wprm, msgval.2            ; wParamパラメータが格納される変数
    dup lprm, msgval.3            ; lParamパラメータが格納される変数

    onexit *lb_on_quit            ; 終了時の処理

*mainloop
    get_message msgval
    if msgval == hwnd {
        if msg == WM_COMMAND {
            gosub *lb_on_command
        }
    } else {
        wait 10
    }
    goto *mainloop

*lb_on_command
    ; WM_COMMAND が送られたときの処理
    ; メニュー以外から送られた場合は何もしない
    if lprm != 0 : return

    ; 選択されたメニューアイテムID
    itemid = wprm & $FFFF

    if itemid == CMD_MESSAGE {
        dialog "アイテムが選択されました", 0, "メニューテスト"
    }
    if itemid == CMD_QUIT {
        dialog "終了します", 0, "メニューテスト"
        goto *lb_on_quit
    }
    return

*lb_on_quit
    ; 終了時の処理
    ; ビットマップオブジェクトの削除
    dllproc "DeleteObject", hbitmap1, 1, D_GDI
    dllproc "DeleteObject", hbitmap2, 1, D_GDI
    end

だいたい分かると思います。最後にビットマップを削除しておきましょう。

今回はメニューバー上のアイテムにビットマップを表示していますが、もちろん、ドロップダウンメニューやショートカットメニューなどにもビットマップのアイテムを表示できます。いろいろと試してみてください。