如何修改程式標題, 選單的字型
阿新 • • 發佈:2019-01-07
場景:
Win7簡體中文 + VC2008 sp1下編寫的SDI程式, 在程式執行時控制元件的預設字型是"MS Shell Dlg", 但是標題和選單的字型卻是"宋體".需要為SDI程式實現多語言(中文, 英語, 俄語, 阿拉伯語, 蒙古語等).
問題:
Win7簡體中文下, 中文, 英文都很正常顯示, 但俄語, 在控制元件上就可以正常顯示, 而在標題, 選單, 狀態列上顯示就不正常了, 字母之間隔得很開!解決思路:
1. 俄語在控制元件上顯示正常, 在標題上顯示不正常. 很明顯, "MS Shell Dlg"字型可以正常顯示俄語, "宋體"不能.2. 把標題, 選單, 狀態列的字型修改為"MS Shell Dlg"即可.
方法一.
NONCLIENTMETRICS m_ncmOld; NONCLIENTMETRICS m_ncmNew; BOOL CXXXApp::InitInstance() { // 儲存開始設定 m_ncmOld.cbSize = sizeof(NONCLIENTMETRICS); ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, m_ncmOld.cbSize, &m_ncmOld, 0); m_ncmNew.cbSize = sizeof(NONCLIENTMETRICS); ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, m_ncmNew.cbSize, &m_ncmNew, 0); wcscpy(m_ncmNew.lfCaptionFont.lfFaceName, L"MS Shell Dlg"); wcscpy(m_ncmNew.lfSmCaptionFont.lfFaceName, L"MS Shell Dlg"); wcscpy(m_ncmNew.lfMenuFont.lfFaceName, L"MS Shell Dlg"); wcscpy(m_ncmNew.lfStatusFont.lfFaceName, L"MS Shell Dlg"); wcscpy(m_ncmNew.lfMessageFont.lfFaceName, L"MS Shell Dlg"); ::SystemParametersInfo(SPI_SETNONCLIENTMETRICS, m_ncmNew.cbSize, &m_ncmNew, 0); ... } int CXXXApp::ExitInstance() { ::SystemParametersInfo(SPI_SETNONCLIENTMETRICS, m_ncmOld.cbSize, &m_ncmOld, 0); ... }
說明: 這貌似可以解決, 然而不是那麼簡單, 因為 SPI_SETNONCLIENTMETRICS 修改的是整個系統的配置的, 也就是系統其它程式的標題的字型也被修改了, 而且SPI_SETNONCLIENTMETRICS的設定很慢, 使得程式啟動很慢! 客戶不能接受.
方法二
#include "AfxGlobals.h" BOOL CXXXApp::InitInstance() { // 儲存開始設定 LOGFONT logfont = {0}; ::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0); wcscpy(logfont.lfFaceName, L"MS Shell Dlg"); afxGlobalData.SetMenuFont(&logfont, true); ... }
說明: 只改了選單的字型!, afxGlobalData沒辦法改標題欄, 狀態列.