桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

Windows上での回転フォント

Windows上での回転フォントのお話。
MS-Officeのテクニックでフォント名の頭に「@」を付けると文字が回転するというのがあるんですが、先頭に「@」が付いたフォントは縦書き用のフォントですね。

日経BP デジタルARENA > 実践テクニック > 三角形の記号を横向きに入力する
http://trendy.nikkeibp.co.jp/article/tec/word/20040317/108093/

色々簡単なのでMFCで。

const int	nFontSize	= 15;
m_fontNorm.CreatePointFont( nFontSize * 10, _T("MS Gothic") );
m_fontRot1.CreatePointFont( nFontSize * 10, _T("@MS Gothic") );

LOGFONT	stFont;
m_fontNorm.GetLogFont( &stFont );
stFont.lfEscapement	= ( 360 - 90 ) * 10;
stFont.lfHeight		= nFontSize * 9;	// 自宅環境だと高さをこれ位にしないと正常に描画されなかった
m_fontRot2.CreatePointFontIndirect( &stFont );

m_static1.SetFont( &m_fontNorm );
m_static2.SetFont( &m_fontRot1 );
m_static3.SetFont( &m_fontRot2 );
m_static4.SetFont( &m_fontNorm );

const TCHAR szText1[]	= _T("▲");
const TCHAR szText2[]	= { 0x25C0, 0x0000 };
m_static1.SetWindowText( szText1 );
m_static2.SetWindowText( szText1 );
m_static3.SetWindowText( szText1 );
m_static4.SetWindowText( szText2 );


回転フォントを利用する場合、描画の開始位置が通常の場合とは異なる為、コントロールに表示させて利用するのはちょっと難しいですね。
縦書きフォントのダンプ

int CALLBACK EnumFontFamExProc(
	CONST LOGFONT* lpelfe,		// 論理的なフォントデータ
	CONST TEXTMETRIC* lpntme,	// 物理的なフォントデータ
	DWORD dwFontType,			// フォントの種類
	LPARAM lParam				// アプリケーション定義のデータ
)
{
	BOOL isAdd = FALSE;

	if ( ( lpelfe->lfPitchAndFamily & FF_MODERN ) == FF_MODERN )
	{
		isAdd = TRUE;
	}
	else if ( ( lpelfe->lfPitchAndFamily & FF_ROMAN ) == FF_ROMAN )
	{
		isAdd = TRUE;
	}

	if ( isAdd == TRUE )
	{
		if ( _T('@') != lpelfe->lfFaceName[ 0 ] )
		{
			return 1;
		}

		CStringArray* pstarrFont = reinterpret_cast< CStringArray* >( lParam );

		int i = 0;
		const int nArraySize = pstarrFont->GetSize();
		for ( ; i < nArraySize; ++i )
		{
			CString& strFont = pstarrFont->ElementAt( i );
			if ( strFont.Compare( lpelfe->lfFaceName ) == 0 )
			{
				return 1;
			}
		}

		(void)pstarrFont->Add( lpelfe->lfFaceName );
	}

	return 1;
}

void Dump()
{
	HDC hDesktop = ::GetDC( NULL );
	if ( hDesktop == NULL )
	{
		return;
	}

	CStringArray starrFont;

	LOGFONT stLogFont;
	::ZeroMemory( &stLogFont, sizeof( stLogFont ) );

	stLogFont.lfCharSet = DEFAULT_CHARSET;

	(void)::EnumFontFamiliesEx(
		hDesktop, &stLogFont, EnumFontFamExProc, reinterpret_cast< LPARAM >( &starrFont ), 0UL );
	(void)::ReleaseDC( NULL, hDesktop );
	hDesktop = NULL;

	const int nSize = starrFont.GetSize();
	for ( int i = 0; i < nSize; i++ )
	{
		TRACE( _T("%s\n"), starrFont[ i ] );
	}
}