« GetTextExtentExPoint | トップページ | GetTextExtentExPointの締めくくり »

2007年1月10日 (水)

GetTextExtentExPointの続き

で、続きである。みんな同じ事を考えると思うが、ワードラップ以外の目的でもこのGetTextExtentExPointが使えないかな?と思ったのである。例えば、非常に長い文字列をワードラップをせずに描画する場合を考えてみよう(文字数64K超などの)。WindowsのGDIはクリッピング領域外に対する描画は行わないので、何も考えずに、長い文字列をExtTextOutに渡しても、見た目上は問題ない。問題はパフォーマンスなのである。パフォーマンスをとって見るとわかるが、かなり速度に違いがでる。ExtTextOutへの呼び出しは文字列のポインタを渡すので、文字列が巨大であろうとなかろうと、文字列の受け渡しに関するパフォーマンスの違いはほとんど無いことがわかる。

要は、クリッピングに時間がかかってるのである。Windows自体内部でどのようにクリッピングを行っているのかわからないが、文字数64K超の文字列なんて、あきらかにそのほんの一部しか描画されないので、ExtTextOutの呼び出しの前にこのGetTextExtentExPointを使用し、文字列の表示されない部分を切り捨てて、自前でクリッピングを行なおうと思ったのである。

で、いきなり問題につきあたったのである。その問題とは、GetTextExtentExPointの最後の引数であるlpSizeである。これは、GetTextExtentPoint32で取得する文字列の寸法と全く同じものが返されるのであるが、日本語のMSDNによるとNULLを指定できると書いてある。が、実際にはNULLを指定できず、英語のMSDNには、NULLを指定できないと書いてあったのである。つまり、NULLを指定できないって事は、GetTextExtentExPointの呼び出し時に、毎回律儀に文字列全体の寸法を計算しているのである。このAPIをlpnFitの値だけを利用して表示されない部分の切り捨てのために使おうと思っていたので、最後の引数lpSizeにNULLを指定できて、NULLが指定されたとき、lpnFitが求まったら、そこでAPIに処理を打ち切ってもらいたかったのである。

と、今日はいきなり問題につきあたったので、次回に続く。

« GetTextExtentExPoint | トップページ | GetTextExtentExPointの締めくくり »

Windows」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651900

この記事へのトラックバック一覧です: GetTextExtentExPointの続き:

« GetTextExtentExPoint | トップページ | GetTextExtentExPointの締めくくり »

自作ソフトウェア

無料ブログはココログ

メモ