前回のビットマップオブジェクトをさっそく使ってみましょう。今回はメニューのアイテムとしてビットマップを使います。
さほど難しいことはありません。あらかじめビットマップオブジェクトを作成しておき、メニューアイテムを追加する際に、 AppendMenu 関数の第2引数に 4 (MF_BITMAP) を指定し、第4引数に表示するビットマップのハンドルを指定するだけです。
説明することはほとんどないので、さっそくスクリプトを書いてみましょう。今回のスクリプトは、以前メニューバーを作成したときのスクリプトに手を加えただけです。ここでは前回のビットマップオブジェクト作成モジュールを使用しています。
ここで示すスクリプトでは次のビットマップファイルを使用します。この画像は、左右ぞれぞれのサイズが 100×50 で、あわせて全体のサイズが 200×50 になっています。
(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
だいたい分かると思います。最後にビットマップを削除しておきましょう。
今回はメニューバー上のアイテムにビットマップを表示していますが、もちろん、ドロップダウンメニューやショートカットメニューなどにもビットマップのアイテムを表示できます。いろいろと試してみてください。