有沒有一種方法來檢查,如果給定的字體是微軟ClearType-optimized fonts之一?
我想我可以簡單地硬編碼字體名稱列表,因爲它是一個相對較短的列表,但這似乎有點難看。無論Windows的語言環境和語言設置如何,字體名稱是否都是相同的?
背景:
PuTTY看起來大膽,啓用ClearType的-,索拉文字真難看。我決定玩的來源,看看我能想出的問題,我想我跟蹤它到以下(略)代碼:
font_height = cfg.font.height;
if (font_height > 0) {
font_height =
-MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
}
}
font_width = 0;
#define f(i,c,w,u) \
fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
c, OUT_DEFAULT_PRECIS, \
CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
FIXED_PITCH | FF_DONTCARE, cfg.font.name)
f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);
font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;
f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
這樣做的目的是選擇一個粗體適合與普通字體相同的尺寸。我假設PuTTY的索拉文字看起來醜陋,因爲自從索拉如此高度優化的特定的像素邊界進行奠定了,試圖把它變成鞋拔子任意尺寸產生不好的結果。
因此,似乎適當的修復方法是檢測ClearType優化的字體,並嘗試使用與初始CreateFont調用相同的寬度和高度創建這些字體的粗體版本。
「(縮寫)」代碼是windows \ window.c的簡化版本。你的分析與我的分析基本相同。我爲本地副本PuTTY所做的解決方法是,如果字體名稱爲Consolas,則爲字體寬度傳遞0。 (加下劃線的字體也可能會搞砸;我認爲你的修補程序將無法處理這些問題。) – 2010-04-07 02:05:39
謝謝你的提示。我也把這個問題跟蹤到了這個代碼區域,最後指責了CreateFont。現在我已經更改了代碼,以便字體寬度作爲0傳遞(第1421行),並且看起來和預期的一樣好。要主動處理額外的和窄/寬的字體(雖然從未見過),如果它在行1596之前等於font_width,則將x重置爲0.無法找到類似大小的其他固定寬度字體的任何錯誤。 – ygoe 2011-05-18 14:01:05