【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

お世話になっています。
D3DXCreateFontとID3DXFont::DrawTextによって文字列を左上(0,0)右下(20,100)の四角形内に縦書き描画しようと、以下のようにコードを書きました。

CreateFontの第3引数cEscapementを2700にし、
CreateFontの第4引数cOrientationも2700にしてCreateFont、D3DXCreateFontによって作成したフォントで、
SetRect(0,0,20,100);
DrawText(Str,-1,&rc,DT_SINGLELINE | DT_WORD_ELLIPSIS | DT_NOCLIP, D3DCOLOR_XRGB(0,0,0));

上のようにして実行すると、何も表示されません。
SetRectの引数を変えてみたりはしたのですが、それでもやはり上手くいきませんでした。
もちろん、フォントは縦書きフォントを指定しています。
さっぱり原因がわからないので、どなたがご存知の方がいらっしゃれば、ご教授よろしくお願いします。

開発環境:Visual Studio 2005 C++
開発言語:C/C++(Win32API)+DirectX9.0b

A 回答 (4件)

そうですか・・・。


横書きが OK なら少しずつ値(角度等)を変更していくと何かがわかる場合が
あります。変更できるところがあるならとことん変更していくと
覚えられるし、応用方法が増えていくのでいいと思います。
(まあ、時間が空いているならですが。^^)

ただ、ダイレクト X と WinAPI を組み合わせる動作は
私にはよくわかりませんのでご自分でしらべてください。

でも、少し突っ込みを入れると
>ただ、D3DXFontを使うためにDrawTextがいいんですよね。
>(DirectXでTextOutは重すぎるので・・)
DirectX で TextOut() 関数は別に重いわけではないです。(多分)
DirectX で TextOut() 関数を使うにはサーフェイスからデバイスコンテキストハンドルを
取得してやる・・・というめんどくさい作業が入るけど出来ます。
それに DrawText() も実は重いです(うわさ)。
下記のサイトから
DirectX技術編→高速フォント表示
ではテクスチャにフォント文字を書き込んで
そのテクスチャを貼り付けるという高速文字の描画方法
が記述されています。それにテクスチャなので回転等が
使えるので縦書きにも工夫次第で出来ます。
サンプルソースが記述されているのでわかりやすいサイトです。
DirectX をやっているならこのサイトはそれなりに役に立つと思います。

参考URL:http://www.h6.dion.ne.jp/~game296o/GameMain.html

この回答への補足

アドバイス有難うございます。

そうですね、素直にテクスチャ生成を試してみた方がいいですね。
頻繁に描画する文字が変わるため、テクスチャ生成の時間がネックになりそうで躊躇していたのですが、やってみることにします。

DrawTextは普通に重いですが、TextOutよりは軽いと思います。
一応Win32APIではなくID3DXFontのメソッドですので。
内部でWin32APIのDrawTextを呼び出しているだとかいう話があったような気もするため確信が持てなくなってきましたが・・。

では、やはり初心に帰ってテクスチャ生成を試してみます。
上手くできたらご報告します。

補足日時:2007/02/01 21:58
    • good
    • 0

色々と手間がかかりますけど頑張ってください。



DrawText については私も WinAPI
の途中からDirectX に移ったので微妙なうる覚えだったかもしれません。
>内部でWin32APIのDrawTextを呼び出しているだとかいう話があったよ>うな気もするため確信が持てなくなってきましたが・・。
こんなこと知りませんでしたよ。ありがとうございます。^^

ずいぶんお詳しいようですから、すぐ出来ますよ。
頑張ってください。

ちなみに私はDirectX 始めて5ヶ月くらいなので
そんなに詳しくはお答えできなかったと思います。
本当に参考程度にしてください。
    • good
    • 0
この回答へのお礼

お返事遅れてすみません。

動的にテクスチャを生成する方法で大丈夫のようでした。
手間はかなり増えましたが、速度も速く上々です。
ありがとうございました。

お礼日時:2007/02/04 18:35

とりあえず、もう一度・・・ここからはアドバイスというより


余計なおせっかいになるかもしれませんデス。^^

エラーチェックをして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は重すぎるので・・)

補足日時:2007/01/31 01:58
    • good
    • 0

アドバイス程度に聞いてください。



そちらの開発環境ではデバッガがあるのでブレークポイント等を挿入したりしてプログラムを止めてみて様子を見るのも一つの手です。

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文のやり方だとメッセージボックスがたくさん出る
のでお勧めしません。
他にも背景の色と文字の色が同じなんていう落ちもあるので、
色々試してください。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

DrawTextの返り値を調べてみたのですが、エラーが返されることはありませんでした。
背景の色と文字の色が同じ、という落ちもなかったみたいです。

いまいちDrawTextメソッドの仕様を詳細に把握してなく、Rectの座標指定ミスかな、とは踏んでいるのですが。
どうしましょうか・・・。

お礼日時:2007/01/30 22:18

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