none
GetDrawingEffect()でめちゃくちゃな値が返る RRS feed

  • 質問

  • エフェクトを何も設定しない状態でGetDrawingEffect()を呼び出すと、drawingEffectにはNULLが設定されますが、range

    にはめちゃくちゃな値が設定されます

    (文字列の長さが設定されるのが本来の動作だと思います)

    これを回避する方法はないでしょうか

    IDWriteFactory* pDWriteFactory;
    if (SUCCEEDED(hr))
    {
    	hr = DWriteCreateFactory(
    		DWRITE_FACTORY_TYPE_SHARED,
    		__uuidof(IDWriteFactory),
    	reinterpret_cast<IUnknown**>(&pDWriteFactory)
    	);
    }
    
    IDWriteTextFormat *pTextFormat;
    float dpisize = Util::PointToDpiSize(point);
    pDWriteFactory_->CreateTextFormat(
    	"MS Gothic",
    	NULL,
    	DWRITE_FONT_WEIGHT_REGULAR,
    	DWRITE_FONT_STYLE_NORMAL,
    	DWRITE_FONT_STRETCH_NORMAL,
    	dpisize,
    	L"",
    	&pTextFormat
    );
    
    IDWriteTextLayout* pTextLayout;
    WCHAR* str = "こねこねこね";
    
    hr = pDWriteFactory_->CreateTextLayout(
    	str,
    	wcs_len(str),
    	pTextFormat,
    	100,
    	100,
    	&pTextLayout
    );
    
    DrawingEffect* drawingEffect;
    DWRITE_TEXT_RANGE range;
    pTextLayout->GetDrawingEffect(0,reinterpret_cast<IUnknown **>(&drawingEffect),&range);


    2012年3月7日 8:47

回答

  • range をあなたのコードで初期化していませんよね?

    GetDrawingEffect を呼び出す前の段階で未定義の値になっていませんか?
    そして、GetDrawingEffect が単に書き換えないだけではありませんか?
    (Debug ビルドの場合は 0 になるかもしれませんが、Release ビルドではその保障はなかったはず)

    単純に DWRITE_TEXT_RANGE range の行で値を代入しておいてから呼び出せば事足りるかもしれません。
    なお、この例のコードに限らず、C/C++ のローカル変数は初期化する癖をつけておいた方が安全だと思っています。

    # DWRITE_TEXT_RANGE range = {0, 0}; あたりかな。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答の候補に設定 山本春海 2012年3月23日 8:20
    • 回答としてマーク 山本春海 2012年3月27日 8:51
    2012年3月7日 14:01
    モデレータ

すべての返信

  • range をあなたのコードで初期化していませんよね?

    GetDrawingEffect を呼び出す前の段階で未定義の値になっていませんか?
    そして、GetDrawingEffect が単に書き換えないだけではありませんか?
    (Debug ビルドの場合は 0 になるかもしれませんが、Release ビルドではその保障はなかったはず)

    単純に DWRITE_TEXT_RANGE range の行で値を代入しておいてから呼び出せば事足りるかもしれません。
    なお、この例のコードに限らず、C/C++ のローカル変数は初期化する癖をつけておいた方が安全だと思っています。

    # DWRITE_TEXT_RANGE range = {0, 0}; あたりかな。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答の候補に設定 山本春海 2012年3月23日 8:20
    • 回答としてマーク 山本春海 2012年3月27日 8:51
    2012年3月7日 14:01
    モデレータ
  • あーなるほど

    あらかじめ初期化しておくという手がありましたか

    個人的にはエフェクトが何も適用されていなくても範囲を返すようにしてほしいのですが、どうも、そういう仕様ではないのでその方法で対処しておきたいと思います

    (エフェクトを適用した状態でエフェクトが適用されてないインデックスを指定して呼び出すと、ちゃんと範囲が返るので、バグのような気もしなくもないのですが…この手の報告ってどこですればいいんでしょうか)

    2012年3月7日 14:07