2024/10/25(Fri) 06:25:05 編集(投稿者)
■No103415 (アブサン さん) に返信
> コードのGetBaseFontNameでスタイル判定方法もわかりましたので
> Semilight、Lightの場合にlfWeightを変えるようにしました。
解決した後ですが、中太や極太などもある上、Light の場合、290 や 300 の値をとることがあるため、
フォント名と lfWeight の Dictionary を作るといいと思います。
// スタイル名
private enum WeightStyles
{
THIN = 100,
EXTRALIGHT = 200,
ULTRALIGHT = 200,
LIGHT = 300,
SEMILIGHT = 350,
NORMAL = 400,
REGULAR = 400,
MEDIUM = 500,
SEMIBOLD = 600,
DEMIBOLD = 600,
BOLD = 700,
EXTRABOLD = 800,
ULTRABOLD = 800,
HEAVY = 900,
BLACK = 900
}
// ダイアログで選択したとき フォント名と lfWeight の組み合わせを登録して次回から使用する。
// 既知のフォントはあらかじめ登録しておく
private static readonly Dictionary<string, int> dicWeight
= new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) {
{ "Microsoft JhengHei Light", 290 },
{ "Microsoft JhengHei UI Light", 290 }
{ "Segoe UI Light", 300 },
{ "Segoe UI Semibold", 600 },
{ "Segoe UI Black", 900 }
};
private static NativeMethods.LOGFONT GetLogFont(Font font) {
// 既知のフォント名から lfWeight を設定する
var logFont = new NativeMethods.LOGFONT();
font.ToLogFont(logFont);
lock (dicWeight) {
if (dicWeight.TryGetValue(logFont.lfFaceName, out int weight)) {
logFont.lfWeight = weight;
return logFont;
}
}
// フォント名からスタイルを検索して lfWeight を設定する
var faceName = logFont.lfFaceName.ToUpper();
foreach (WeightStyles style in Enum.GetValues(typeof(WeightStyles))) {
if (faceName.IndexOf(" " + style.ToString()) >= 0) {
logFont.lfWeight = (int)style;
break;
}
}
return logFont;
}
private void UpdateFont(NativeMethods.LOGFONT logFont) {
// LOGFONT から Font を作成する
Font = Font.FromLogFont(logFont);
// Font から LOGFONT を取り出す
var gdipLogFont = GetLogFont(Font);
Debug.Print($"{logFont.lfFaceName} {logFont.lfWeight}:{gdipLogFont.lfWeight}");
// lfWeight が違う場合は保存する
if (gdipLogFont.lfWeight != logFont.lfWeight) {
lock (dicWeight) {
dicWeight[logFont.lfFaceName] = logFont.lfWeight;
}
}
}