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