|
|
2014/3/16(Sun) 17:48:44|NO.60714
hspで縦書きはできないのでしょうか
文字を縦書きにするだけなら改行でなんとかできるのですが、変数に文字を当てるとそれができません。
他に方法はないでしょうか
|
|
2014/3/16(Sun) 18:07:29|NO.60717
すべて日本語(2バイト文字)という前提で説明をします。
まず、変数に文字列をセットします。
次にその変数の長さ(バイト数)を2で割って、文字数を出します。
次に、縦書き1文字目の表示位置(横・縦)を指定します。
次に、i に初期値(0バイト目)をセットします。
ここから繰り返し処理で
・文字の横位置・縦位置指定
・変数の文字列のiバイト目から2バイト分切り出して表示
・文字の縦位置を1文字分、加算
・i に2を足す
という流れになります。
--- ここから実際のプログラム -------
mojiretsu1="アイウエオ"
X = strlen(mojiretsu1)/2
mesX=10
mesY=10
i = 0
repeat X
pos mesX,mesY
mes strmid(mojiretsu1,i,2)
mesY = mesY+ginfo(15)
i = i + 2
loop
stop
|
|
2014/3/16(Sun) 18:20:27|NO.60718
mesboxなどの横幅を狭くしてどうにかする。
|
|
2014/3/16(Sun) 18:36:55|NO.60719
用途はスクリーン描画に限定されますが
縦書き用フォントで横向きに書いた文字を
90度回転コピーする方法もあります。
screen 1, 320, 320 : title "文字用バッファ" ; 便宜上表示してます
font "@MS ゴシック", 16, 1 ; 縦書き用フォントを指定
pos 0, 4 ; 文字欠け防止の為上を少し空ける
mes "縦書きテスト\n2行目\n3行目" ; 複数行もOK
screen 0, 320, 320 : title "表示用ウィンドウ"
pos 320, 0
celput 1, 0, , ,(M_PI/2) ; 90度回転してコピー
|
|
2014/3/16(Sun) 21:36:14|NO.60721
あり さんのスクリプトをモジュール化してみました。
posで位置を調整しないといけません。(ginfo_mesxとかで直せそうですが)
あとフォントスタイルの指定とか描画領域の指定はパラメータを追加して
直してください。(mesに形式をできるだけ近づけたかったので未実装)
#module
#deffunc set_stat int ret_stat
return ret_stat
#deffunc set_refstr str ret_refstr
return ret_refstr
#deffunc font_get local bmscr, local font_name, local font_size, local font_deco
mref bmscr, ginfo_sel + 96
sdim font_name
getstr font_name, bmscr, $E0
set_refstr font_name
font_size = -bmscr.49
font_deco = 0
if bmscr.53 = 700 : font_deco + 1
if peek(BMSCR.54, 0) = 1 : font_deco + 2
if peek(BMSCR.54, 1) = 1 : font_deco + 4
if peek(BMSCR.54, 2) = 1 : font_deco + 8
if peek(BMSCR.55, 2) = 4 : font_deco + 16
set_stat font_size * $10000 + font_deco
return
#deffunc vmes str string_
sdim string, 256 : string=string_
font_get
FontName=refstr : FontSize=stat/$10000
nwx=ginfo(12) : nwy=ginfo(13) ;クライアント領域
act=ginfo(3) ;操作先ウィンドウID
vmx=ginfo(22) : vmy=ginfo(23) ;カレントポジション
spid=ginfo(25) ;空きウィンドウID
screen spid, nwx, nwy, 2 ;仮スクリーン生成
FontName="@"+FontName
font FontName, FontSize ;縦書用フォントを適応
pos 0, 4 : mes string ;仮スクリーンに文字列出力
gsel act ;操作先を元に戻す
pos nwx-vmx, 4+vmy : celput spid, 0, , ,(M_PI/2) ;90度回転してコピー
return 0
#global
pos 0, 0 : mes "Hello!"
pos 0, 0
font "MS ゴシック", 15
vmes "日本語テスト。\nEnglish Test.\nうまく表示できてますか。"
pos 46, 0
font "MS 明朝", 32
vmes "多少文字が荒くなるようです。"
pos 100, 0
font "Meiryo", 23
vmes "表示位置をしっかり調整しないと、\n横の文字とかぶります。特に左側の画像・文\n字は注意しないと消えます。"
pos 200, 100
font "Arial", 40
vmes "posはx座標が右側に\nなります。フォントス\nタイルの互換はあり\nません。"
stop
| |
|
2014/3/16(Sun) 23:16:59|NO.60724
Artlet2Dを使ったパターンの一つ(これもスクリーン描画限定です)
他にも一文字ずつ処理するとかAPIを使う等々の方法もありますが
個人的に楽だと思う2通りを提示してみました。
#include "a2d.hsp"
alCreateImage 0, 640, 480 ; 仮想イメージ作成
FontSize = 24 ; 文字サイズ
alFont MSGOTHIC, FontSize ; 仮想イメージ用フォント指定
TextData = "縦書きテスト\n2行目\nABCDEFG"
notesel TextData ; 複数行なのでメモリノートパッド命令を使用
pos 640, 0 ; 縦書きの為右から描画
cpos = ginfo_cx ; 書き始めのX座標を取得
repeat notemax ; 行数分繰り返す
cpos - FontSize ; 文字サイズ分左に座標をずらす
noteget TextBuf, cnt ; 文字列1行分を取得
alDrawText TextBuf, cpos, 0, FontSize, 480, 1 ; 仮想イメージに1文字毎に改行しながら描画
alCopyImageToScreen 0, 0, 0, 0, 640, 480, 0, 0 ; 仮想イメージからHSPウィンドウにコピー
redraw
wait 30
loop
|
|
2014/3/17(Mon) 13:41:17|NO.60729
何度も何度も消したり書いたりしてごめんなさい。(これで最後だと思います。)
フォントを角度指定で作り直すバージョンです。ただし作成したフォントは、mes 命令では対応できません。
(改行がなければ、mes でも対応できます。mes では改行対応ができないので、モジュール内の DownMes 命令を使用してください。)
#module DownMes_Control
#uselib "gdi32.dll"
#cfunc _CreateFont "CreateFontA" int,int,int,int,int,int,int,int,int,int,int,int,int,sptr
#cfunc _SelectObject "SelectObject" int,int
#func _DeleteObject "DeleteObject" int
#func _GetTextExtentPoint32 "GetTextExtentPoint32A" int,sptr,int,var
#func _ExtTextOut "ExtTextOutA" int,int,int,int,var,sptr,int,int
#cfunc _GetDeviceCaps "GetDeviceCaps" int,int
#uselib "kernel32.dll"
#cfunc _MulDiv "MulDiv" int,int,int
#func MultiByteToWideChar "MultiByteToWideChar" int,int,var,int,var,int
#uselib "user32.dll"
#define LOGPIXELSY 90
#define SHIFTJIS_CHARSET 128
#define OUT_DEFAULT_PRECIS 0
#define CLIP_LH_ANGLES (1<<4)
#deffunc Font2 str FontName,int p1,int p2
if p2&1 : _FW = 700 : else : _FW = 400 //ここの数値を変更すると文字の太さを変えられます。
if p2&2 : _FI = 1 : else : _FI = 0 //ここは、斜め文字の設定フラグです。(設定不可)
if p2&4 : _FU = 1 : else : _FU = 0 //ここは、アンダーラインの設定フラグです。(設定不可)
if p2&8 : _FS = 1 : else : _FS = 0 //ここは、打ち消し線の設定フラグです。(設定不可)
if p2&16 : _AA = 2 : else : _AA = 0 //ここは、アンチエイリアスの設定です。(設定不可)
nHeight = -_MulDiv(p1,_GetDeviceCaps(hdc,LOGPIXELSY),72)
_FontHandle = _CreateFont(nHeight,0,2700,2700,_FW,_FI,_FU,_FS,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,CLIP_LH_ANGLES,_AA,0,FontName)
if _FontHandle == 0 : return -1
_LostHandle = _SelectObject(hdc,_FontHandle)
if _LostHandle == 0 : return 0
_DeleteObject _LostHandle
_LostHandle = 0
return 0
#deffunc DownMes str p1,int p2 //第二引数に 1 を指定すると、左から右に表示します。
MasterStr = p1
notesel MasterStr
LineMax = notemax
dim POINT,6
noteget ViewStr,cnt
_GetTextExtentPoint32 hdc,ViewStr,strlen(ViewStr),POINT
POINT(4) = POINT(0)
POINT(5) = POINT(1)
SlideSize = 0
//行移動切り替え専用変数初期化
if p2 : FrontSlide = ginfo(22) + POINT(1) : else : FrontSlide = ginfo(22)
repeat LineMax
noteget ViewStr,cnt
_GetTextExtentPoint32 hdc,ViewStr,strlen(ViewStr),POINT
if POINT(2) <= POINT(0) : POINT(2) = POINT(0)
if POINT(3) <= POINT(1) : POINT(3) = POINT(1)
//mes だとカレントポジションの変更が起きるので、ExtTextOut 命令での表示
_ExtTextOut hdc,FrontSlide + SlideSize,ginfo(23),0,Rect,ViewStr,strlen(ViewStr),0
if POINT(1) == 0 : Plus = POINT(5) : else : Plus = POINT(1)
if p2 : SlideSize += Plus : else : SlideSize -= Plus
loop
pos ginfo(22) + SlideSize,ginfo(23) + POINT(2)
noteunsel
sdim MasterStr,64
return
#global
line 200,0,200,480 : line 0,100,640,100
Font2 "@MSゴシック",20,1|16
pos 200,100
DownMes "日本語テスト。\nEnglish Test.\nうまく表示できてますか。\n\nこれはテストです。",1
font "MSゴシック",12,0
mes "カレントポジション"
redraw 1
stop
| |
|
2014/3/17(Mon) 17:53:46|NO.60734
みなさんの案を使ってみます。ありがとうございました
|
|