1. 程式人生 > >如何修改程式標題, 選單的字型

如何修改程式標題, 選單的字型

場景:

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沒辦法改標題欄, 狀態列.