HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1218
チャーくんタブの幅の自動調整7解決


チャーくん

リンク

2015/12/18(Fri) 18:44:34|NO.73661

今ブラウザを作っていて、タブの部分を自作しているのですが、
タブの幅の調整が上手くいきません。
限界の幅/タブの数でやってみましたが、タブの数を増やすと限界の幅を超えて
一部が見えなくなってしまいます。

/* 変数の説明 dx デスクトップのサイズX dy デスクトップのサイズY MAIN メインウィンドウID(もともとのスクリプトの名残) ftabw 限界のタブの幅(これ以上は大きくさせない幅) tabh タブの高さ tabs タブの数(スタートページのタブは除く) wx ウィンドウの幅 wy ウィンドウの高さ nowtab 現在選択されているタブ tabname(配列) タブの名前(タブID(後で説明)) tabsx タブの描画始点X tabsy タブの描画始点Y tabs タブの数(スタートページのタブは除く) openingtab 開くアニメーションをしているタブ btabw 現在のタブの幅の基準(?) tabw(配列) 実際のタブの幅(タブID) btabwとtabw タブを開くアニメーションをするとき、 タブの幅を一つにするとほかのタブの幅も変わってしまうので、 それぞれタブごとに幅を指定しています。 82行目あたりを見るとわかるかもしれません。 タブID スタートページのタブを0として数が大きくなっていきます。 ウィンドウIDと同じようなイメージです。 */ dx=ginfo_dispx:dy=ginfo_dispy MAIN=0 ftabw=200 tabh=30 tabs=0 wx=dx/4*3 wy=dy/4*3 tabname(0)="スタート ページ" bgscr MAIN,wx,wy,0,(dx-wx)/2,(dy-wy)/2 font "Meiryo UI",16 pos 4,100:button gosub "タブを追加",*newtab pos 4+64,100:button gosub "タブを閉じる",*deltab pos 4+64*2,100:button gosub "左",*ltab pos 4+64*3,100:button gosub "右",*rtab repeat count=cnt gosub *normalwindow redraw await 50 loop *normalwindow redraw 0 color 0,128,255:boxf color 240,240,240:boxf 1,1,wx-2,wy-2 tabsx=1 ;タブ描画始点x tabsy=8 ;タブ描画始点y gosub *drawtab color 0,128,255 boxf 1,tabsy+tabh,wx-2,tabsy+tabh+36 drawcnt++ return *drawtab nowtab=limit(nowtab,0,tabs) btabw=limit((wx-tabw(0))/(tabs+1),tabh,ftabw) tabw(0)=btabw/3*2 ;スタート ページ タブの幅 if nowtab=0 { color 0,128,255 boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh color 255,255,255 } else { color 200,200,200 boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh color 160,160,160 } pos tabsx+tabh/2,tabsy+(tabh-16)/2 mes tabname(0) tabsx+=tabw(0) repeat tabs,1 if cnt=openingtab { setease btabw/4*3,btabw,ease_quartic_out tabw(cnt)=getease(count-opencnt,7) } else { tabw(cnt)=btabw } if cnt=nowtab { color 0,128,255 boxf tabsx,tabsy,tabsx-1+tabw(cnt),tabsy+tabh-1 color 255,255,255 pos tabsx+tabh,(tabsy+tabh-16)/2 mes tabname(cnt) } else { color 200,200,200 boxf tabsx+1,tabsy,tabsx-1+tabw(cnt),tabsy+tabh color 160,160,160 pos tabsx+tabh/2,(tabsy+tabh-16)/2 mes tabname(cnt) } tabsx+=tabw(cnt) loop tabsx+=tabh return *newtab tabs++ tabname(tabs)="新しいタブ "+tabs openingtab=tabs opencnt=count nowtab=tabs return *deltab tabs-- nowtab=tabs return *ltab nowtab-- return *rtab nowtab++ return
	dx=ginfo_dispx:dy=ginfo_dispy
	
	MAIN=0	;ウィンドウID
	
	ftabw=200	;タブの幅の最大
	tabh=30		;タブの高さ
	tabs=0		;タブの数(スタート ページは除く)
	
	wx=dx/4*3	;ウィンドウの幅
	wy=dy/4*3	;ウィンドウの高さ
	
	tabname(0)="スタート ページ"	;スタート ページのタブタイトル
	
	bgscr MAIN,wx,wy,0,(dx-wx)/2,(dy-wy)/2
	font "Meiryo UI",16
	pos 4,100:button gosub "タブを追加",*newtab
	pos 4+64,100:button gosub "タブを閉じる",*deltab
	pos 4+64*2,100:button gosub "左",*ltab
	pos 4+64*3,100:button gosub "右",*rtab
	repeat
		count=cnt
		gosub *normalwindow
		redraw
		await 50
	loop
*normalwindow
	redraw 0
	color 0,128,255:boxf
	color 240,240,240:boxf 1,1,wx-2,wy-2
	tabsx=1		;タブ描画始点x
	tabsy=8		;タブ描画始点y
	gosub *drawtab
	
	color 0,128,255
	boxf 1,tabsy+tabh,wx-2,tabsy+tabh+36
	drawcnt++
	return
*drawtab
	nowtab=limit(nowtab,0,tabs)
	
	btabw=limit((wx-tabw(0))/(tabs+1),tabh,ftabw)
	tabw(0)=btabw/3*2	;スタート ページ タブの幅
	
	if nowtab=0 {
		color 0,128,255
		boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh
		color 255,255,255
	} else {
		color 200,200,200
		boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh
		color 160,160,160
	}
	pos tabsx+tabh/2,tabsy+(tabh-16)/2
	mes tabname(0)
	tabsx+=tabw(0)
	repeat tabs,1
		if cnt=openingtab {
			setease btabw/4*3,btabw,ease_quartic_out
			tabw(cnt)=getease(count-opencnt,7)
		} else {
			tabw(cnt)=btabw
		}
		if cnt=nowtab {
			color 0,128,255
			boxf tabsx,tabsy,tabsx-1+tabw(cnt),tabsy+tabh-1
			color 255,255,255
			pos tabsx+tabh,(tabsy+tabh-16)/2
			mes tabname(cnt)
		} else {
			color 200,200,200
			boxf tabsx+1,tabsy,tabsx-1+tabw(cnt),tabsy+tabh
			color 160,160,160
			pos tabsx+tabh/2,(tabsy+tabh-16)/2
			mes tabname(cnt)
		}
		tabsx+=tabw(cnt)
	loop
	tabsx+=tabh
	return
*newtab
	tabs++
	tabname(tabs)="新しいタブ "+tabs
	openingtab=tabs
	opencnt=count
	nowtab=tabs
	return
*deltab
	tabs--
	nowtab=tabs
	return
*ltab
	nowtab--
	return
*rtab
	nowtab++
	return
このスクリプトは不要部分を削りに削って削りすぎたやつです。
実際はタブの切り替えなどはマウスで操作できるようになっています。
タブも指定したのを閉じれるようになっています。

厄介(かもしれない)スタートページのタブは、他のタブの幅の3分の2に
していただけるとうれしいです。

回答待ってます!


冬休みの課題多すぎて死にそう



この記事に返信する


KA

リンク

2015/12/18(Fri) 19:15:57|NO.73663

これ、自分で試していますか?

必要な物まで削っているような気がします。
逆に color は削れるでしょ?



科学太郎

リンク

2015/12/18(Fri) 19:44:47|NO.73666

> このスクリプトは不要部分を削りに削って削りすぎたやつです。
そうでしょうね。
提示されたサンプルは実行できずにエラーが出てます。
よってアドバイス不可能ですな。

> 回答待ってます!
実行できるサンプルを待ってます!

> 冬休みの課題多すぎて死にそう
頑張って下さい。



科学太郎

リンク

2015/12/19(Sat) 08:09:46|NO.73677

> 限界の幅/タブの数でやってみましたが、タブの数を増やすと限界の幅を超えて
> 一部が見えなくなってしまいます。
boxf命令やpos命令の座標が統一化されてません。

[boxf命令の場合]
×boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh
×boxf tabsx+1,tabsy,tabsx-1+tabw(0),tabsy+tabh
×boxf tabsx,tabsy,tabsx-1+tabw(cnt),tabsy+tabh-1
×boxf tabsx+1,tabsy,tabsx-1+tabw(cnt),tabsy+tabh

ここは「boxf tabsx+1,tabsy,tabsx+tabw(cnt)-1,tabsy+tabh-1」に統一。

[pos命令の場合]
○pos tabsx+tabh/2,tabsy+(tabh-16)/2
×pos tabsx+tabh,(tabsy+tabh-16)/2
×pos tabsx+tabh/2,(tabsy+tabh-16)/2

ここは「pos tabsx+tabh/2,tabsy+(tabh-16)/2」に統一。



科学太郎

リンク

2015/12/19(Sat) 08:10:03|NO.73678

ちょっとサンプルを作ってみました。
どうぞ。

//------------------------------------------------------------------------------ // 自作タブ・ページのサンプル by 科学太郎 //============================================================================== // @URL(http://hsp.tv/play/pforum.php?mode=all&num=73661) //------------------------------------------------------------------------------ //-------------------------------------- // 列挙定数(ウインドウID) //-------------------------------------- #enum WID_MAIN=0 //-------------------------------------- // 記号定数(フォント系) //-------------------------------------- #const FONT_SIZE (16) //-------------------------------------- // 記号定数(ウインドウ四隅) //-------------------------------------- #define cxWindow (0) ;左上隅(X軸) #define cyWindow (0) ;左上隅(Y軸) #define exWindow (sxWindow-1) ;右下隅(X軸) #define eyWindow (syWindow-1) ;右下隅(Y軸) //-------------------------------------- // メイン部 //-------------------------------------- *Init sxDesktop=ginfo_dispX ;デスクトップの横幅 syDesktop=ginfo_dispY ;デスクトップの縦幅 sxWindow=(ginfo_dispX*3/4) ;ウインドウの横幅 syWindow=(ginfo_dispY*3/4) ;ウインドウの縦幅 ;タブ情報 sdim szTabName,0,1 ;タブの名前配列(0=スタートページ,1=新規ページ) dim imgTabCount ;タブのアニメ値(0=アニメなし,01-10=アニメ処理) dim imgTab ;タブの新規番号(0=スタートページ,1=新規ページ) dim nowTab ;タブの選択番号(0=スタートページ,1=新規ページ) dim maxTab ;タブの作成個数(スタートページは除く) dim cxTab ;タブの始点横軸 dim cyTab ;タブの始点縦軸 dim exTab ;タブの終点横軸 dim eyTab ;タブの終点縦軸 dim sxTab ;タブの描画横幅(配列) dim syTab ;タブの描画縦幅(固定) dim sxTabWidth ;タブの生成横幅(30-200) dim sxMinWidth ;タブの最小横幅(30) dim sxMaxWidth ;タブの限界横幅(200) ;その他 dim cntOpen dim cntCycle *Main x=(sxDesktop-sxWindow)/2 y=(syDesktop-syWindow)/2 screen WID_MAIN,sxWindow,syWindow,SCREEN_NORMAL,x,y title "自作タブ・ページのサンプル by 科学太郎" ;ボタン配置 x=4 y=100 pos x,y:x+=64:button gosub "タブを追加", *PushNewTab pos x,y:x+=64:button gosub "タブを閉じる", *PushDelTab pos x,y:x+=64:button gosub "左", *PushSelTabL pos x,y:x+=64:button gosub "右", *PushSelTabR pos x,y:x+=64:button gosub "終了", *PushQuit ;初期化 szTabName(0) ="スタート ページ" syTab =30 sxMinWidth =30 sxMaxWidth =200 CalcTabSize ;描画部 font "Meiryo UI",FONT_SIZE repeat:cntCycle=cnt redraw 0 DrawTabWindow redraw 1 await 50 loop stop //-------------------------------------- // タブ・ページの新規作成 //-------------------------------------- *PushNewTab maxTab++ szTabName(maxTab)=strf("新しいタブ %d",maxTab) nowTab=maxTab imgTab=maxTab imgTabCount=1 cntOpen=cntCycle CalcTabSize return //-------------------------------------- // タブ・ページの削除 //-------------------------------------- *PushDelTab if(maxTab):maxTab--:nowTab=limit(nowTab,0,maxTab) CalcTabSize return //-------------------------------------- // タブ・ページの左選択 //-------------------------------------- *PushSelTabL nowTab=limit(nowTab-1,0,maxTab) return //-------------------------------------- // タブ・ページの右選択 //-------------------------------------- *PushSelTabR nowTab=limit(nowTab+1,0,maxTab) return //-------------------------------------- // タブ・ページのサンプル終了 //-------------------------------------- *PushQuit end //-------------------------------------- // タブ・ページの生成幅を計算 //-------------------------------------- #deffunc CalcTabSize repeat 2 sxTabWidth=(sxWindow-sxTab)/(maxTab+1) sxTabWidth=limit(sxTabWidth,sxMinWidth,sxMaxWidth) repeat maxTab,1 sxTab(cnt)=sxTabWidth loop ;スタート・ページ(3分の2幅) sxTab(0)=limit(sxTabWidth*2/3,sxMinWidth,sxMaxWidth) loop return //-------------------------------------- // タブ・ウインドウの描画 //-------------------------------------- #deffunc DrawTabWindow syscolor 15:boxf:color $00,$80,$FF line exWindow,cyWindow,cxWindow,cyWindow line exWindow,eyWindow line cxWindow,eyWindow line cxWindow,cyWindow ;新規作成(アニメーション) if(imgTab){ sxTab(imgTab)=(sxTabWidth*imgTabCount/10):imgTabCount++ if(imgTabCount>10):imgTab=0:imgTabCount=0 } ;タブページ cxTab=1 cyTab=8 repeat(maxTab+1) exTab=(cxTab+sxTab(cnt)-1) eyTab=(cyTab+syTab -1) if(cnt==nowTab):DrawTabSel:else:DrawTabUnSel syscolor 15:line cxTab,(cyTab+syTab),cxTab,cyTab cxTab+=sxTab(cnt) loop ;タブの最後 syscolor 15:boxf cxTab,cyTab,(exWindow-1),eyTab color $00,$80,$FF:line exWindow,eyWindow,exWindow,cyWindow ;タブの下側 color $00,$80,$FF boxf(cxWindow+1),(cyTab+syTab),(exWindow-1),(cyTab+syTab+36) ;デバッグ変数 DrawDebug return //-------------------------------------- // 選択タブの描画 //-------------------------------------- #deffunc DrawTabSel x=(syTab/2) y=(syTab-FONT_SIZE)/2 color $00,$80,$FF:boxf(cxTab+1),(cyTab),(exTab),(eyTab) color $FF,$FF,$FF:pos (cxTab+x),(cyTab+y):mes szTabName(cnt) return //-------------------------------------- // 非選択タブの描画 //-------------------------------------- #deffunc DrawTabUnSel x=(syTab/2) y=(syTab-FONT_SIZE)/2 color $CC,$CC,$CC:boxf(cxTab+1),(cyTab),(exTab),(eyTab) color $AA,$AA,$AA:pos (cxTab+x),(cyTab+y):mes szTabName(cnt) return //-------------------------------------- // デバッグ変数の描画 //-------------------------------------- #deffunc DrawDebug\ local cx,\ local cy,\ local ex,\ local ey,\ local sx,\ local sy font MSGOTHIC,FONT_SIZE color $00,$00,$00 x=10 y=140 pos x,y:x+=200 mes strf("sxDesktop=%d",sxDesktop) mes strf("syDesktop=%d",syDesktop) mes strf("sxWindow=%d",sxWindow) mes strf("syWindow=%d",syWindow) mes strf("cxWindow=%d",cxWindow) mes strf("cyWindow=%d",cyWindow) mes strf("exWindow=%d",exWindow) mes strf("eyWindow=%d",eyWindow) mes "" mes strf("imgTab=%d",imgTab) mes strf("nowTab=%d",nowTab) mes strf("maxTab=%d",maxTab) mes "" mes strf("cxTab=%d",cxTab) mes strf("cyTab=%d",cyTab) mes strf("exTab=%d",exTab) mes strf("eyTab=%d",eyTab) mes strf("sxTab=%d",sxTab) mes strf("syTab=%d",syTab) mes strf("sxTabWidth=%d",sxTabWidth) mes strf("sxMinWidth=%d",sxMinWidth) mes strf("sxMaxWidth=%d",sxMaxWidth) mes "" mes strf("cntOpen=%d",cntOpen) mes strf("cntCycle=%d",cntCycle) ;タブの名前 pos x,y:x+=400 repeat(maxTab+1) mes strf("szTabName(%2d)=「%s」",cnt,szTabName(cnt)) loop ;タブの横幅 pos x,y:x+=200 repeat(maxTab+1) mes strf("sxTab(%2d)=%d",cnt,sxTab(cnt)) loop ;タブの情報 pos x,y:x+=400 cx=1 cy=8 repeat(maxTab+1) sx=sxTab(cnt) sy=syTab ex=cx+sx ey=cy+sy mes strf("No.%03d[%3d×%3d](%4d,%4d)-(%4d,%4d)「%s」",cnt,sx,sy,cx,cy,ex,ey,szTabName(cnt)) cx+=sxTab(cnt) loop font "Meiryo UI",FONT_SIZE return //------------------------------------------------------------------------------ // End of myTabSample.hsp //------------------------------------------------------------------------------



科学太郎

リンク

2015/12/19(Sat) 18:30:41|NO.73694

ちょっと改良してみました。

//------------------------------------------------------------------------------ // 自作タブ・ページのサンプル by 科学太郎 //============================================================================== // @URL(http://hsp.tv/play/pforum.php?mode=all&num=73661) //------------------------------------------------------------------------------ //-------------------------------------- // 列挙定数(ウインドウID) //-------------------------------------- #enum WID_MAIN=0 //-------------------------------------- // 記号定数(フォント系) //-------------------------------------- #const FONT_SIZE (16) //-------------------------------------- // 記号定数(ウインドウ四隅) //-------------------------------------- #define cxWindow (0) ;左上隅(X軸) #define cyWindow (0) ;左上隅(Y軸) #define exWindow (sxWindow-1) ;右下隅(X軸) #define eyWindow (syWindow-1) ;右下隅(Y軸) //-------------------------------------- // メイン部 //-------------------------------------- *Init sxDesktop=ginfo_dispX ;デスクトップの横幅 syDesktop=ginfo_dispY ;デスクトップの縦幅 sxWindow=(ginfo_dispX*3/4) ;ウインドウの横幅 syWindow=(ginfo_dispY*3/4) ;ウインドウの縦幅 ;タブ情報 sdim szTabName,0,1 ;タブの名前配列(0=スタートページ,1=新規ページ) dim imgTabCount ;タブのアニメ値(0=アニメなし,01-10=アニメ処理) dim imgTab ;タブの新規番号(0=スタートページ,1=新規ページ) dim nowTab ;タブの選択番号(0=スタートページ,1=新規ページ) dim maxTab ;タブの作成個数(スタートページは除く) dim sxTab ;タブの描画横幅(配列) dim syTab ;タブの描画縦幅(固定) dim sxTabWidth ;タブの描画横幅(30-200) dim sxMinWidth ;タブの最小横幅(30) dim sxMaxWidth ;タブの限界横幅(200) *Main x=(sxDesktop-sxWindow)/2 y=(syDesktop-syWindow)/2 screen WID_MAIN,sxWindow,syWindow,SCREEN_NORMAL,x,y title "自作タブ・ページのサンプル by 科学太郎" ;ボタン配置 x=4 y=100 pos x,y:x+=64:button gosub "タブを追加", *PushNewTab pos x,y:x+=64:button gosub "タブを閉じる", *PushDelTab pos x,y:x+=64:button gosub "←", *PushSelTabL pos x,y:x+=64:button gosub "→", *PushSelTabR pos x,y:x+=64:button gosub "終了", *PushQuit ;初期化 szTabName(0) ="スタート ページ" syTab =30 sxMinWidth =30 sxMaxWidth =200 CalcTabSize ;描画部 font "Meiryo UI",FONT_SIZE repeat redraw 0 DrawTabWindow redraw 1 await 50 loop stop //-------------------------------------- // タブ・ページの描画幅を計算 //-------------------------------------- #deffunc CalcTabSize repeat 2 sxTabWidth=(sxWindow-sxTab)/(maxTab+1) sxTabWidth=limit(sxTabWidth,sxMinWidth,sxMaxWidth) repeat maxTab,1 sxTab(cnt)=sxTabWidth loop ;スタート・ページ(3分の2幅) sxTab(0)=limit(sxTabWidth*2/3,sxMinWidth,sxMaxWidth) loop return //-------------------------------------- // タブ・ウインドウの描画 //-------------------------------------- #deffunc DrawTabWindow\ local cx,\ local cy,\ local ex,\ local ey,\ local mx,\ local my syscolor 15:boxf:color $00,$80,$FF line exWindow,cyWindow,cxWindow,cyWindow line exWindow,eyWindow line cxWindow,eyWindow line cxWindow,cyWindow ;新規作成(アニメーション) if(imgTab){ sxTab(imgTab)=(sxTabWidth*imgTabCount/10):imgTabCount++ if(imgTabCount>10):imgTab=0:imgTabCount=0 } ;タブページ mx=(syTab/2) my=(syTab-FONT_SIZE)/2 cx=(1) cy=(8) repeat(maxTab+1) ex=(cx+sxTab(cnt)-1) ey=(cy+syTab -1) ;選択/非選択 if(cnt==nowTab){ color $CC,$00,$66:boxf(cx+1),cy,ex,ey:color $FF,$CC,$CC }else{ color $66,$99,$00:boxf(cx+1),cy,ex,ey:color $CC,$FF,$99 } ;タブ名と隙間 pos(cx+mx),(cy+my):mes szTabName(cnt) color $CC,$CC,$00:line cx,(cy+syTab),cx,cy cx+=sxTab(cnt) loop ;タブの最後 color $CC,$CC,$00:boxf cx,cy,(exWindow-1),ey color $00,$80,$FF:line exWindow,eyWindow,exWindow,cyWindow ;タブの下側 color $00,$80,$FF boxf(cxWindow+1),(cy+syTab),(exWindow-1),(cy+syTab+36) return //-------------------------------------- // タブ・ページの新規作成 //-------------------------------------- *PushNewTab maxTab++ szTabName(maxTab)=strf("新しいタブ %d",maxTab) nowTab=maxTab imgTab=maxTab imgTabCount=1 CalcTabSize return //-------------------------------------- // タブ・ページの削除 //-------------------------------------- *PushDelTab if(maxTab):maxTab--:nowTab=limit(nowTab,0,maxTab) CalcTabSize return //-------------------------------------- // タブ・ページの左選択 //-------------------------------------- *PushSelTabL nowTab=limit(nowTab-1,0,maxTab) return //-------------------------------------- // タブ・ページの右選択 //-------------------------------------- *PushSelTabR nowTab=limit(nowTab+1,0,maxTab) return //-------------------------------------- // タブ・ページのサンプル終了 //-------------------------------------- *PushQuit end //------------------------------------------------------------------------------ // End of myTabSample.hsp //------------------------------------------------------------------------------
DrawTabPage 命令を DrawTabWindow 命令内に記述して統一化。

cxTab ;タブの始点横軸
cyTab ;タブの始点縦軸
exTab ;タブの終点横軸
eyTab ;タブの終点縦軸

この変数をグローバル変数から DrawTabWindow 命令内で使うローカル変数に変更。

cntOpen
cntCycle

良く分からない変数を削除。

DrawDebug 命令を削除してカラーを分かりやすく変更しました。
どうぞ。



科学太郎

リンク

2015/12/19(Sat) 19:27:54|NO.73696

> btabwとtabw
> タブを開くアニメーションをするとき、
> タブの幅を一つにするとほかのタブの幅も変わってしまうので、
> それぞれタブごとに幅を指定しています。
さらに改良して次の変数で処理するようにしました。

sxTabImage ;タブのアニメ幅(30-200)
sxTabStart ;タブの描画横幅(スタートページ)
sxTab    ;タブの描画横幅(普通のタブ横幅)
syTab    ;タブの描画縦幅(普通のタブ縦幅)

//------------------------------------------------------------------------------ // 自作タブ・ページのサンプル by 科学太郎 //============================================================================== // @URL(http://hsp.tv/play/pforum.php?mode=all&num=73661) //------------------------------------------------------------------------------ //-------------------------------------- // 列挙定数(ウインドウID) //-------------------------------------- #enum WID_MAIN=0 //-------------------------------------- // 記号定数(フォント系) //-------------------------------------- #const FONT_SIZE (16) //-------------------------------------- // 記号定数(ウインドウ四隅) //-------------------------------------- #define cxWindow (0) ;左上隅(X軸) #define cyWindow (0) ;左上隅(Y軸) #define exWindow (sxWindow-1) ;右下隅(X軸) #define eyWindow (syWindow-1) ;右下隅(Y軸) //-------------------------------------- // メイン部 //-------------------------------------- *Init sxDesktop=ginfo_dispX ;デスクトップの横幅 syDesktop=ginfo_dispY ;デスクトップの縦幅 sxWindow=(ginfo_dispX*3/4) ;ウインドウの横幅 syWindow=(ginfo_dispY*3/4) ;ウインドウの縦幅 ;タブ管理 dim maxTab ;タブの作成個数(スタートページは除く) dim nowTab ;タブの選択番号(0=スタートページ,1=新規ページ) dim imgTab ;タブの新規番号(0=スタートページ,1=新規ページ) dim imgTabCount ;タブのアニメ値(0=アニメなし,01-10=アニメ処理) sdim szTabName,0,1 ;タブの名前配列(0=スタートページ,1=新規ページ) ;タブ幅 dim sxMinWidth ;タブの最小横幅(30) dim sxMaxWidth ;タブの限界横幅(200) dim sxTabImage ;タブのアニメ幅(30-200) dim sxTabStart ;タブの描画横幅(スタートページ) dim sxTab ;タブの描画横幅(普通のタブ横幅) dim syTab ;タブの描画縦幅(普通のタブ縦幅) *Main x=(sxDesktop-sxWindow)/2 y=(syDesktop-syWindow)/2 screen WID_MAIN,sxWindow,syWindow,SCREEN_NORMAL,x,y title "自作タブ・ページのサンプル by 科学太郎" ;ボタン配置 x=4 y=100 pos x,y:x+=64:button gosub "タブを追加", *PushNewTab pos x,y:x+=64:button gosub "タブを閉じる", *PushDelTab pos x,y:x+=64:button gosub "←", *PushSelTabL pos x,y:x+=64:button gosub "→", *PushSelTabR pos x,y:x+=64:button gosub "終了", *PushQuit ;初期化 szTabName(0) ="スタート ページ" syTab =30 sxMinWidth =30 sxMaxWidth =200 CalcTabSize ;描画部 font "Meiryo UI",FONT_SIZE repeat redraw 0 DrawTabWindow redraw 1 await 50 loop stop //-------------------------------------- // タブ・ページの描画幅を計算 //-------------------------------------- #deffunc CalcTabSize repeat 2 sxTab=(sxWindow-sxTabStart)/(maxTab+1) sxTab=limit(sxTab,sxMinWidth,sxMaxWidth) sxTabStart=limit(sxTab*2/3,sxMinWidth,sxMaxWidth) loop return //-------------------------------------- // タブ・ウインドウの描画 //-------------------------------------- #deffunc DrawTabWindow\ local cx,\ local cy,\ local ex,\ local ey,\ local mx,\ local my syscolor 15:boxf:color $00,$80,$FF line exWindow,cyWindow,cxWindow,cyWindow line exWindow,eyWindow line cxWindow,eyWindow line cxWindow,cyWindow ;新規作成(アニメーション) if(imgTab){ sxTabImage=(sxTab*imgTabCount/10):imgTabCount++ if(imgTabCount>10):imgTab=0:imgTabCount=0 } ;タブページ mx=(syTab/2) my=(syTab-FONT_SIZE)/2 cx=(1) cy=(8) repeat(maxTab+1) if(cnt==0){ ex=(cx+sxTabStart) ey=(cy+syTab) }else:if(cnt==imgTab){ ex=(cx+sxTabImage) ey=(cy+syTab) }else{ ex=(cx+sxTab) ey=(cy+syTab) } ;選択/非選択 if(cnt==nowTab){ color $CC,$00,$66:boxf(cx+1),cy,(ex-1),ey:color $FF,$CC,$CC }else{ color $66,$99,$00:boxf(cx+1),cy,(ex-1),ey:color $CC,$FF,$99 } ;タブ名と隙間 pos(cx+mx),(cy+my):mes szTabName(cnt) color $CC,$CC,$00:line cx,(cy+syTab),cx,cy cx=ex loop ;タブの最後 color $CC,$CC,$00:boxf cx,cy,(exWindow-1),ey color $00,$80,$FF:line exWindow,eyWindow,exWindow,cyWindow ;タブの下側 color $00,$80,$FF boxf(cxWindow+1),(cy+syTab),(exWindow-1),(cy+syTab+36) return //-------------------------------------- // タブ・ページの新規作成 //-------------------------------------- *PushNewTab maxTab++ szTabName(maxTab)=strf("新しいタブ %d",maxTab) nowTab=maxTab imgTab=maxTab imgTabCount=1 CalcTabSize return //-------------------------------------- // タブ・ページの削除 //-------------------------------------- *PushDelTab if(maxTab):maxTab--:nowTab=limit(nowTab,0,maxTab) CalcTabSize return //-------------------------------------- // タブ・ページの左選択 //-------------------------------------- *PushSelTabL nowTab=limit(nowTab-1,0,maxTab) return //-------------------------------------- // タブ・ページの右選択 //-------------------------------------- *PushSelTabR nowTab=limit(nowTab+1,0,maxTab) return //-------------------------------------- // タブ・ページのサンプル終了 //-------------------------------------- *PushQuit end //------------------------------------------------------------------------------ // End of myTabSample.hsp //------------------------------------------------------------------------------



チャーくん

リンク

2015/12/23(Wed) 18:08:58|NO.73755

返信が遅れてしまい申し訳ありません。

>KA 様
 入力ボックスに貼る前にテストしたのですが、投稿前にチェックしてませんでした。
 一回消して貼りなおしたつもりだったのですが、消せていませんでした。
 そのうえ、</pre>の挿入まで忘れていたなんて…
 本当に申し訳ないです。
 今度から投稿前の見直しを忘れないようにします。

>科学太郎 様
 実行できないソースなのに、サンプルを作っていただき本当にありがとうございます。
 そのうえ、何度も改良までしていただいて…

 科学太郎様のサンプルをベースに、タブの幅が最小に達した場合はスクロールする方式で
 進めたいと思います。

 本当にありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.