More ... | メニューバーとツールバーの併用メニューバーとツールバーを実装する
HSP3.1B9で動作確認
(byりさ) スクリプト#include "mod_menu.as" #uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" #uselib "user32.dll" #func TrackPopupMenuEx "TrackPopupMenuEx" int,int,int,int,int,int #func DestroyMenu "DestroyMenu" int #func ClientToScreen "ClientToScreen" int,int #define MF_POPUP 0x0010 #define MF_SEPARATOR 0x0800 #define WM_NOTIFY 0x004E #define TBN_DROPDOWN -710 #define TB_BUTTONSTRUCTSIZE 0x041E #define TB_ADDBITMAP 0x0413 #define TB_AUTOSIZE 0x0421 #define TB_ADDBUTTONS 0x0414 #define TB_SETEXTENDEDSTYLE 0x0454 #define TB_GETRECT 0x0433 #define TBSTYLE_EX_DRAWDDARROWS 1 ; メニューアイテムIDを定義 #enum global NULL = 0 ; NULL #enum CMD_OPEN = 1000 ; [開く]アイテムのID #enum CMD_SAVE ; [保存]アイテムのID #enum CMD_QUIT ; [終了]アイテムのID #enum CMD_MESS ; [表示]アイテムのID #enum CMD_NEW ; [新規] #enum CMD_NEW1 ; [新規1] #enum CMD_NEW2 ; [新規2] #enum CMD_FROMFILE ; [ファイルから] #enum CMD_CUT ; [切り取り] #enum CMD_COPY ; [コピー] #enum CMD_PASTE ; [貼り付け] #enum CMD_UNDO ; [アンドゥ] #enum CMD_SEARCH ; [検索] screen 0, 300, 200 oncmd gosub *OnCommand, WM_COMMAND oncmd gosub *OnNotify, WM_NOTIFY onexit gosub *OnClose ; ポップアップメニューの作成 ; [ファイル]メニュー newmenu hfilemenu, 1 ; サブメニュー作成 addmenu hfilemenu, "開く(&O)" , CMD_OPEN ; 開く addmenu hfilemenu, "保存(&S)" , CMD_SAVE ; 保存 addmenu hfilemenu, "" , NULL , MF_SEPARATOR ; セパレータ addmenu hfilemenu, "終了(&Q)" , CMD_QUIT ; 終了 ; [ヘルプ]メニュー newmenu hhelpmenu, 1 ; サブメニュー作成 addmenu hhelpmenu, "表示(&M)" , CMD_MESS ; 表示 ; メニューバーの作成 newmenu hmenu, 0 ; メニュー作成 addmenu hmenu , "ファイル(&F)", hfilemenu, MF_POPUP ; ファイル addmenu hmenu , "ヘルプ(&H)" , hhelpmenu, MF_POPUP ; ヘルプ addmenu hmenu , "終了(&Q)" , CMD_QUIT ; 終了 applymenu hmenu ; メニュー割り当て ; ==== ツールバー ==== ; コモンコントロールライブラリの初期化 InitCommonControls ; ツールバー作成 winobj "ToolbarWindow32", "", 0, 0x50000801, 0, 0 hTool = objinfo_hwnd(stat) sendmsg hTool, TB_BUTTONSTRUCTSIZE, 20, 0 sendmsg hTool, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS tbadd(0) = -1 ; HINST_COMMCTRL tbadd(1) = 0 ; IDB_STD_SMALL_COLOR sendmsg hTool, TB_ADDBITMAP, 0, varptr(tbadd) tbb( 0) = 6, CMD_NEW , ($8<<8)|0x04, 0, 0 ;「新規作成」ボタン tbb( 5) = 7, CMD_OPEN , 0x04, 0, 0 ;「開く」ボタン tbb(10) = 8, CMD_SAVE , 0x04, 0, 0 ;「保存」ボタン tbb(15) = 0, 0 , 256 , 0, 0 ;「セパレータ」ボタン tbb(20) = 0, CMD_CUT , 0x04, 0, 0 ;「切り取り」ボタン tbb(25) = 1, CMD_COPY , 0x04, 0, 0 ;「コピー」ボタン tbb(30) = 2, CMD_PASTE , 0x04, 0, 0 ;「貼り付け」ボタン tbb(35) = 0, 0 , 256 , 0, 0 ;「セパレータ」ボタン tbb(40) = 3, CMD_UNDO , 0x04, 0, 0 ;「アンドゥ」ボタン tbb(45) = 12, CMD_SEARCH, 0x04, 0, 0 ;「検索」ボタン sendmsg hTool, TB_ADDBUTTONS, 10, varptr(tbb) sendmsg hTool, TB_AUTOSIZE, 0, 0 ; ドロップダウンボタン用のメニュー作成 newmenu hdropmenu, 1 addmenu hdropmenu, "新規1" , CMD_NEW1 addmenu hdropmenu, "新規2" , CMD_NEW2 addmenu hdropmenu, "" , NULL , MF_SEPARATOR ; 区切り線 addmenu hdropmenu, "ファイルから...", CMD_FROMFILE stop *OnCommand switch (wparam & 0xFFFF) case CMD_NEW dialog "はじめて" swbreak case CMD_NEW1 dialog "新規1です" swbreak case CMD_NEW2 dialog "新規2です" swbreak case CMD_FROMFILE dialog "ファイルから・・・" swbreak case CMD_CUT dialog "切り取ります" swbreak case CMD_COPY dialog "コピる" swbreak case CMD_PASTE dialog "貼り付けたい" swbreak case CMD_UNDO dialog "やり直さない?" swbreak case CMD_SEARCH dialog "見つけるよ!" swbreak case CMD_OPEN ; 開く dialog "*", 16 if (stat == 1) :dialog refstr + "を開きました" swbreak case CMD_SAVE ; 保存 dialog "*", 17 if (stat == 1) :dialog refstr + "を保存しました" swbreak case CMD_QUIT ; 終了 PostMessage hwnd, WM_CLOSE, 0, 0 swbreak case CMD_MESS ; 表示 dialog "メニューとツールの併用です" swbreak swend return *OnNotify dupptr nmhdr, lParam, 12 if (nmhdr(0) == hTool) && (nmhdr(2) == TBN_DROPDOWN) :gosub *OnToolDropDown return *OnToolDropDown dupptr nmtoolbar, lParam, 44 itemId = nmtoolbar(3) if (itemId == CMD_NEW) { dim rc, 4 sendmsg hTool, TB_GETRECT, itemId, varptr(rc) pt = rc(0), rc(3) ClientToScreen hTool, varptr(pt) TrackPopupMenuEx hdropmenu, 0, pt(0), pt(1), hwnd, 0 } return *OnClose dialog "終了しますか?", 2 if (stat == 6) { if hmenu :DestroyMenu hmenu end } return |