1

mListBox.ItemHeight と mListBox.CreateGraphics().MeasureString(...) を使用して、CheckedListBox をその内容に合わせて自動的にスケーリングするコードをいくつか書きました。弦の測定値からの出力は少し疑わしいですが、私を本当に困惑させているのは、境界線などにどれだけ追加するかです.

SystemInformation.Border3DSize (= 2) と、ClientSize と Size (= 4) の違いの両方を試しました。ただし、mListBox.ItemHeight * mListBox.Items.Count + 4 を高さにすると、1 ピクセルが小さすぎてスクロールバーが表示されます。

ソースが見つからないように見えるチェックボックスのサイズが考慮されていないため、幅についてはまったく機能しません。

コントロールのサイズはどのように決定すればよいですか?

4

1 に答える 1

1

このような場合、通常、Size 全体ではなく ClientSize を設定する方が簡単です。ItemHeight について注意すべきことの 1 つは、アイテムの余白が含まれていないことです。デフォルト設定で CheckedListBox を使用すると、ItemHeight は 13 でしたが、ItemRectangle プロパティの高さは 15 でした。

だからここに私がしたことがあります。CheckedListBox に 9 つの項目を追加し (最初の項目は残りの項目よりも長かった)、デザイナーが設定したコントロールの既定のサイズを維持しました。次に、フォームのコンストラクターで、次のように ClientSize を設定します。

this.checkedListBox1.ClientSize = new Size(TextRenderer.MeasureText(checkedListBox1.Items[0].ToString(), checkedListBox1.Font).Width + 20, checkedListBox1.GetItemRectangle(0).Height * checkedListBox1.Items.Count);

TextRenderer.MeasureText を使用してテキストを測定していることに注意してください。通常、Graphics.MeasureString よりも優れた値が得られます。デフォルトでは、TextRenderer の測定値には少しのパディングが含まれていました。また、チェックボックスを考慮して 20 ピクセルのパディングも含めました。とにかく、TextRenderer.MeasureText、幅の 20 ピクセルのパディング、および高さの ItemRectangle * Items.Count を使用すると、スクロールバーなしで内容に合わせてサイズ変更された CheckedListBox が得られました。

編集: アイテムの幅が異なる場合、最も長いアイテムに基づいて幅を設定する必要があるため、幅の設定が複雑になる可能性があります。この場合、各アイテムを測定し、どれが最も長いかを追跡する必要があります.

編集 2: わかりましたので、CheckedListBox ソース コードを掘り下げました。デフォルトのサイズ 13 に加えて、チェックボックスの幅と高さに 3 ピクセルのパディングを使用します。ただし、VisualStyles が有効になっている場合CheckBoxRenderer.GetGlyphSizeは、DPI 設定が考慮されるため、使用するサイズを取得するために呼び出します。ほとんどのマシンは 96 DPI に設定されているため、メソッドは引き続き (13,13) のサイズを返します。そのため、項目のテキストを測定する場合、Graphics オブジェクトと CheckBoxState 列挙型を に渡してCheckBoxRenderer.GetGlyphSizeサイズを取得することもできます。州に使用System.Windows.Forms.VisualStyles.CheckBoxState.CheckedNormalしましたが、州が重要かどうかはわかりません。私も試しCheckBoxState.MixedDisabledてみましたが、同じサイズ (13,13) が返されました。

要約すると、 を使用CheckBoxRendererしてチェックボックスのサイズを取得できますが、おそらくパディングを使用する必要があります。これにより、チェックボックスを説明するためにマジック ナンバーをハードコーディングする必要がなくなります。チェックボックスは描画され、実際のコントロールではないため、コントロールのサイズのようにそのサイズを決定することはできません。

ここに CheckedListBox のソースへのリンクがあります。見て損はないでしょう。具体的には、protected override void OnDrawItemメソッドを見てください。

CheckedListBox ソース

于 2013-02-11T00:36:59.163 に答える