2017年7月2日日曜日

Win10 Creators Update Fonts が可笑しい VS WPF? 直して! MS

果たして、 OS なのか?、開発環境なのか?、 ... 。
何れにしても、 フォント表示が 変! です。
また、トラブっている予感 ... 。
フォント代替え機能 が上手く動いていない気がするのですが。


実は、
Visual Studio の Form と WPF とで、結果が異なると言う何とも妙な結果です。

そうなのです。
前から、この、フォント代替え機能 には 悩まされて来ました。
変わらないのなら問題無いのですが、
OS 更新によって、ころころと変わるのですよね。
標準的な文字は、勿論の事、問題等在りはしません。
  であれば、 大騒ぎですから。
  見た目が変わって がやがやと 騒がれてはいましたが、 それは別問題。
でも、 特殊文字 特に 絵文字の類を使うと悩む事に ... 。

Windows 7 から Windows 10 に移行した時点で、この点は、気付いていました。
あれっ、 文字が違う! と。
それは、まぁ、しょうがないか なっ と諦めていたのですが、
ここに来て、 改善要求すべき 事態に遭遇! です。


まぁ、 見て貰いましょう。
                  Windows 10 v1703 build 15063.447
                  Visual Studio 2013 version 12.0.40629.00 Update 5  2017 を使えばよかった ... 。.


Form (左)  WPF (右)。
全く、同じ文字列を表示するだけの プログラム の結果です。


  Code を最下に掲載。.


WPF アプリケーション において、
本来、グリフが無い文字を 参照する筈の 代替えフォント が動きません。  上段。
下段 は 大元の文字が格納されたフォント自体を指定しているので、 共に 問題無く です。
同じ内容を Form と WPF とで書くと、結果が異なると言う とても 妙 な 結末です。



メモ帳等で表示していると、
代替えフォント のお陰で、 その文字がどのフォントから来ているか 一見は 分からないので、
悩みました。
大元の文字が格納されたフォント自体を探すのに、
文字コード表 charmap.exe を引っ張り出して、右往左往です。

  あっ、
  大事な事を書くのを忘れていますね。
  上図で、指定した文字列は、全て、フォントの Unicode 私的領域 Private Use Area と呼ばれる位置のものです。
  欧米圏用のフォントに良く見られる 異字体 (例えば、 a 等のバリエーション) が納められる領域です。
  同じ字でも、見た目が異なる字体を混ぜ込む事で、フォントらしからぬ表現が可能になる あれ です。 
  まるで、本当の 手書きの様な 印象が得られる として 注目 なのですが ... 。.
  日本語環境で、外字とバッティングする! と読んだ記憶もある場所ですね。.

    本来、ここに、特殊な文字が入っていれば、上の図にある 文字 は呼ばれずに、
    その文字が使える筈なのです。
    その為に、 書き出した プログラム で この事(表示の不一致) を発見してしまいました!。

Segoe UI Emoji と Segoe UI Symbol とが 代表的な絵文字 を格納するフォントでしょう。
Windows 10 では Segoe UI Emoji を優先する様に変更されています。  いると思います。
いえ、 Segoe MDL2 Assets が新たな 最優先の様です。 .


フォントを、同領域にデータを持たない時の参照先が代替えになると思われる もの を指定すると、
Form では、正確に参照していますが、
WPF では、トラブっていますね。
上段フォントの指定を Form と WPF とで同じもの にしても、結果に変わりはありません。.


System.Windows.Media クラスでの "Global User Interface" の設定が間違っている 気がするのですが ... 。
内容的に見て、 或いは、 日本語環境のみの問題かも知れません。
外字絡みの対策の為か、 変な事になっている! です。
                     過去が 重い影 を落としている ... 。  のでしょうか? ね。.


無論、
個々のプログラムに於いて、
フォントの参照順位を設定する事で暫定的な対処は可能とは思いますが、
ふたつの基底(Form/WPF)で結果が異なるこの内容は、是非、改善して貰いたいですね。



お願いしますよ、 Microsoft さま!。.



図の Code です。.

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Set PUA Data U+E000 - 16 Chars / Line
        Dim showText As String = "" & vbCrLf &
                                 "" & vbCrLf &
                                 "" & vbCrLf &
                                 ""
        'On Designer Label1Font = Not Set ( Default "MS UI Gothic" )
        'On Designer Label2 Font = "Segoe UI Symbol"

        Me.Label1.Text = showText
        Me.Label2.Text = showText
    End Sub
End Class

 Class TestMainWindow

    Private Sub TestMainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        'Set PUA Data U+E000 - 16 Chars / Line
        Dim showText As String = "" & vbCrLf &
                                 "" & vbCrLf &
                                 "" & vbCrLf &
                                 ""
        'On xaml Label1 Font = Not Set ( Default "Yu Gothic UI" )
        'On xaml Label2 Font = "Segoe UI Symbol"

        Me.Label1.Content = showText
        Me.Label2.Content = showText
    End Sub
End Class




[2017/07/05] Segoe MDL2 Assets の件を追記

0 件のコメント:

コメントを投稿