
前回のビットマップオブジェクトをさっそく使ってみましょう。今回はメニューのアイテムとしてビットマップを使います。
さほど難しいことはありません。あらかじめビットマップオブジェクトを作成しておき、メニューアイテムを追加する際に、 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
だいたい分かると思います。最後にビットマップを削除しておきましょう。
今回はメニューバー上のアイテムにビットマップを表示していますが、もちろん、ドロップダウンメニューやショートカットメニューなどにもビットマップのアイテムを表示できます。いろいろと試してみてください。