10

静的コントロールのサイズをコンテンツ サイズに合わせたいので、最初にテキスト コンテンツのサイズを計算する必要があります。サイズを計算する方法を見つけましたGetTextExtentPoint32が、最初に DC のフォントをコントロールのフォントと同じに設定する必要があります。これを行うより良い方法はありますか?スタティック コントロールのフォントを 1 回設定しましたが、おそらく DC のフォントを 2 回目に設定する必要はないと思います。

静的コントロールのテキスト コンテンツのサイズを計算する最良の方法は何ですか? また、静的コントロールのサイズを自動調整するより良い方法はありますか?

4

3 に答える 3

6

あなたはすでにそれを行う正しい方法を理解しているように思えます。を呼び出しGetTextExtentPoint32て、コントロールに含まれるテキストに基づいてコントロールの理想的なサイズを特定し、計算されたサイズにコントロールのサイズを変更します。

これは大変な作業ですが、未加工の Win32 API を使用している場合に発生することです。関数でこれらすべてを抽象化する便利なラッパー ライブラリがありませんControl.AutoSize()。独自の関数を簡単に作成して再利用できますが、Win32 標準コントロールは「自動サイズ」API を公開していません。

フォントに関しては、デバイス コンテキストがコントロールと同じフォントを使用していることを確認する必要があります。そうしないと、間違ったサイズを計算してしまいますただし、新しいデバイス コンテキストを作成し、静的コントロールのフォントのハンドルを要求し、それを新しい DC に選択する必要はありません。代わりに、GetDC関数を使用して静的コントロールの DC を使用し、ハンドルを静的コントロール ウィンドウに渡すことができます。に電話する場合は、作業が終わっGetDCたら必ず に電話するようにしてください。ReleaseDC

GetTextExtentPoint32ただし、計算するサイズの精度を妨げる可能性がある関数のいくつかの注意事項に注意してください。

  • クリッピングを無視します。
  • 高さを計算するときに、改行 ( \n) または改行( )は考慮されません。\r\n
  • プレフィックス文字 (文字列の前にアンパサンドが付いているもの) は考慮されず、スタティック コントロールにSS_NOPREFIXstyleがない場合にキーボード ニーモニックを示すために使用されます。
  • 一部のデバイスで自動的に実装されるカーニングを考慮すると、正確な結果が返されない場合があります。

(これはすべてリンクされたドキュメントに記載されていますが、実際にそれを読んだ人はいますか?)

おそらく、より簡単な代替手段は、静的コントロールが既に行っているのと同じ方法でテキストを描画することです。SS_SIMPLEスタイル セット (最適化としてテキストを描画するためにTextOutorを使用する)を持っていない限り、静的コントロールは、設定されている他のコントロール スタイル (参照) を考慮して、適切なパラメーターを指定して関数を呼び出してテキストを描画します。ExtTextOutDrawText

まったく同じことを行うことができDT_CALCRECT、関数への呼び出しにフラグを追加します。これにより、実際にテキストを描画することなくDrawText、指定されたテキストを描画するために必要な四角形の幅と高さが決定されます。

于 2012-07-22T11:45:20.470 に答える
0

私の知る限り、静的制御のオートサイズはありません。あなたはそれを正しくやっています。

  1. GetWinDowText を使用して静的ウィンドウのテキストを取得します
  2. GetDC を使用して、ウィンドウの DC を取得します。
  3. WM_GETFONT を使用してウィンドウのフォントを取得し、そのフォントを DC に選択します。
  4. 文字サイズ計算関数のいずれかを使用して、文字サイズを計算します
  5. 元の dc フォントを復元する
  6. DC をリリース

正確な結果を得るには、DC に適切なフォントを常に選択する必要があります。また、個人的には、テキストのサイズを計算するために DT_CALCRECT を使用した DrawText を好みます。http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspxを参照してください。

DrawText では、テキストが NULL で終了している場合、文字数を指定する必要はありません。さらに、さまざまな書式設定オプションを組み合わせて計算を調整できます。たとえば、静的制御テキスト内のアンパサンド (&) 文字は、次の文字に下線を引きます。Drawtext を使用するとサイズを適切に計算できますが、GetTextExtentPoint32 にはこれを指定する規定がありません。

于 2012-07-22T11:33:41.510 に答える
0

静的テキスト コントロールを使用するほとんどのウィンドウはダイアログであり、静的コントロールのサイズはダイアログ ユニット (DLU) で表されます。これは、フォントのサイズを大まかに説明します。このように、ダイアログ コントロールは適切なサイズになる傾向があります。

ダイアログを使用していない場合は、 を使用してダイアログの動作を偽造することができますMapDialogRect

それ以外の場合は、使用する必要がありますGetTextExtentPoint32

于 2012-07-22T11:21:04.293 に答える