|
 |
|
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に
していただけるとうれしいです。
回答待ってます!
冬休みの課題多すぎて死にそう

| |
|
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>の挿入まで忘れていたなんて…
本当に申し訳ないです。
今度から投稿前の見直しを忘れないようにします。
>科学太郎 様
実行できないソースなのに、サンプルを作っていただき本当にありがとうございます。
そのうえ、何度も改良までしていただいて…
科学太郎様のサンプルをベースに、タブの幅が最小に達した場合はスクロールする方式で
進めたいと思います。
本当にありがとうございました。
|
|