Warning: Declaration of action_plugin_linebreak::register(&$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /home/stepism/www/wiki/lib/plugins/linebreak/action.php on line 0

Warning: Declaration of action_plugin_syntaxhighlighter3_action::register(Doku_Event_Handler &$controller) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /home/stepism/www/wiki/lib/plugins/syntaxhighlighter3/action/action.php on line 0

Warning: Declaration of syntax_plugin_linebreak::handle($match, $state, $pos, &$handler) should be compatible with DokuWiki_Syntax_Plugin::handle($match, $state, $pos, Doku_Handler $handler) in /home/stepism/www/wiki/lib/plugins/linebreak/syntax.php on line 19

Warning: Declaration of syntax_plugin_linebreak::render($mode, &$renderer, $data) should be compatible with DokuWiki_Syntax_Plugin::render($format, Doku_Renderer $renderer, $data) in /home/stepism/www/wiki/lib/plugins/linebreak/syntax.php on line 19
007 文字列の描画 [stepism]

ユーザ用ツール

サイト用ツール


サイドバー

About

Contents

Materials Link

その他

PR


wiki:opengl:tips:007

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; 
} 
wiki/opengl/tips/007.txt · 最終更新: 2014/11/07 03:54 (外部編集)