【问题标题】:Drawing animation on combobox在组合框上绘制动画
【发布时间】:2012-08-08 21:38:37
【问题描述】:

关于如何在组合框中绘制图像,已有很多已回答的问题和示例。但是我还没有找到任何如何在组合框中绘制动画的示例。

我使用的gif动画是(透明的):

而我想要达到的结果是这样的:

我使用的是 Windows 窗体和 .Net 3.5。
我想,实现这一目标的所有方法都是:
1. 在 ComboBox 的 DrawItem 处理程序中使用 Graphics.DrawImage。但是图像是静态绘制的,没有动画。
2. 使用 PictureBox 显示动画,然后以某种方式调整其大小并放置在 ComboBox 上。

对于第二个灵魂,我使用了以下代码:

pictureBox1 = new PictureBox();
pictureBox1.Image = Resource.myImage;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
//3 is used just for try to fit image into "white" area of ComboBox
pictureBox1.ClientSize = new Size(comboBox1.Size.Height-3, comboBox1.Size.Height-3);
pictureBox1.BackColor = System.Drawing.Color.Transparent;
pictureBox1.Dock = DockStyle.Left;
pictureBox1.Parent = this.comboBox1;
pictureBox1.Enabled = true;
pictureBox1.Visible = true;

但结果我得到了这个:

它是动画的,但图片框是在 ComboBox 边缘绘制的,看起来很糟糕。

那么,谁能给我一个建议或帮助来实现这个目标?

谢谢。

编辑:
我的最终解决方案:

pictureBox1 = new PictureBox();
pictureBox1.Image = Resource1.myImage;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.ClientSize = new Size(comboBox1.Size.Height - SystemInformation.Border3DSize.Height,  comboBox1.Size.Height - (2 * SystemInformation.Border3DSize.Height));
pictureBox1.BackColor = System.Drawing.Color.Transparent;
pictureBox1.Location = new Point(SystemInformation.Border3DSize.Width, SystemInformation.Border3DSize.Height);
pictureBox1.Parent = this.comboBox1;
pictureBox1.Enabled = true;
pictureBox1.Visible = true;

谢谢大家!你帮了我很多!

【问题讨论】:

  • 您是否尝试过设置 PictureBox 的 Size 而不是 ClientSize?
  • @hometoast 是的,我试过了,但没有明显的变化。

标签: c# winforms animation combobox picturebox


【解决方案1】:

试试这个:

            pictureBox1 = new PictureBox();
            pictureBox1.Image = Resource.myImage;
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            //2 is used just for try to fit image into "white" area of ComboBox
            pictureBox1.ClientSize = new Size(comboBox1.Size.Height - 2, comboBox1.Size.Height - 2);
            pictureBox1.BackColor = System.Drawing.Color.Transparent;
            pictureBox1.Left = 1;
            pictureBox1.Top = 1;
            pictureBox1.Parent = this.comboBox1;
            pictureBox1.Enabled = true;
            pictureBox1.Visible = true;

【讨论】:

  • 值得注意的是:您可以通过SystemInformation.BorderSize获得边框的大小(而不是试图猜测它)
  • 太棒了!非常感谢!我忘记了左和上,真丢脸! (我是 GUI 编程新手,所以复杂的 UI 对我来说简直就是地狱)
【解决方案2】:

删除设置“Dock”属性的代码。设置此项会导致布局管理器忽略大小/位置设置。

改为将Size 属性和Location 属性设置为特定值。

类似:

pictureBox3.Size = new Size(comboBox1.Size.Height-3, comboBox1.Size.Height-3);
pictureBox3.Location = new Point(0, 3);

您可能需要调整这些以获得所需的准确位置。

【讨论】:

  • @ekholm 这并不意味着用户不能尝试提供答案。
【解决方案3】:

它可能有点小,但如果你将组合框的大小设置为pictureBox1.Size = new Size(comboBox1.ItemHeight, comboBox1.ItemHeight),它会很合适。

或者将高度和宽度设置为2*SystemInformation.3DBorderSize

【讨论】:

  • 感谢您的回答!我已经尝试过您的解决方案,但 ItemHeight 太小(与 ComboBox.Size.Height 的值为 21 相比,它的值为 13)。但无论如何感谢 SystemInformation.Border3DSize,我在最终解决方案中使用了它!
猜你喜欢
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多