ビットマップメニュー項目

ビットマップメニュー

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

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

サンプルスクリプト

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

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

menuitem.bmp (menuitem.bmp)

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

#module ;======================================================
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" sptr, sptr, sptr, int
#cfunc CreateCompatibleDC "CreateCompatibleDC" int
#cfunc CreateCompatibleBitmap "CreateCompatibleBitmap" int, int, int
#func  SelectObject "SelectObject" int, int
#func  BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#func  DeleteDC "DeleteDC" int
#func  DeleteObject "DeleteObject" int

#define NULL 0
#define SRCCOPY     0x00CC0020

;--------------------------------------------------------------
; CreateBitmap  ビットマップオブジェクト作成
;--------------------------------------------------------------
#defcfunc CreateBitmap int px, int py, int sx, int sy

; ディスプレイのデバイスコンテキストのハンドル取得
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL)

; ディスプレイ互換ビットマップオブジェクト作成
hBitmap = CreateCompatibleBitmap(hdcScreen, sx, sy)

; ディスプレイ互換デバイスコンテキスト作成
hdcMemory = CreateCompatibleDC(hdcScreen)

; ビットマップをデバイスコンテキストに選択
SelectObject hdcMemory, hBitmap
hOldBitmap = stat

; HSPウィンドウからビットマップにイメージをコピー
BitBlt hdcMemory, 0, 0, sx, sy, hdc, px, py, SRCCOPY

; デバイスコンテキストの選択ビットマップを戻す
SelectObject hdcMemory, hOldBitmap

; デバイスコンテキストを削除
DeleteDC hdcMemory
DeleteDC hdcScreen

; ビットマップオブジェクトのハンドルを返す
return hBitmap

;--------------------------------------------------------------
; DeleteBitmap  ビットマップオブジェクト削除
;--------------------------------------------------------------
#deffunc DeleteBitmap int hbmp

; ビットマップオブジェクトを削除
DeleteObject hbmp
return

#global ;======================================================

#uselib "user32.dll"
#cfunc CreateMenu "CreateMenu"
#func AppendMenu  "AppendMenuA" int,int,int,sptr
#func SetMenu     "SetMenu"     int,int
#func DrawMenuBar "DrawMenuBar" int

#define WM_COMMAND      0x0111
#define MF_BITMAP       4

; メニュー項目IDを定義
#define CMD_ID_MESSAGE  1       ; 「表示」メニュー項目のID
#define CMD_ID_QUIT     2       ; 「終了」メニュー項目のID

; 画像ファイルを読み込んでビットマップオブジェクトを作成
buffer 2,,, 0
picload "menuitem.bmp"
hBitmap1 = CreateBitmap(0, 0, 100, 50)
hBitmap2 = CreateBitmap(100, 0, 100, 50)

; メニューを作成
hMenu = CreateMenu()

; ビットマップメニュー項目を追加
AppendMenu hMenu, MF_BITMAP, CMD_ID_MESSAGE, hBitmap1
AppendMenu hMenu, MF_BITMAP, CMD_ID_QUIT, hBitmap2

; メニューをウィンドウに割り当てる
gsel 0
SetMenu hwnd, hMenu

; メニューを再描画
DrawMenuBar hwnd

; メッセージハンドラを設定
oncmd gosub *OnCommand, WM_COMMAND

; 終了時の処理
onexit *OnAppExit
stop


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

; 選択されたメニュー項目ID (wParamの下位ワード)
itemID = wparam & $FFFF

if itemID == CMD_ID_MESSAGE {
    dialog "メニュー項目が選択されました", 0, "サンプルプログラム"
}
if itemID == CMD_ID_QUIT {
    dialog "終了します", 0
    goto *OnAppExit
}
return

*OnAppExit
; 終了処理
; ビットマップオブジェクト削除
if hBitmap1 : DeleteBitmap hBitmap1
if hBitmap2 : DeleteBitmap hBitmap2

end