目次

007 文字列の描画

概要

WindowsのAPIを使ってフォントを生成し文字列を表示します。2バイト文字列も可。

ソースコード

#include <GL/freeglut.h>
#include <stdio.h>
 
HFONT g_hFont;
HDC	g_hDC;
 
// フォント作成。
void CreateFont( wchar_t* _pFontName, int _Size )
{
	g_hFont = CreateFontW(
	_Size,				// フォントの高さ
	0,				// 平均文字幅
	0,				// 文字送り方向の角度
	0,				// ベースラインの角度
	FW_REGULAR,			// フォントの太さ
	FALSE,				// 斜体にするかどうか
	FALSE,				// 下線を付けるかどうか
	FALSE,				// 取り消し線を付けるかどうか
	SHIFTJIS_CHARSET,		// 文字セットの識別子
	OUT_DEFAULT_PRECIS,		// 出力精度
	CLIP_DEFAULT_PRECIS,		// クリッピング精度
	ANTIALIASED_QUALITY,		// 出力品質
	FIXED_PITCH | FF_MODERN,	// ピッチとファミリ
	_pFontName);			// フォント名
 
	g_hDC = wglGetCurrentDC();
	SelectObject( g_hDC, g_hFont );
}
 
// 文字列の描画。
void DrawString( int _x,int _y, wchar_t *format, ... )
{
	wchar_t buf[256];
	va_list ap;
	int length = 0;
	int list = 0;
 
	if( format == NULL )
	{
		return;
	}
 
	//文字列変換
	va_start( ap, format );
	vswprintf_s( buf, format, ap );
	va_end( ap );
 
	length = wcslen( buf );
	list = glGenLists( length );
	for( int i = 0; i < length; i++ )
	{
		wglUseFontBitmapsW( g_hDC, buf[i], 1, list + (DWORD)i );
	}
 
	glDisable( GL_LIGHTING );
	glRasterPos2i( _x, _y );
	//ディスプレイリストで描画
	for( int i = 0; i< length; i++ )
	{
		glCallList(list + i);
	}
	glEnable( GL_LIGHTING );
	//ディスプレイリスト破棄
	glDeleteLists( list, length );
}
 
// ディスプレイコールバック
void displayCallBack()
{
	// 画面の初期色設定。
	glClearColor( 1.0f, 1.0f, 1.0f, 1.0 );
 
	// 画面クリア。
	glClear( GL_COLOR_BUFFER_BIT );
 
	// テキスト描画。
	glColor4f( 0.0f, 0.0f, 1.0f, 1.0f );
	DrawString( 40, 40, L"全角文字。" );
 
	glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
	DrawString( 40, 60, L"Hallo OpenGL !!!" );
 
	// ダブルバッファ交換。
	glutSwapBuffers();
}
 
// キーボード入力用コールバック
void KeyboardCallBack( unsigned char _key, int _x, int _y )
{
	switch( _key )
	{
	case '\033':	// ESC
		{
			exit(0); // 終了
		}
		break;
	default:
		break;
	}
}
 
// メイン
int main( int argc, char *argv[] )
{
	// GLUTの初期化
	glutInit( &argc, argv );
 
	// ウィンドウの位置を指定。
	glutInitWindowPosition( 100, 100 );
 
	// ウインドウサイズ指定
	glutInitWindowSize( 640, 480 );
 
	// ウインドウの表示モード指定
	glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );
 
	// ウインドウ生成
	glutCreateWindow( argv[0] );
 
	// コールバック関数の登録。
	glutDisplayFunc( displayCallBack );		// ディスプレイ。
	glutKeyboardFunc( KeyboardCallBack );   // キーボード
 
	// 現在の行列と正射影行列の乗算を行う。
	glOrtho( 0, glutGet( GLUT_INIT_WINDOW_WIDTH ), glutGet( GLUT_INIT_WINDOW_HEIGHT ), 0, -1, 1 );
 
	// フォント作成。
	CreateFont( L"MSゴシック", 18 );
 
	// メインループ
	glutMainLoop();
 
	// フォント破棄。
	DeleteObject( g_hFont );
 
	return 0;
}