[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

メニューバーとツールバーの併用

メニューバーとツールバーを実装する


HSP3.1B9で動作確認

  • 併用するということは、“API関数・定義”や“メッセージを受け取るラベル”などを共有するということです。
  • 前者はどちらかに統一し、後者はどこから来たメッセージかを判断しなければなりません
  • このサンプルでは、アイテムのIDを enum で分けて、 そのIDだけを頼りにWM_COMMANDメッセージの処理をしています。
  • メニューとツールでの共通項目には、同じIDを使います。

(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