C# 在自定义组合框中居中显示文本

C# 在自定义组合框中居中显示文本,c#,winforms,C#,Winforms,我需要像这样自定义我的组合框 我的代码运行良好。但它有两个问题: 1.当我最小化窗口时,文本向左移动,如下所示 2.当另一个窗口覆盖我的应用程序时,背景变为绿色 这是我的密码: //DrawItem protected override void OnDrawItem(DrawItemEventArgs e) { e.DrawBackground(); e.DrawFocusRectangle(); if (e.Index >= 0) { Graph

我需要像这样自定义我的组合框


我的代码运行良好。但它有两个问题:
1.当我最小化窗口时,文本向左移动,如下所示


2.当另一个窗口覆盖我的应用程序时,背景变为绿色

这是我的密码:

//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);
      }
   }
}

那么有什么问题吗?

您可以使用
图形。测量
获取要绘制的字符串的大小,然后决定从何处开始绘制字符串:

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);

您可以使用
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);

我发现问题是下拉状态。在设置笔刷之前,我必须检查下拉状态

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);
} 

我发现问题是下拉状态。在设置笔刷之前,我必须检查下拉状态

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);
} 

你的代码没有编译;至少有两个接近的卷发不见了。请只发布真实代码
e.Bounds
和/或
ClientRectangle
是否确实为箭头留出了空间?除此之外:错误情况听起来很有趣。。在最小化之后,我假设恢复之后,对齐/放置是否仍然错误?对不起,我的错误。是的,我认为问题是e边界。组合框大小为135、34和e。Bouds为133。最小化窗口时,e.边界为112。e、 缩小时边界会调整大小。如何修复?@tawyor代码无法编译;至少有两个接近的卷发不见了。请只发布真实代码
e.Bounds
和/或
ClientRectangle
是否确实为箭头留出了空间?除此之外:错误情况听起来很有趣。。在最小化之后,我假设恢复之后,对齐/放置是否仍然错误?对不起,我的错误。是的,我认为问题是e边界。组合框大小为135、34和e。Bouds为133。最小化窗口时,e.边界为112。e、 缩小时边界会调整大小。如何修复它?@TaWsorry为我的迟到感到抱歉。没有任何变化。我正在寻找修复e.边界和选定项目样式的方法,当窗口关闭时minimize@AshkanMobayen Khiabanisy为我的迟到感到抱歉。没有任何变化。我正在寻找修复e.边界和选定项目样式的方法,当窗口关闭时minimize@AshkanMobayen Khiabani