Skip to content

Commit 9ad041c

Browse files
authored
Merge pull request #94 from katahiromz/copilot/add-small-log-font-support
Add xg_lfSmallLogFont (LOGFONTW) for small font management with backward compatibility
2 parents 2f565d1 + 2d17ba6 commit 9ad041c

4 files changed

Lines changed: 81 additions & 8 deletions

File tree

GUI.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ WCHAR xg_szCellFont[LF_FACESIZE] = L"";
240240
LOGFONTW xg_lfCellLogFont = {};
241241
// 小さな文字のフォント。
242242
WCHAR xg_szSmallFont[LF_FACESIZE] = L"";
243+
// 小さな文字のフォント(LOGFONTW形式)。サイズは固定で変更しない。
244+
LOGFONTW xg_lfSmallLogFont = {};
243245
// UIフォント。
244246
WCHAR xg_szUIFont[LF_FACESIZE] = L"";
245247

@@ -913,6 +915,7 @@ void XgResetSettings(void)
913915
xg_szCellFont[0] = 0;
914916
ZeroMemory(&xg_lfCellLogFont, sizeof(xg_lfCellLogFont));
915917
xg_szSmallFont[0] = 0;
918+
ZeroMemory(&xg_lfSmallLogFont, sizeof(xg_lfSmallLogFont));
916919
xg_szUIFont[0] = 0;
917920
xg_bShowToolBar = true;
918921
s_bShowStatusBar = true;
@@ -1127,6 +1130,21 @@ bool __fastcall XgLoadSettings(void)
11271130
if (!app_key.QuerySz(L"SmallFont", sz, _countof(sz))) {
11281131
StringCchCopy(xg_szSmallFont, _countof(xg_szSmallFont), sz);
11291132
}
1133+
{
1134+
// xg_lfSmallLogFont をレジストリから読み込む(サイズフィールドは除く)。
1135+
LOGFONTW lf;
1136+
if (!app_key.QueryStruct(L"SmallLogFont", lf)) {
1137+
lf.lfHeight = xg_lfSmallLogFont.lfHeight;
1138+
lf.lfWidth = xg_lfSmallLogFont.lfWidth;
1139+
xg_lfSmallLogFont = lf;
1140+
// SmallFont(上で読み込み済み)のフォント名を優先する。
1141+
if (xg_szSmallFont[0])
1142+
StringCchCopy(xg_lfSmallLogFont.lfFaceName, _countof(xg_lfSmallLogFont.lfFaceName), xg_szSmallFont);
1143+
} else {
1144+
// SmallLogFontがなければSmallFontから互換復元する。
1145+
StringCchCopy(xg_lfSmallLogFont.lfFaceName, _countof(xg_lfSmallLogFont.lfFaceName), xg_szSmallFont);
1146+
}
1147+
}
11301148
if (!app_key.QuerySz(L"UIFont", sz, _countof(sz))) {
11311149
StringCchCopy(xg_szUIFont, _countof(xg_szUIFont), sz);
11321150
}
@@ -1369,6 +1387,13 @@ bool __fastcall XgSaveSettings(void)
13691387
lf.lfWidth = 0;
13701388
app_key.SetStruct(L"CellLogFont", lf);
13711389
}
1390+
{
1391+
// xg_lfSmallLogFont をレジストリに保存する(サイズフィールドは除く)。
1392+
LOGFONTW lf = xg_lfSmallLogFont;
1393+
lf.lfHeight = 0;
1394+
lf.lfWidth = 0;
1395+
app_key.SetStruct(L"SmallLogFont", lf);
1396+
}
13721397

13731398
app_key.SetDword(L"ShowToolBar", xg_bShowToolBar);
13741399
app_key.SetDword(L"ShowStatusBar", s_bShowStatusBar);
@@ -2161,6 +2186,23 @@ BOOL XgImportLooks(HWND hwnd, LPCWSTR pszFileName)
21612186

21622187
GetPrivateProfileStringW(L"Looks", L"SmallFont", L"", szText, _countof(szText), pszFileName);
21632188
StringCchCopyW(xg_szSmallFont, _countof(xg_szSmallFont), szText);
2189+
// SmallLogFontがあれば優先して復元する。
2190+
GetPrivateProfileStringW(L"Looks", L"SmallLogFont", L"", szText, _countof(szText), pszFileName);
2191+
if (szText[0]) {
2192+
std::vector<BYTE> data;
2193+
XgHexToBin(data, szText);
2194+
if (data.size() == sizeof(LOGFONTW)) {
2195+
const LONG lfHeight = xg_lfSmallLogFont.lfHeight;
2196+
const LONG lfWidth = xg_lfSmallLogFont.lfWidth;
2197+
memcpy(&xg_lfSmallLogFont, data.data(), sizeof(LOGFONTW));
2198+
xg_lfSmallLogFont.lfHeight = lfHeight;
2199+
xg_lfSmallLogFont.lfWidth = lfWidth;
2200+
StringCchCopyW(xg_szSmallFont, _countof(xg_szSmallFont), xg_lfSmallLogFont.lfFaceName);
2201+
}
2202+
} else {
2203+
// SmallLogFontがなければSmallFontから互換復元する。
2204+
StringCchCopyW(xg_lfSmallLogFont.lfFaceName, _countof(xg_lfSmallLogFont.lfFaceName), xg_szSmallFont);
2205+
}
21642206

21652207
// スケルトンビューか?
21662208
if (XgIsUserJapanese())
@@ -2242,6 +2284,11 @@ BOOL XgExportLooks(HWND hwnd, LPCWSTR pszFileName)
22422284

22432285
// 小さい文字のフォント。
22442286
WritePrivateProfileStringW(L"Looks", L"SmallFont", xg_szSmallFont, pszFileName);
2287+
// SmallLogFontを保存する(互換のためSmallFontとSmallLogFontの両方を書き出す)。
2288+
{
2289+
XGStringW str = XgBinToHex(&xg_lfSmallLogFont, sizeof(xg_lfSmallLogFont));
2290+
WritePrivateProfileStringW(L"Looks", L"SmallLogFont", str.c_str(), pszFileName);
2291+
}
22452292

22462293
// もし黒マス画像が指定されていれば
22472294
if (xg_strBlackCellImage.size() && xg_strBlackCellImage != XgLoadStringDx1(IDS_NONE))

XG_Settings.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ extern LOGFONTW xg_lfCellLogFont;
77

88
// 小さな文字のフォント。
99
extern WCHAR xg_szSmallFont[LF_FACESIZE];
10+
// 小さな文字のフォント(LOGFONTW形式)。サイズは固定で変更しない。
11+
extern LOGFONTW xg_lfSmallLogFont;
1012

1113
// UIフォント。
1214
extern WCHAR xg_szUIFont[LF_FACESIZE];

XG_SettingsDialog.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ BOOL XG_SettingsDialog::OnOK(HWND hwnd)
211211
// 小さい文字のフォント。
212212
::GetDlgItemTextW(hwnd, edt2, szName, _countof(szName));
213213
StringCchCopy(xg_szSmallFont, _countof(xg_szSmallFont), szName);
214+
// xg_lfSmallLogFont のフォント名も同期する(サイズは変更しない)。
215+
StringCchCopy(xg_lfSmallLogFont.lfFaceName, _countof(xg_lfSmallLogFont.lfFaceName), szName);
214216

215217
// UIフォント。
216218
::GetDlgItemTextW(hwnd, edt3, szName, _countof(szName));
@@ -336,6 +338,17 @@ BOOL XG_SettingsDialog::DoImportLooks(HWND hwnd, LPCWSTR pszFileName)
336338

337339
GetPrivateProfileStringW(L"Looks", L"SmallFont", L"", szText, _countof(szText), pszFileName);
338340
SetDlgItemTextW(hwnd, edt2, szText);
341+
// SmallLogFontがあれば優先してフォント名を取得してダイアログへ反映する。
342+
GetPrivateProfileStringW(L"Looks", L"SmallLogFont", L"", szText, _countof(szText), pszFileName);
343+
if (szText[0]) {
344+
std::vector<BYTE> data;
345+
XgHexToBin(data, szText);
346+
if (data.size() == sizeof(LOGFONTW)) {
347+
LOGFONTW lfSmall;
348+
memcpy(&lfSmall, data.data(), sizeof(LOGFONTW));
349+
SetDlgItemTextW(hwnd, edt2, lfSmall.lfFaceName);
350+
}
351+
}
339352

340353
GetPrivateProfileStringW(L"Looks", L"UIFont", L"", szText, _countof(szText), pszFileName);
341354
SetDlgItemTextW(hwnd, edt3, szText);
@@ -485,6 +498,14 @@ BOOL XG_SettingsDialog::DoExportLooks(HWND hwnd, LPCWSTR pszFileName)
485498
// 小さい文字のフォント。
486499
::GetDlgItemTextW(hwnd, edt2, szName, _countof(szName));
487500
WritePrivateProfileStringW(L"Looks", L"SmallFont", szName, pszFileName);
501+
// SmallLogFontを保存する(互換のためSmallFontとSmallLogFontの両方を書き出す)。
502+
{
503+
// ダイアログのフォント名とxg_lfSmallLogFontのプロパティを合わせて保存する。
504+
LOGFONTW lfSmall = xg_lfSmallLogFont;
505+
StringCchCopy(lfSmall.lfFaceName, _countof(lfSmall.lfFaceName), szName);
506+
XGStringW strHex = XgBinToHex(&lfSmall, sizeof(lfSmall));
507+
WritePrivateProfileStringW(L"Looks", L"SmallLogFont", strHex.c_str(), pszFileName);
508+
}
488509

489510
// UIフォント。
490511
::GetDlgItemTextW(hwnd, edt3, szName, _countof(szName));
@@ -722,7 +743,8 @@ void XG_SettingsDialog::OnChange(HWND hwnd, int i)
722743
case 1:
723744
cf.Flags = CF_NOSCRIPTSEL | CF_NOVERTFONTS | CF_SCALABLEONLY |
724745
CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
725-
StringCchCopy(lf.lfFaceName, _countof(lf.lfFaceName), xg_szSmallFont);
746+
lf = xg_lfSmallLogFont;
747+
lf.lfHeight = 24;
726748
if (::ChooseFontW(&cf)) {
727749
// 取得したフォントをダイアログへ格納する。
728750
::SetDlgItemTextW(hwnd, edt2, lf.lfFaceName);

XWordGiver.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4936,15 +4936,17 @@ HFONT XgCreateNormalFont(INT nCellSize)
49364936
// 小さい文字のフォントを作成する。
49374937
HFONT XgCreateSmallFont(INT nCellSize)
49384938
{
4939-
LOGFONTW lf;
4940-
ZeroMemory(&lf, sizeof(lf));
4941-
if (xg_szSmallFont[0])
4942-
StringCchCopy(lf.lfFaceName, _countof(lf.lfFaceName), xg_szSmallFont);
4939+
// xg_lfSmallLogFont のプロパティ(ウェイト、イタリック、文字セットなど)を反映する。
4940+
// サイズフィールド (lfHeight, lfWidth) はセルサイズから動的に計算する。
4941+
LOGFONTW lf = xg_lfSmallLogFont;
49434942
lf.lfHeight = -nCellSize * xg_nSmallCharPercents / 100;
49444943
lf.lfWidth = 0;
4945-
lf.lfWeight = FW_NORMAL;
4946-
lf.lfQuality = ANTIALIASED_QUALITY;
4947-
lf.lfCharSet = SHIFTJIS_CHARSET;
4944+
if (!lf.lfWeight)
4945+
lf.lfWeight = FW_NORMAL;
4946+
if (!lf.lfQuality)
4947+
lf.lfQuality = ANTIALIASED_QUALITY;
4948+
if (!lf.lfCharSet)
4949+
lf.lfCharSet = SHIFTJIS_CHARSET;
49484950
return ::CreateFontIndirectW(&lf);
49494951
}
49504952

0 commit comments

Comments
 (0)