ご迷惑をおかけしました。
以前 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を意識して使用しないといけないということのようでした。