2

リストボックス項目にいくつかの視覚的な変更を加えたいので、DrawMode を "OwnerDrawFixed" に設定します。テキストを垂直方向に項目の中央にしたいので、これを行うことで簡単になりました。

private void listTypes_DrawItem(object sender, DrawItemEventArgs e)
{
   e.DrawBackground();
   e.Graphics.DrawString(listTypes.Items[e.Index].ToString(),
                e.Font, Brushes.Black, e.Bounds.Left, e.Bounds.Top + e.Bounds.Height/4
                , StringFormat.GenericDefault);  
   e.DrawFocusRectangle();  
}

しかし、テキストを水平に中央に配置するには、テキストの幅を知る必要があります。それを取得する方法、またはこれを行うためのより良い方法があります

4

2 に答える 2

3

コードで試すことができます

    void listTypes_DrawItem(object sender, DrawItemEventArgs e)
    {
        ListBox list = (ListBox)sender;
        if (e.Index > -1)
        {
            object item = list.Items[e.Index];
            e.DrawBackground();
            e.DrawFocusRectangle();
            Brush brush = new SolidBrush(e.ForeColor);
            SizeF size = e.Graphics.MeasureString(item.ToString(), e.Font);
            e.Graphics.DrawString(item.ToString(), e.Font, brush, e.Bounds.Left + (e.Bounds.Width / 2 - size.Width / 2), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2)); 
        }
    }
于 2012-09-08T12:47:28.033 に答える
2

TextRenderer.DrawText() を使用して、フォーム内の他のコントロールによってテキストがレンダリングされる方法とテキストの外観を一致させる必要があります。これにより、Rectangle を受け入れ、テキストをその長方形内の中央に配置するオーバーロードが既にあります。e.Bounds を渡すだけです。選択したアイテムに別の色を使用して、アイテムの状態にも注意を払う必要があります。このような:

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e) {
        e.DrawBackground();
        if (e.Index >= 0) {
            var box = (ListBox)sender;
            var fore = box.ForeColor;
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) fore = SystemColors.HighlightText;
            TextRenderer.DrawText(e.Graphics, box.Items[e.Index].ToString(),
                box.Font, e.Bounds, fore);
        }
        e.DrawFocusRectangle();
    }
于 2012-09-08T13:43:48.720 に答える