2016-07-30 6 views
1

Мне нужно настроить мои комбобокс, как показано на рисунке.Текст центра в пользовательском Combobox

enter image description here
Мой код работал fine.But Это с 2 вопроса:
1.the текста двигаться влево, когда я свернуть окно, как показано ниже

enter image description here
2.the фоне поворота на зеленый, когда другое окно закрывает мое приложение.

enter image description here

Вот мой код:

//DrawItem 
protected override void OnDrawItem(DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    e.DrawFocusRectangle(); 
    if (e.Index >= 0) { 
    Graphics g = e.Graphics; 
    Brush brs = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? 
    new SolidBrush(SelectedBackColor) : new SolidBrush(e.BackColor); 
    g.FillRectangle(brs, e.Bounds); 
    using (StringFormat sformat = new StringFormat()) { 
    sformat.LineAlignment = StringAlignment.Center; 
     sformat.Alignment = StringAlignment.Center; 
     e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, sformat); 
} 
//paint 
protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    if (index >= 0) { 
     using (Brush br = new SolidBrush(this.ForeColor)) { 
     StringFormat sformat = new StringFormat(); 
     sformat.LineAlignment = StringAlignment.Center; 
     sformat.Alignment = StringAlignment.Center; 
     e.Graphics.DrawString(this.Text, this.Font, br, this.ClientRectangle, sformat); 
     e.Graphics.DrawImage(Resource1.arrow,this.ClientRectangle.Right - 34, 0,32,32); 
     } 
    } 
} 

так, что не так?

+0

ваш код не компилируется; по крайней мере два закрывающих колена отсутствуют. Пожалуйста, напишите только реальный код! - Действительно ли 'e.Bounds' и/или' ClientRectangle' фактически оставляют место для стрелки? Кроме этого: Ошибочные ситуации звучат забавно. После минимизации и, я полагаю, восстановление, выравнивание/размещение остаются неправыми? – TaW

+0

извините за мою ошибку. Я думаю, проблема в том, что это e.Bounds. Размер Combobox равен 135, 34 и e.Bouds равен 133. При минимизации окна e.Bounds - 112. e.Bounds изменяет размер при минировании. Как это исправить? @TaW – Jandy

ответ

0

Вы можете использовать Graphics.MeasureString, чтобы получить размер строки рисовать, а затем решить, где начать рисовать строку:

SizeF size = new SizeF(); 
size = e.Graphics.MeasureString(this.Text, this.Font); 
PointF DrawPoint = new PointF((this.Width - size.Width)/2, (this.Height - size.Height)/2); 
e.Graphics.DrawString(this.Text, this.Font, br, DrawPoint, sformat); 
+0

извините за мое опоздание. Никаких изменений. Я ищу способ исправить e.Bounds и выбранный стиль элемента при минимизации окна @ Ashkan Mobayen Khiabani – Jandy

0

я узнал, проблема в том, DropDown state.I должны проверить DroppedDown перед set Brush.

protected override void OnDrawItem(DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    if (e.Index >= 0 && DroppedDown) { 
    Brush brs = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? 
    new SolidBrush(SelectedBackColor) : new SolidBrush(Color.Red); 
    e.Graphics.FillRectangle(brs, e.Bounds); 
    using (StringFormat sformat = new StringFormat()) { 
     sformat.LineAlignment = StringAlignment.Center; 
     sformat.Alignment = StringAlignment.Center; 
     e.Graphics.DrawString(this.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, sformat); 
}