Page 816 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼文字列の長さを実寸で知る 英人 21/8/10(火) 14:15 ┣Re:文字列の長さを実寸で知る somem 21/8/10(火) 21:51 ┃ ┗Re:文字列の長さを実寸で知る 英人 21/8/18(水) 12:53 ┣Re:文字列の長さを実寸で知る kojima 21/8/11(水) 13:45 ┃ ┗Re:文字列の長さを実寸で知る 英人 21/8/18(水) 13:11 ┗Re:文字列の長さを実寸で知る 英人 21/8/18(水) 13:33 ─────────────────────────────────────── ■題名 : 文字列の長さを実寸で知る ■名前 : 英人 ■日付 : 21/8/10(火) 14:15 -------------------------------------------------------------------------
| お世話になります。 JW ver5.11eから 最新の8.24aへ乗り換え中です。 ver5.11eのとき作っていた外変の移植をしていますが、文字列の長さを実寸で求める方法を教えていただけたらと思います。 当時は、全角と半角で文字幅を計算し、文字間隔を加える方法で計算していました。現在は、MS ゴシックを使用すれば、同じのように思えますが、 他のフォントを使用した場合は、どうなのでしょうか。 Visual Studioで Basicで開発していますが、全角、半角が昔の処理ではうまく判別できないのもあり、さらにフォントが違う場合にはどうするのだろうかと思っています。四角の枠にぴったり文字を入れ、印刷までする予定です。 |
| ▼英人さん: >当時は、全角と半角で文字幅を計算し、文字間隔を加える方法で計算していました。現在は、MS ゴシックを使用すれば、同じのように思えますが、 >他のフォントを使用した場合は、どうなのでしょうか。 作図済の文字に文字枠を作図する場合、 "jwc_temp.txt"に書出される文字データには、文字列長さが出力されます。 その値を利用すれば、全角/半角、フォントの種類を識別する必要はなくなります。 <文字データ> ch x0 y0 dx dy "文字列 ※横文字(水平)の場合、dxが文字列長さ、dy=0 になります。 |
| ▼somemさん: 遅くなりまして申し訳ありません。 文字を入力し、それを長方形で囲む形で作図する外変のリメイクです。 入力した文字が、実寸でどういう大きさになるかを計算しなければならなくて、苦労しておりました。 ネックとなるのが1文字毎に半角か、全角かを判定する部分なのですが、 以前 Visual studio 2005のBasic で使用していたものでは全角も半角も同じ「1」が返ってきて、役にたたなかったのです。 一応、解決しましたので、役にたたないとは思いますが、別に投稿します。 ありがとうございました。 >▼英人さん: > >>当時は、全角と半角で文字幅を計算し、文字間隔を加える方法で計算していました。現在は、MS ゴシックを使用すれば、同じのように思えますが、 >>他のフォントを使用した場合は、どうなのでしょうか。 > >作図済の文字に文字枠を作図する場合、 >"jwc_temp.txt"に書出される文字データには、文字列長さが出力されます。 >その値を利用すれば、全角/半角、フォントの種類を識別する必要はなくなります。 > ><文字データ> >ch x0 y0 dx dy "文字列 >※横文字(水平)の場合、dxが文字列長さ、dy=0 になります。 |
| ▼英人さん: >お世話になります。 >JW ver5.11eから 最新の8.24aへ乗り換え中です。 >ver5.11eのとき作っていた外変の移植をしていますが、文字列の長さを実寸で求める方法を教えていただけたらと思います。 > >当時は、全角と半角で文字幅を計算し、文字間隔を加える方法で計算していました。現在は、MS ゴシックを使用すれば、同じのように思えますが、 >他のフォントを使用した場合は、どうなのでしょうか。 図寸・実寸ともフォントの種類は無関係です。 (見た目の感覚と差異があるかも?) > >Visual Studioで Basicで開発していますが、全角、半角が昔の処理ではうまく判別できないのもあり、さらにフォントが違う場合にはどうするのだろうかと思っています。四角の枠にぴったり文字を入れ、印刷までする予定です。 作図済の文字列の場合は、somenさんのレスの通りです。 そうでない時は、 jwc_temptxtの以下の項目から、図寸*縮尺倍率でだします。 hs 50 100 200 30 30 30 30 30 30 30 30 30 30 30 30 1#レイヤグループ毎の縮尺の逆数 hcw 1.4 1.8 2.4 3.2 3.5 4.2 7 8 9 10#文字種毎の幅 hch 2 2.5 3 4 5 6 7 8 9 10#文字種毎の高さ hcd 0 0 0 0.5 0.5 1 1 2 2 2#文字種毎の間隔 半角文字の場合は、文字幅・文字間隔ともに1/2になります。 文字列を1文字単位にして、幅と間隔を合計する。(図寸) 合計値に縮尺の逆数(倍率)を掛算する。 半角・全角が混じった文字列の場合は、文字間隔は前の文字に依存します。 半角文字・全角文字の並びだと文字間隔は*1/2となり 全角文字・半角文字の並びだと文字間隔は*1です。 |
| ▼kojimaさん: 遅くなりまして申し訳ありません。 >▼英人さん: >>お世話になります。 >>JW ver5.11eから 最新の8.24aへ乗り換え中です。 >>ver5.11eのとき作っていた外変の移植をしていますが、文字列の長さを実寸で求める方法を教えていただけたらと思います。 >> >>当時は、全角と半角で文字幅を計算し、文字間隔を加える方法で計算していました。現在は、MS ゴシックを使用すれば、同じのように思えますが、 >>他のフォントを使用した場合は、どうなのでしょうか。 > >図寸・実寸ともフォントの種類は無関係です。 >(見た目の感覚と差異があるかも?) フォントによっては、文字の配置を調整して表現されているものもありますよね。 それが、JWでは1文字毎に位置調整されて画面と、プリンターに出力されているのかな? それとも、文字列の幅と高さに倍率をかけて従来と近い値にしているのかな? と考えた次第です。 PictureBoxに文字を表示するときに、MeasureTextという関数があって、 textSize = TextRenderer.MeasureText(word, dfnt) こんな風に使っていました。(Visual Basic) 文字の長さの実寸は、今までどおりで良いと教えていただいて、ありがとうございます。 全角と半角の文字をプログラムで判別するのに、 Visual Studio 2005でのBasicで使っていたものが使えなくなったので、 苦労しているときに、上記のことを考えたのです。 一応、そちらも解決いたしましたので、別に投稿しておきます。 ありがとうございました。 > >> >>Visual Studioで Basicで開発していますが、全角、半角が昔の処理ではうまく判別できないのもあり、さらにフォントが違う場合にはどうするのだろうかと思っています。四角の枠にぴったり文字を入れ、印刷までする予定です。 > >作図済の文字列の場合は、somenさんのレスの通りです。 > >そうでない時は、 >jwc_temptxtの以下の項目から、図寸*縮尺倍率でだします。 > >hs 50 100 200 30 30 30 30 30 30 30 30 30 30 30 30 1#レイヤグループ毎の縮尺の逆数 >hcw 1.4 1.8 2.4 3.2 3.5 4.2 7 8 9 10#文字種毎の幅 >hch 2 2.5 3 4 5 6 7 8 9 10#文字種毎の高さ >hcd 0 0 0 0.5 0.5 1 1 2 2 2#文字種毎の間隔 > >半角文字の場合は、文字幅・文字間隔ともに1/2になります。 >文字列を1文字単位にして、幅と間隔を合計する。(図寸) >合計値に縮尺の逆数(倍率)を掛算する。 > >半角・全角が混じった文字列の場合は、文字間隔は前の文字に依存します。 >半角文字・全角文字の並びだと文字間隔は*1/2となり >全角文字・半角文字の並びだと文字間隔は*1です。 |
| ご迷惑をおかけしました。 以前 Visual Studio 2005で使用していた、文字の長さを取得する関数です。 Private Function m_len(ByVal str, ByVal mW, ByVal md) As Double Dim i As Integer Dim m As Integer ' str:文字列 mw:jwis全角文字幅 md:jw文字間隔 curScale:書き込みレイヤスケール For i = 1 To Len(str) m = Len(StrConv(Mid(str, i, 1), VbStrConv.Narrow)) If m = 1 Then '半角の場合 m_len = m_len + mW / 2 '半角文字の幅を加えて If i <> Len(str) Then m_len = m_len + md / 2 '文字間隔の半分を加える End If If m = 2 Then '全角の場合 m_len = m_len + mW 'is全角文字の幅を加えて If i <> Len(str) Then m_len = m_len + md '文字間隔を加える End If Next i m_len = m_len * curScale End Function これがうまくいかなくて、いろいろ調べて先ほど変更した Visual Studio 2019用のものが 以下となります。 Public Function m_len(ByVal str As String, ByVal mW As Double, ByVal md As Double) As Double Dim i As Integer Dim m As Integer ' str:文字列 mw:jwis全角文字幅 md:jw文字間隔 curScale:書き込みレイヤスケール System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance) For i = 1 To Len(str) '"Shift_JIS"の使えるEncodingにセットして Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS") 'そのEncodingでの文字のバイト数を得る 全角ならば2が、半角ならば1が得られる m = sjisEnc.GetByteCount(Mid(str, i, 1)) If m = 1 Then '半角の場合 m_len = m_len + mW / 2 '半角文字の幅を加えて If i <> Len(str) Then m_len = m_len + md / 2 '文字間隔の半分を加える End If If m = 2 Then '全角の場合 m_len = m_len + mW 'is全角文字の幅を加えて If i <> Len(str) Then m_len = m_len + md '文字間隔を加える End If Next i m_len = m_len * curScale End Function "Shift_JIS"の使えるEncodingを意識して使用しないといけないということのようでした。 |