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 ] ); } }