【HSP3.x 移植版】『HSPの裏技』シンプルモードステータスバー(ハイライト表示されているメニュー項目の説明を表示)

『HSPの裏技』シンプルモードステータスバー(HSP2.x 版)をHSP3.x バージョンへ書き換え、さらに、メニューを表示しているときにハイライト表示されているメニュー項目の説明をシンプルモードステータスバーで表示するコードを追加したサンプルです。

『HSPの裏技』シンプルモードステータスバー(HSP2.x 版)をHSP3.x バージョンへ書き換え、さらに、メニューを表示しているときにハイライト表示されているメニュー項目の説明をシンプルモードステータスバーで表示するコードを追加したサンプルです。

  • タグ:
  • タグはありません
;【HSP3.x 移植版】
;『HSPの裏技』シンプルモードステータスバー
; (ハイライト表示されているメニュー項目の説明を表示する例)
; http://chokuto.ifdef.jp/urawaza/statusbar2.html
;
; [参照] 『Advanced HSP』ドロップダウンメニュー
; http://chokuto.ifdef.jp/advanced/dropdownmenu.html

#uselib "comctl32.dll"
#func InitCommonControlsEx "InitCommonControlsEx" int

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

; 各種定数定義
#define ICC_BAR_CLASSES 4

#define WS_CHILD        0x40000000
#define WS_VISIBLE      0x10000000
#define CCS_BOTTOM      0x00000003

#define SB_SETTEXT      0x0401
#define SB_SETPARTS     0x0404
#define SB_SIMPLE       0x0409
#define SB_SIMPLEID     255

#define NULL            0
#define MF_POPUP        0x10
#define WM_MENUSELECT   0x011F

; メニュー項目IDを定義
#define CMD_ID_OPEN     101   ; 「開く」項目のID
#define CMD_ID_SAVE     102   ; 「保存」項目のID
#define CMD_ID_MESSAGE  104   ; 「メッセージ表示」項目のID


    ; コモンコントロールライブラリの初期化
    initinfo = 8, ICC_BAR_CLASSES
    InitCommonControlsEx varptr(initinfo)

    ; メニューバーの作成
    ; 「ファイル」メニューの作成
    hmenuFile = CreatePopupMenu()
    AppendMenu hmenuFile, 0, CMD_ID_OPEN, "開く(&O)"
    AppendMenu hmenuFile, 0, CMD_ID_SAVE, "保存(&S)"

    ; 「ヘルプ」メニューの作成
    hmenuHelp = CreatePopupMenu()
    AppendMenu hmenuHelp, 0, CMD_ID_MESSAGE, "メッセージ表示(&M)"

    ; メニューバーの作成
    hmenu = CreateMenu()
    AppendMenu hmenu, MF_POPUP, hmenuFile, "ファイル(&F)"
    AppendMenu hmenu, MF_POPUP, hmenuHelp, "ヘルプ(&H)"
    SetMenu hwnd, hmenu
    DrawMenuBar hwnd

    ; ステータスバーの作成
    styleFlags = WS_CHILD | WS_VISIBLE | CCS_BOTTOM
    winobj "msctls_statusbar32", "", 0, styleFlags, 0, 0
    statusbarID = stat

    ; ステータスバーを3つのパーツに分ける
    partspos = 80, 220, -1
    sendmsg objinfo_hwnd(statusbarID), SB_SETPARTS, 3, varptr(partspos)

    ; パーツの表示テキスト設定
    msgtext(0) = "パーツ1"         ; 左揃えで表示
    msgtext(1) = "\tパーツ2"       ; 中央揃えで表示
    msgtext(2) = "\t\tパーツ3"     ; 右揃えで表示
    repeat 3
        ; SB_SETTEXT メッセージ送信
        sendmsg objinfo_hwnd(statusbarID), SB_SETTEXT, cnt, msgtext(cnt)
    loop

    ; WM_MENUSELECT メッセージを処理するように登録
    oncmd gosub *OnMenuSelect, WM_MENUSELECT

    stop

*OnMenuSelect
    ; メニュー選択が切り替わった時
    itemID = wparam & 0xFFFF
    flags = (wparam >> 16) & 0xFFFF
    hmenu = lparam

    if (flags == 0xFFFF) & (hmenu == NULL) {
        ; メニューが閉じられた場合
        msgtext = ""
    } else {

        ; メニュー項目IDに応じて表示メッセージを決定
        switch itemID
        case CMD_ID_OPEN
            msgtext = "ファイルを開きます"
            swbreak
        case CMD_ID_SAVE
            msgtext = "ファイルに保存します"
            swbreak
        case CMD_ID_MESSAGE
            msgtext = "メッセージを表示します"
            swbreak
        default
            msgtext = ""
            swbreak
        swend
    }

    if (msgtext == "") {
        ; 表示メッセージがなければ非シンプルモード
        sendmsg objinfo_hwnd(statusbarID), SB_SIMPLE, 0, 0
        logmes "SB_SIMPLE (0)"
    } else {
        ; 表示メッセージがある場合はシンプルモードで表示
        sendmsg objinfo_hwnd(statusbarID), SB_SIMPLE, 1, 0
        sendmsg objinfo_hwnd(statusbarID), SB_SETTEXT, SB_SIMPLEID, varptr(msgtext)
    }

    return