あなたはすでにそれを行う正しい方法を理解しているように思えます。を呼び出しGetTextExtentPoint32
て、コントロールに含まれるテキストに基づいてコントロールの理想的なサイズを特定し、計算されたサイズにコントロールのサイズを変更します。
これは大変な作業ですが、未加工の Win32 API を使用している場合に発生することです。関数でこれらすべてを抽象化する便利なラッパー ライブラリがありませんControl.AutoSize()
。独自の関数を簡単に作成して再利用できますが、Win32 標準コントロールは「自動サイズ」API を公開していません。
フォントに関しては、デバイス コンテキストがコントロールと同じフォントを使用していることを確認する必要があります。そうしないと、間違ったサイズを計算してしまいます。ただし、新しいデバイス コンテキストを作成し、静的コントロールのフォントのハンドルを要求し、それを新しい DC に選択する必要はありません。代わりに、GetDC
関数を使用して静的コントロールの DC を使用し、ハンドルを静的コントロール ウィンドウに渡すことができます。に電話する場合は、作業が終わっGetDC
たら必ず に電話するようにしてください。ReleaseDC
GetTextExtentPoint32
ただし、計算するサイズの精度を妨げる可能性がある関数のいくつかの注意事項に注意してください。
- クリッピングを無視します。
- 高さを計算するときに、改行 (
\n
) または改行( )は考慮されません。\r\n
- プレフィックス文字 (文字列の前にアンパサンドが付いているもの) は考慮されず、スタティック コントロールに
SS_NOPREFIX
styleがない場合にキーボード ニーモニックを示すために使用されます。
- 一部のデバイスで自動的に実装されるカーニングを考慮すると、正確な結果が返されない場合があります。
(これはすべてリンクされたドキュメントに記載されていますが、実際にそれを読んだ人はいますか?)
おそらく、より簡単な代替手段は、静的コントロールが既に行っているのと同じ方法でテキストを描画することです。SS_SIMPLE
スタイル セット (最適化としてテキストを描画するためにTextOut
orを使用する)を持っていない限り、静的コントロールは、設定されている他のコントロール スタイル (参照) を考慮して、適切なパラメーターを指定して関数を呼び出してテキストを描画します。ExtTextOut
DrawText
まったく同じことを行うことができDT_CALCRECT
、関数への呼び出しにフラグを追加します。これにより、実際にテキストを描画することなくDrawText
、指定されたテキストを描画するために必要な四角形の幅と高さが決定されます。