電子書籍の厳選無料作品が豊富!

コンソールアプリで作ることが前提です。
glut関数で作成したウィンドウのハンドルを取得し、その画面上に文字を表示しようとTextOutやDrawTextやらを使ってみたんですが、背景色しか表示されません。DrawTextの戻り値が18だったので成功していると思うのですが。どこがおかしいのかご指摘をお願いします。

#include<stdio.h>
#include<windows.h>
#include<GL/glut.h>

HWND hwnd;

void display(){
glClearColor(0.5,0.5,0.5,1);
glClear(GL_COLOR_BUFFER_BIT);

hwnd=GetActiveWindow();
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
LPCSTR str = TEXT("あああ");

GetClientRect(hwnd, &rect);
hdc = BeginPaint(hwnd, &ps);
SetRect( &rect, 10, 10, 100, 100);
TextOut(hdc, 10, 10, str, lstrlen(str));
   DrawText(hdc, TEXT("あああ"), -1, &rect,DT_CENTER);
EndPaint(hwnd, &ps);

glFlush();
}

int main(int argc,char **argv){
glutInit(&argc,argv);
glutInitWindowSize(640,480);
glutCreateWindow("aaa");
glutDisplayFunc(display);

glutMainLoop();

return(0);
}

A 回答 (1件)

DirectXやOpenGLが扱ってるサーフェイスとWindows GDIが管理しているサーフェイスはまったく別のものだと


思ってください。
通常はウインドウの上にOpenGLのサーフェイスが作られているだけで、ウインドウ上に何を描画しようとも
上書きされてしまいます。

どうしてもDrawTextの結果をOpenGLで使いたいなら、
CreateBitmapやCreateDC等のAPIを使い、メモリー上のデバイスコンテキストを作成し
そこにDrawTextを実行。
それをBitmapに変換する等してから、テクスチャとして流し込む等することは可能だと思います。
ちなみにDirectX9にはIDirect3DSurface9::GetDCというものが用意されているようですが
アルファが設定されていると上手く動作しないようです。
OpenGLでそれに該当するものがあるかどうかは分かりません。

ただ単に文字列描画をしたいだけなら「OpenGL 文字列描画」で検索した方が早いと思います。

BeginPaint、EndPaint
はコンソールアプリケーションでは使えません。
MSDNからの引用ですが「アプリケーションがこの関数(BeginPaint)を呼び出せるのは、WM_PAINT メッセージに応答するときだけです。」
となっています。
    • good
    • 0
この回答へのお礼

詳しい説明ありがとうございました。
つまりglFlash()で上書きされるということでしょうか。
いろいろ試行錯誤した結果、TextOut関数をglFlush()の後に記述するとなぜか文字列を表示することができました。しかしもっと複雑なプログラムで試したらダメでした。
やはり別の方法を考えようと思います。

お礼日時:2008/11/29 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!