DOBON.NETプログラミング道掲示板
(現在 過去ログ5 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■35041 / inTopicNo.1)  "−"を縦書きにしたい
  
□投稿者/ キウイ 一般人(1回)-(2022/05/05(Thu) 19:15:33)
  • アイコン環境/言語:[Windows10 / VB.NET2019] 
    分類:[.NET] 

    VB.NET2019において、PictureBoxに縦書きで文字を書くコードを作成しています。
    '指定座標に一文字描画
    Sub DrawChar(ByVal drawChar As String, ByVal font As Font, ByVal pt As Point, ByVal g As Graphics)

    Dim ZenkakuStf As New StringFormat(StringFormatFlags.DirectionVertical)
    Dim brush1 As Brush = New SolidBrush(ForeColorLabel.ForeColor)

    g.DrawString(drawChar, font, brush1, pt, ZenkakuStf)
    End Sub

    PictureBoxに縦書きで1文字表示する、こんな感じのメソッドを作成しました。
    ひらがな、カタカナ、漢字等は問題なく表示されます。
    ここで問題なのが"−"という文字で"|"のように縦線で表示したいのですが、"−"のように横線で表示されてしまいます。
    If (drawChar = "−") Then
    g.DrawString(drawChar, CharFont, brush1, pt)
    Else
    g.DrawString(drawChar, CharFont, brush1, pt, ZenkakuStf)
    End If
    のように"−"だけ縦書き指定を外してみましたが、やはり"−"になってしまいます。
    縦線に表示する方法はないでしょうか。


引用返信 削除キー/
■35042 / inTopicNo.2)  Re[1]: "−"を縦書きにしたい
□投稿者/ shu 大御所(497回)-(2022/05/06(Fri) 13:24:48)
  • アイコンNo35041に返信(キウイさんの記事)


    ifのところで、drawCharの代わりに"|"を使用するのはどうでしょう?
              
引用返信 削除キー/
■35043 / inTopicNo.3)  Re[1]: "−"を縦書きにしたい
□投稿者/ YuO 一般人(2回)-(2022/05/06(Fri) 15:12:31)
  • アイコン
    No35041に返信(キウイさんの記事)
    > ここで問題なのが"−"という文字で"|"のように縦線で表示したいのですが、"−"のように横線で表示されてしまいます。
    
    以下のようなコードを使って試してみましたが (VS 2022)、
    ・.NET Framework 4.8
    ・.NET 6
    ・.NET 5
    ・.NET Core 3.1
    のすべてにおいて、縦書きで正しく表示されました。
    特殊なフォントを指定したりしていないでしょうか。
    
    --- コード ---
        Private Const Message As String = "初めて投稿される方は、必ず「書き込みのルールについて(12/4/2更新)」をお読みください。"
    
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
            Dim format As New StringFormat(StringFormatFlags.DirectionVertical)
            Using font As New Font("遊ゴシック", 15.0)
                e.Graphics.DrawString(Message, font, Brushes.Black, 10.0, 10.0, format)
                e.Graphics.DrawString(Message, font, Brushes.Black, 40.0, 40.0)
            End Using
        End Sub
    --- コード ---
    

引用返信 削除キー/
■35044 / inTopicNo.4)  Re[2]: "−"を縦書きにしたい
□投稿者/ Hongliang 大御所(624回)-(2022/05/06(Fri) 15:30:53)
  • アイコン試された'ー’は U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK
    問題の'−'は U+FF0D FULLWIDTH HYPHEN-MINUS
    別の文字ですよ。
    // LibreOffice Writerだと'−'もちゃんと縦になってるなあ…。
引用返信 削除キー/
■35045 / inTopicNo.5)  Re[2]: "−"を縦書きにしたい
□投稿者/ キウイ 一般人(2回)-(2022/05/06(Fri) 19:29:21)
  • アイコンNo35042に返信(shuさんの記事)
    > ■No35041に返信(キウイさんの記事)
    >
    >
    > ifのところで、drawCharの代わりに"|"を使用するのはどうでしょう?
    >           
    If (drawChar = "−") Then
    g.DrawString("|", CharFont, brush1, pt)
    Else
    g.DrawString(drawChar, CharFont, brush1, pt, ZenkakuStf)
    End If
    ↑も試してまして絵的には縦線にはなるのですが、なんというか文字が違って見えまして。
    気分的な話ですいません。
    最後の手段としてとっておきます。
    ありがとうございます。
引用返信 削除キー/
■35046 / inTopicNo.6)  Re[2]: "−"を縦書きにしたい
□投稿者/ キウイ 一般人(3回)-(2022/05/06(Fri) 19:37:49)
  • アイコンNo35043に返信(YuOさんの記事)
    > ■No35041に返信(キウイさんの記事)
    >>ここで問題なのが"−"という文字で"|"のように縦線で表示したいのですが、"−"のように横線で表示されてしまいます。
    >
    > 以下のようなコードを使って試してみましたが (VS 2022)、
    > ・.NET Framework 4.8
    > ・.NET 6
    > ・.NET 5
    > ・.NET Core 3.1
    > のすべてにおいて、縦書きで正しく表示されました。
    > 特殊なフォントを指定したりしていないでしょうか。
    >
    > --- コード ---
    > Private Const Message As String = "初めて投稿される方は、必ず「書き込みのルールについて(12/4/2更新)」をお読みください。"
    >
    > Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
    > Dim format As New StringFormat(StringFormatFlags.DirectionVertical)
    > Using font As New Font("遊ゴシック", 15.0)
    > e.Graphics.DrawString(Message, font, Brushes.Black, 10.0, 10.0, format)
    > e.Graphics.DrawString(Message, font, Brushes.Black, 40.0, 40.0)
    > End Using
    > End Sub
    > --- コード ---
    >
    指定のフォントはデフォルト値である「MS ゴシック」「14.25」です。

    If (drawChar = "−") Then
    Dim format As New StringFormat(StringFormatFlags.DirectionVertical)
    Using font1 As New Font("遊ゴシック", 14.0)
    g.DrawString("−", font1, Brushes.Black, 10.0, 10.0, format)
    g.DrawString("−", font1, Brushes.Black, 40.0, 40.0)
    End Using

    'g.DrawString("|", CharFont, brush1, pt)
    Else
    g.DrawString(drawChar, CharFont, brush1, pt, ZenkakuStf)
    End If
    ↑のようにしてみましたが、表示されるのは横線でした。

引用返信 削除キー/
■35047 / inTopicNo.7)  Re[3]: "−"を縦書きにしたい
□投稿者/ 魔界の仮面弁士 大御所(1422回)-(2022/05/06(Fri) 19:58:42)
  • アイコンNo35046に返信(キウイさんの記事)
    > 指定のフォントはデフォルト値である「MS ゴシック」「14.25」です。

    "MS ゴシック" ではなく
    "MS ゴシック" ですよね?


    > Using font1 As New Font("遊ゴシック", 14.0)

    "遊ゴシック" ではなく
    "游ゴシック" ですよね?



    また、OS の正確なバージョン番号も御提示ください。
    https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10-april-2018/2c82da6b-ddec-4a9f-8f48-c1c4255242ea
    https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel%E3%81%A7meiryoui%E3%81%AE%E7%B8%A6%E6%9B%B8/9fd56af1-cc77-4725-9a07-ecf8a667dfdc
引用返信 削除キー/
■35050 / inTopicNo.8)  Re[4]: "−"を縦書きにしたい
□投稿者/ キウイ 一般人(5回)-(2022/05/07(Sat) 00:14:06)
  • アイコンNo35047に返信(魔界の仮面弁士さんの記事)
    > ■No35046に返信(キウイさんの記事)
    >>指定のフォントはデフォルト値である「MS ゴシック」「14.25」です。
    >
    > "MS ゴシック" ではなく
    > "MS ゴシック" ですよね?
    >
    >
    >>Using font1 As New Font("遊ゴシック", 14.0)
    >
    > "遊ゴシック" ではなく
    > "游ゴシック" ですよね?
    >
    >
    >
    > また、OS の正確なバージョン番号も御提示ください。
    > https://answers.microsoft.com/ja-jp/windows/forum/all/windows-10-april-2018/2c82da6b-ddec-4a9f-8f48-c1c4255242ea
    > https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel%E3%81%A7meiryoui%E3%81%AE%E7%B8%A6%E6%9B%B8/9fd56af1-cc77-4725-9a07-ecf8a667dfdc

    すみません。
    "MS ゴシック"
    です。

    "遊ゴシック"→"游ゴシック"に修正してみましたが、横線でした。
    念のため、"メイリオ"、"MS Pゴシック"にしてやってもみましたが、横線でした。


    OSバージョンは
    -------------------------------------------------
    エディション Windows 10 Home
    バージョン 21H2
    インストール日 ‎2022/‎01/‎05
    OS ビルド 19044.1645
    エクスペリエンス Windows Feature Experience Pack 120.2212.4170.0
    -------------------------------------------------


    以下のコードで、
    Dim CharFont As Font
    Dim fontFam As FontFamily
    Dim ZenkakuStf As New StringFormat(StringFormatFlags.DirectionVertical)

    fontFam = font.FontFamily
    CharFont = New Font(fontFam, 14)

    Dim brush1 As Brush = New SolidBrush(ForeColorLabel.ForeColor)

    g.DrawString(drawChar, CharFont, brush1, pt, ZenkakuStf)

    "−…「」"という文字列で実行した結果が添付画像です。
    左から
    "MS ゴシック"、"メイリオ"、"游ゴシック"の順です。
    fontFam変数に上記フォント名が入っているのは確認しています。

    >https://answers.microsoft.com/ja-jp/msoffice/forum/all/excel%E3%81%A7meiryoui%E3%81%AE%E7%B8%A6%E6%9B%B8/9fd56af1-cc77-4725-9a07-ecf8a667dfdc
    こちらに書かれていた記事を追跡してメイリオのフォントが6.50なのは確認しましたが、古いものに戻すというのはモノがないので無理です。
    もしかしてOSレベルのバグなのでしょうか。うーん。

103×100
イメージ
font.jpg
/4KB
引用返信 削除キー/
■35052 / inTopicNo.9)  Re[5]: "−"を縦書きにしたい
□投稿者/ 魔界の仮面弁士 大御所(1424回)-(2022/05/07(Sat) 14:11:59)
  • アイコンNo35050に返信(キウイさんの記事)
    > インストール日 ‎2022/‎01/‎05
    最近の WinApp って、不可視文字な LRM が混入することが増えてきていて、
    Unicode 非対応の環境にコピペした時に文字化けして困りますね…。
    (たとえば、ファイルのプロパティの作成日時などの欄など)

    化けてしまっている 8206 は、Left-to-Right Mark の不可視文字ですね。
    アラビア語やヘブライ語のように、文章を右から左に書く言語において
    英単語などの左から右に記述する語を挿入する際に使われます。


    ――閑話休題。


    > "−…「」"という文字列で実行した結果が添付画像です。
    当方の 21H2 環境 (Win10 および Win11) でも同様でした。
    "NSimSun" だと回転しましたが…。※Microsoft Word の縦書きでも同様。

    U+002D,U+2010-2015,U+FF0D あたりの文字は、フォントによって
    縦書き用字形を持っているかどうかが異なるので、個別対応が必要になるかも。


    > CharFont = New Font(fontFam, 14)
    > Dim brush1 As Brush = New SolidBrush(ForeColorLabel.ForeColor)
    New した Font や Brush は、使用後に Dispose (Using) しましょう。


    > メイリオのフォントが6.50なのは確認しましたが、
    フォントバージョンの違いについては調べ切れていませんが、手始めに
    ・そもそも書字方向依存グリフであるのか否か。
    ・OS 依存性、フォント依存性があるのかどうか。
    ・GDI+ の場合と GDI の場合で差があるかどうか
    などを調査して、対応を考えていくという方針ではどうでしょう?
    (別フォントで代用、別文字で代用、別の描画方法を併用など)


    参考情報として、VerticalOrientation.txt を紹介しておきます。
    UAX #50 (Unicode Vertical Text Layout)
    https://www.unicode.org/Public/UCD/latest/ucd/VerticalOrientation.txt

    FF0D '−' や 002D '-' は「R」で、
    30FC 'ー' は「Tr」だそうな。

    # U - Upright, the same orientation as in the code charts
    # R - Rotated 90 degrees clockwise compared to the code charts
    # Tu - Transformed typographically, with fallback to Upright
    # Tr - Transformed typographically, with fallback to Rotated


    YuO さんが試された 30FC 'ー' にしても、フォントによっては
    左右非対称の字形だったりしますから、たとえ横書きするにしても、
    Left-to-Right で描画した時と、Right-to-Left の時とで、
    描画を反転させるべきか否か、という問題があったりします。


    参考までに、当方の描画結果と実験コードを載せておきます。
    DpiAwareneww は PerMonitorV2 設定です。

    Option Strict On
    Public Class Form1
      Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
        Const LANGID_JA_JP As Integer = &H411
        'NoFontFallback は、非対応の文字を代替フォントではなく豆腐文字で描画するための指定
        Dim vertFmt As New StringFormat(StringFormatFlags.DirectionVertical Or StringFormatFlags.NoFontFallback, LANGID_JA_JP)
        Dim horiFmt As New StringFormat(StringFormatFlags.NoFontFallback, LANGID_JA_JP)
        Dim charcters = ChrW(&H201C) & ChrW(&HFF0D) & ChrW(&H2026) _
            & ChrW(&H300C) & ChrW(&H300D) & ChrW(&H2D) & ChrW(&H30FC) _
            & ChrW(&HFE31) & ChrW(&HFE32) & ChrW(&HFE33) _
            & ChrW(&H7C) & ChrW(&HFF5C) & ChrW(&H201D)
        Dim fontNames = {"MS ゴシック", "メイリオ", "游ゴシック", "NSimSun", "Microsoft JhengHei"}
        e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
        For x = 0 To fontNames.Length - 1
          'Dim fontName = $"@{fontNames(x)}"
          Dim fontName = fontNames(x)
          Using charFont As New Font(fontName, 14.0F)
            Dim pt1 As New Point(15 + x * 65, 15)
            e.Graphics.DrawString($"{charcters}//{fontName}", charFont, Brushes.MediumBlue, pt1, vertFmt)
            Dim pt2 As New Point(350, 15 + x * 45)
            e.Graphics.DrawString($"{charcters}//{fontName}", charFont, Brushes.Crimson, pt2, horiFmt)
          End Using
        Next
      End Sub
    End Class
1161×861 => 250×185
イメージ
Vertical.png
/18KB
引用返信 削除キー/
■35053 / inTopicNo.10)  Re[6]: "−"を縦書きにしたい
□投稿者/ キウイ 一般人(6回)-(2022/05/07(Sat) 18:43:17)
  • アイコンNo35052に返信(魔界の仮面弁士さんの記事)
    実験までしていただいて恐縮です。
    このコードでのアプリにおいてはフォント指定もユーザに出来るようにしたいので、フォント限定というのはしたくないし・・・


    'g.DrawString(drawChar, CharFont, brush1, pt, ZenkakuStf)
    Dim flags As TextFormatFlags = TextFormatFlags.VerticalCenter
    TextRenderer.DrawText(g, drawChar, CharFont, New Rectangle(pt.X, pt.Y, 30, 30), ForeColorLabel.ForeColor, flags)
    こんな感じでGDIでの描画も試してみましたが、やはり横線のままでした。

    もういっそ、1文字分を画像処理で90度回転するのが確実な気もしてきました。
    座標と描画サイズはわかっているのだし・・・

    ありがとうございます。

引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -