- ベストアンサー
D3DXCreateFontとID3DXFont::DrawTextによる文字列の縦書き描画
- D3DXCreateFontとID3DXFont::DrawTextを使用して文字列を縦書き描画する方法
- コードの記述方法と引数の設定により、文字列が表示されない場合の解決策
- 開発環境と言語:Visual Studio 2005 C++、C/C++(Win32API)+DirectX9.0b
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
そうですか・・・。 横書きが OK なら少しずつ値(角度等)を変更していくと何かがわかる場合が あります。変更できるところがあるならとことん変更していくと 覚えられるし、応用方法が増えていくのでいいと思います。 (まあ、時間が空いているならですが。^^) ただ、ダイレクト X と WinAPI を組み合わせる動作は 私にはよくわかりませんのでご自分でしらべてください。 でも、少し突っ込みを入れると >ただ、D3DXFontを使うためにDrawTextがいいんですよね。 >(DirectXでTextOutは重すぎるので・・) DirectX で TextOut() 関数は別に重いわけではないです。(多分) DirectX で TextOut() 関数を使うにはサーフェイスからデバイスコンテキストハンドルを 取得してやる・・・というめんどくさい作業が入るけど出来ます。 それに DrawText() も実は重いです(うわさ)。 下記のサイトから DirectX技術編→高速フォント表示 ではテクスチャにフォント文字を書き込んで そのテクスチャを貼り付けるという高速文字の描画方法 が記述されています。それにテクスチャなので回転等が 使えるので縦書きにも工夫次第で出来ます。 サンプルソースが記述されているのでわかりやすいサイトです。 DirectX をやっているならこのサイトはそれなりに役に立つと思います。
その他の回答 (3)
- koedame
- ベストアンサー率33% (10/30)
色々と手間がかかりますけど頑張ってください。 DrawText については私も WinAPI の途中からDirectX に移ったので微妙なうる覚えだったかもしれません。 >内部でWin32APIのDrawTextを呼び出しているだとかいう話があったよ>うな気もするため確信が持てなくなってきましたが・・。 こんなこと知りませんでしたよ。ありがとうございます。^^ ずいぶんお詳しいようですから、すぐ出来ますよ。 頑張ってください。 ちなみに私はDirectX 始めて5ヶ月くらいなので そんなに詳しくはお答えできなかったと思います。 本当に参考程度にしてください。
お礼
お返事遅れてすみません。 動的にテクスチャを生成する方法で大丈夫のようでした。 手間はかなり増えましたが、速度も速く上々です。 ありがとうございました。
- koedame
- ベストアンサー率33% (10/30)
とりあえず、もう一度・・・ここからはアドバイスというより 余計なおせっかいになるかもしれませんデス。^^ エラーチェックをしてOKなら、 (備考 g_pD3DDevice はLPDIRECT3DDEVICE9です (デバイス)) g_pD3DDevice->BeginScene(); //シーンの開始 /*この部分*/ g_pD3DDevice->EndScene(); g_pD3DDevice->Present( NULL, NULL, NULL, NULL ); 「/*この部分*/」 という場所にDrawText() メソッドを使っているか・・・ そういう単純なミスのチェックが結構あるのでそこなど 最後に補足なんですけど、縦書きをやろうとしていらっしゃるようですが、横書きは出来ているのでしょうか? もし、出来ていないなら、そちらからやったほうが・・ね・・ orz 俺は何が言いたいんだろう・・。 これでもまだ駄目ならまた返事をお願いします。 少し調べてみます。
補足
アドバイスありがとうございます。 CreateFontの角度指定で0を指定した場合は、普通に横書きで表示されています。 ですので、DrawTextメソッドの位置はあっているはずだと思います。 HDCを使って、TextOutで描画したときはきちんと縦書きに表示されるんです。 ただ、D3DXFontを使うためにDrawTextがいいんですよね。 (DirectXでTextOutは重すぎるので・・)
- koedame
- ベストアンサー率33% (10/30)
アドバイス程度に聞いてください。 そちらの開発環境ではデバッガがあるのでブレークポイント等を挿入したりしてプログラムを止めてみて様子を見るのも一つの手です。 LPD3DXFONT p_D3DXFont; //フォントオブジェクト HRESULT hr; hr = p_D3DXFont->DrawText( NULL, /*文字列*/, -1, /*RECT 構造体*/, FW_NORMAL, //仮の値なので・・・ D3DCOLOR_XRGB(0,0,0) ); if( FAILED(hr) ) { MessageBox( NULL, "失敗", "エラー", MB_OK ); } hr には成功するとD3D_OK,失敗すると、うーん・・・変な値が入っています。 -214341ぐらいの数字です。 ただ、上のif文のやり方だとメッセージボックスがたくさん出る のでお勧めしません。 他にも背景の色と文字の色が同じなんていう落ちもあるので、 色々試してください。
お礼
アドバイスありがとうございます。 DrawTextの返り値を調べてみたのですが、エラーが返されることはありませんでした。 背景の色と文字の色が同じ、という落ちもなかったみたいです。 いまいちDrawTextメソッドの仕様を詳細に把握してなく、Rectの座標指定ミスかな、とは踏んでいるのですが。 どうしましょうか・・・。
補足
アドバイス有難うございます。 そうですね、素直にテクスチャ生成を試してみた方がいいですね。 頻繁に描画する文字が変わるため、テクスチャ生成の時間がネックになりそうで躊躇していたのですが、やってみることにします。 DrawTextは普通に重いですが、TextOutよりは軽いと思います。 一応Win32APIではなくID3DXFontのメソッドですので。 内部でWin32APIのDrawTextを呼び出しているだとかいう話があったような気もするため確信が持てなくなってきましたが・・。 では、やはり初心に帰ってテクスチャ生成を試してみます。 上手くできたらご報告します。