TEST7

先日、ウインドウスタイルの設定モジュールを作りましたが、これと組み合わせて「ウソザナ」で使えるポップアップメニューモジュールを作ってみました。


適当なフォルダに次のファイルを用意し、HSPでxana_test7.hspを実行してみて下さい。

common.hsp (ここからゲット)
xana_menu.hsp (↓からゲット)
xana_test7.hsp (↓からゲット)
うまく起動するとこんな画面でテストできます。


テスト方法

  • メイン画面で[OPEN]ボタンをクリックすると、ポップアップメニューが表示されます。
  • 矢印上下で項目を選択できます。
  • ENTERキーで項目を決定します。
  • 項目を決定後、ダイアログで選択した項目名を表示します。
  • 「終了する」項目を選択するか、ESCキーでポップアップメニューを閉じ、メイン画面に戻ります。
  • メイン画面の閉じるボタンをクリックすれば終わります。


このスクリプトは、今後も改版していく可能性があります。
xana_menu.hsp

;
; モジュール定義:「ウソザナ」ポップアップメニュー用
; 作成     :ふじぽん
;
; モジュール名 :m_menu
;
; モジュール変数:画面ID...sid
;
; Copyright   :http://d.hatena.ne.jp/fujiponXP
;
; 変更履歴
;  ver.1.0 2009/12/12 新規作成
;
#module m_menu sid

	; 定数定義
	#define pointstr ">"										; ポインタ記号
	#define wtime    5											; キー入力待ち時間

	; 初期設定
	#modinit
		sid = ginfo(25)											; 空き画面IDを使用する
		return

	; ポップアップメニュー
	;    p_menu...メニュー配列(配列0はタイトル文字列)
	;    p_ymax...メニュー配列数
	#modcfunc m_menuDisp array p_menu, int p_ymax

		; 表示幅をメニュー文字列長から求める
		xmax = 8
		ymax = p_ymax-1
		for i,0,p_ymax
			l = strlen(p_menu(i))
			if xmax < l: xmax = l
		next

		; ポップアップ画面を設定する
		wposx = (ginfo_dispx - xmax*9 ) /2
		wposy = (ginfo_dispy - ymax*22+5 ) /2
		screen sid, xmax*9, ymax*22+5, screen_hide+screen_fixedsize+screen_tool,wposx,wposy
		ws_reset WS_SYSMENU
		title p_menu(0)
		color
		boxf
		font "",12,font_bold

		; メニュー内容を描画する
		y=0
		for i,0,ymax
			color 250,250,150: boxf 4,4+22*i, xmax*9-5, 4+18+22*i
			m_menuPrint (i=y), i, p_menu
		next

		key = 0
		gsel sid,1
*main
		; キー入力処理
		stick key
		if key&2 {												; ↑キー:項目選択
			m_menuPrint 0, y, p_menu
			y=(ymax+y-1)\ymax
			m_menuPrint 1, y, p_menu
		}
		if key&8 {												; ↓キー:項目選択
			m_menuPrint 0, y, p_menu
			y=(y+1)\ymax
			m_menuPrint 1, y, p_menu
		}
		if key&32  : gsel sid,-1: return y+1					; RETURNキー:決定
		if key&128 : gsel sid,-1: return 0						; ESCキー:キャンセル
		wait wtime
		goto *main

	; メニュー項目描画
	;    p1...0:未選択 1:選択
	;    p2...項目番号
	;    p3...項目配列
	#deffunc m_menuPrint int p1, int p2, array p3
		if p1 {
			color 0,0,50: boxf 5,5+22*p2, xmax*9-6, 3+18+22*p2
			color 250, 30, 30
			pos  8,8+22*p2: mes pointstr
		} else {
			color: boxf 5,5+22*p2, xmax*9-6, 3+18+22*p2
			color 255,255,255
		}		
		pos  24,8+22*p2: mes p3(p2+1)
		return

#global

xana_test7.hsp

#include "common.hsp"
#include "xana_menu.hsp"
about_lisence

; メイン
screen 0, 9*32, 9*32
title "メイン"
newmod menu, m_menu
button gosub "OPEN", *lb_open
stop

; メイン操作不可、ダイアログ表示
*lb_open
	gsel 0: ws_set WS_DISABLED
*main
	sdim a
	a(0)="システムメニュー"
	a(1)="はじめから"
	a(2)="続きから"
	a(3)="セーブ"
	a(4)="オプション設定"
	a(5)="終了する"
	ret = m_menuDisp(menu,a,length(a))
	if ret=5 or ret=0 : goto *lb_close
	if ret>0 : dialog strf("%s を選びました。",a(ret))
	goto *main

; メイン操作不可解除、ダイアログ非表示
*lb_close
	gsel 0,1: ws_reset WS_DISABLED
	return