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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0316
冨山縦書き表記について7解決


冨山

リンク

2014/3/16(Sun) 17:48:44|NO.60714

hspで縦書きはできないのでしょうか

文字を縦書きにするだけなら改行でなんとかできるのですが、変数に文字を当てるとそれができません。

他に方法はないでしょうか



この記事に返信する


Masa

リンク

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



KA

リンク

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度回転してコピー



cats

リンク

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



MillkeyStars

リンク

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

みなさんの案を使ってみます。ありがとうございました



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