mesと同じように扱えるタブ幅設定できる文字描画命令をモジュール化
設定はウィンドウ毎に記憶
タブ幅が文字単位の時フォントサイズの変更に対応
SetMesTabStopで設定してMesTabで描画
#module "mod_mestab"
#uselib "user32.dll"
#func TabbedTextOut "TabbedTextOutA" sptr,sptr,sptr,sptr,sptr,int,var,sptr
#define global TABSTOPMAX 25 //一行に使えるタブ幅指定の最大数(一定のタブ幅しか使わないなら1で良い)
//----タブのサイズを設定-----
//[SetMesTabStop tab_size, tab_max, pf]
// tab_size =タブのサイズを指定(省略時8)「8が通常mesと同じ8文字分、配列を使い複数のタブサイズを設定できる」
// tab_max =tab_sizeに配列を使い複数サイズを使うときに指定(省略時1)「tab=10,15 :SetMesTabStop tab,2」これで10と15の位置がタブ区切りになり3番目以上はmes標準の位置
// pf =1を指定するとタブサイズを文字単位じゃなくピクセル数になる (省略時0)
#define global SetMesTabStop(%1=8,%2=1,%3=0) if %2<=1 {_SetMesTabStop %1,%2,%3,temp@mod_mestab}else{_SetMesTabStop %1,%2,%3,%1}
#deffunc _SetMesTabStop int tab_size,int tab_max,int pf,array tab_size_array
tab_gsel=ginfo_sel*TABSTOPMAX
if tab_max<=1{
TSP(tab_gsel)=tab_size
}else{
repeat limit(tab_max,0,TABSTOPMAX):TSP(cnt+tab_gsel)=tab_size_array(cnt):loop
}
tabmax(ginfo_sel)=limit(tab_max,0,TABSTOPMAX)
tab_r(ginfo_sel)=1
tab_pf(ginfo_sel)=pf
return
//----タブサイズ変更された文字列を表示-----
//[MesTab mes_str, to]
// mes_str =文字列
// to =タブが配置される開始位置の x 座標を指定します (省略時0)
#define global MesTab(%1="",%2=0) _MesTab str(%1),%2
#deffunc _MesTab str mes_str,int to
mref bm,67 // 現在のウィンドウ情報(BMSCR構造体)
tab_gsel=ginfo_sel*TABSTOPMAX
if ginfo_sel>=length(tab_f) {tabmax(ginfo_sel)|0:bm_fsize(ginfo_sel)|0:tab_f(ginfo_sel)=0:TSP(tab_gsel) | 0:TSP2(tab_gsel)=0:tab_r(ginfo_sel)=0:tab_pf(ginfo_sel) | 0}
if tab_pf(ginfo_sel)=0 {
if (bm(32) ! bm_fsize(ginfo_sel)) or tab_r(ginfo_sel) {
tab_r(ginfo_sel)=0
bm_fsize(ginfo_sel)=bm(32)
if tabmax(ginfo_sel)>0 {
mes "\t" //標準のタブを基準にする
tbfsize=ginfo_mesx/8
bm(28)-ginfo_mesy
repeat tabmax(ginfo_sel)
TSP2(cnt+tab_gsel)=(tbfsize*TSP(cnt+tab_gsel)) //タブサイズを文字サイズから計算(TabbedTextOutの指定がピクセル単位なので)
loop
}
}
}
if tab_pf(ginfo_sel)=0 {
TabbedTextOut hdc,bm(27),bm(28),mes_str,strlen(mes_str),tabmax(ginfo_sel),TSP2(tab_gsel),to
}else{
TabbedTextOut hdc,bm(27),bm(28),mes_str,strlen(mes_str),tabmax(ginfo_sel),TSP(tab_gsel),to
}
bm(68)=stat&$ffff,stat>>16
if bm(19)>$ffff {//表示中なら描画した領域だけredraw
redraw 1,bm(27),bm(28),stat&$ffff,stat>>16
}
bm(28)+bm(69) //描画分縦にカレントポジションを移動
return
#global
//----モジュールここまで
screen 0,640,800
font "MS 明朝",34,1
repeat 5
mes "\t"
line ginfo_cx+ginfo_mesx,0,ginfo_cx+ginfo_mesx,800
loop
pos 0,0
buf="\tA\tB\tC\tD\tE" ;文字列
mes "mes buf"
mes buf
mes
color 255
mes "MesTab buf"
MesTab buf //標準の幅8文字
mes
mes "SetMesTabStop 4\nMesTab buf"
SetMesTabStop 4 //タブ幅4文字指定
MesTab buf
mes
mes "tab=1,5,10,20\nSetMesTabStop tab,4\nMesTab buf"
tab=1,5,15,30
SetMesTabStop tab,4//4個個別に文字単位でタブ幅を指定
MesTab buf
mes
mes "tab=50,150,240,350,400\nSetMesTabStop tab,4,1\nMesTab buf"
tab=50,150,240,350,400
SetMesTabStop tab,5,1//ピクセル単位で指定
MesTab buf
mes "MesTab buf,200"
MesTab buf,200 //同じタブ設定で開始位置をずらす
mes
mes "012345678901234567890123467890123456789"
stop