楽でいい!
フォント表示を試してみました。
アウトラインとビットマップ。アウトラインの方は、最初フォントを指定せずに試したので(恐らくデフォルトのシステムフォントが使われていた)、苦労しました。
…感想。
楽でいい!
頂点バッファがどうのこうのID3DXFontがどうのこうのTRIANGLESTRIPがどうのこうのってのが馬鹿らしくなってきます。楽でいい。OpenGLはいいものです。うん。
DirectXは行列をそのまま扱っていましたが、OpenGLは間接的にですね。そういうのも段々わかってきました。
unit Unit1; {$WARN SYMBOL_PLATFORM OFF} interface uses SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms, QDialogs, QStdCtrls, Qt, Windows, OpenGL; type TForm1 = class(TForm) procedure FormPaint(Sender: TObject); private { Private 宣言 } FWindowsHandle: HWND; FWindowsDC: HDC; FRC: HGLRC; protected procedure CreateWidget; override; procedure DestroyWidget; override; procedure Draw; public { Public 宣言 } end; var Form1: TForm1; implementation const PixelFormat: Windows.TPixelFormatDescriptor = ( nSize: Sizeof(Windows.TPixelFormatDescriptor); nVersion: 1; dwFlags: PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType: PFD_TYPE_RGBA; cColorBits: 24; cRedBits: 0; cRedShift: 0; cGreenBits: 0; cGreenShift: 0; cBlueBits: 0; cBlueShift: 0; cAlphaBits: 0; cAlphaShift: 0; cAccumBits: 0; cAccumRedBits: 0; cAccumGreenBits: 0; cAccumBlueBits: 0; cAccumAlphaBits: 0; cDepthBits: 32; cStencilBits: 0; cAuxBuffers: 0; iLayerType: PFD_MAIN_PLANE; bReserved: 0; dwLayerMask: 0; dwVisibleMask: 0; dwDamageMask: 0; ); {$R *.xfm} { TForm1 } procedure TForm1.CreateWidget; begin inherited; FWindowsHandle := QWidget_winId(Handle); end; procedure TForm1.DestroyWidget; begin FWindowsHandle := 0; inherited; end; procedure TForm1.Draw; var agmf: Windows.GLYPHMETRICSFLOAT; begin glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity; glOrtho(0, ClientWidth, ClientHeight, 0, -1, 1); glMatrixMode(GL_MODELVIEW); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glColor(1.0, 0.0, 0.0); glVertex(50, 50, 0); glColor(0.0, 1.0, 0.0); glVertex(100, 50, 0); glColor(0.0, 0.0, 1.0); glVertex(50, 100, 0); glEnd; Canvas.Font.Name := 'さざなみ明朝'; Canvas.Font.Height := 50; Windows.SelectObject(FWindowsDC, QFont_handle(Canvas.Font.Handle)); //ビットマップ表示されるフォントだとwglUseFontOutlinesがエラー glPushMatrix; glColor(1.0, 1.0, 1.0); Win32Check(wglUseFontOutlinesW(FWindowsDC, Ord(WideString('漢')[1]), 1, 1000, 0, 0, WGL_FONT_POLYGONS, @agmf)); glLoadIdentity(); glTranslate(150, 200, 0); glScale(50, -50, 1); glRotate(30, 0, 0, 1); glCallList(1000); glPopMatrix; glColor(1.0, 1.0, 1.0); wglUseFontBitmapsW(FWindowsDC, Ord(WideString('字')[1]), 1, 1001); glRasterPos(200, 200); glCallList(1001); glFlush; SwapBuffers(FWindowsDC); end; procedure TForm1.FormPaint(Sender: TObject); begin FWindowsDC := QPainter_handle(Canvas.Handle); SetPixelFormat(FWindowsDC, ChoosePixelFormat(FWindowsDC, @PixelFormat), @PixelFormat); FRC := wglCreateContext(FWindowsDC); wglMakeCurrent(FWindowsDC, FRC); Draw; wglMakeCurrent(FWindowsDC, 0); wglDeleteContext(FRC); end; end.
サンプルは、CLXなのにクロスじゃない謎コードで。