====== 007 文字列の描画 ====== {{:wiki:opengl:tips:opengl_drawtext.png?200|}} ===== 概要 ===== WindowsのAPIを使ってフォントを生成し文字列を表示します。2バイト文字列も可。 ==== ソースコード ==== #include #include 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; }