如何在c#中绘制透明图像

时间:2017-07-12 05:57:48

标签: c# listbox transparent

我制作了一个ListBox。

ListBox中有图像和文字,如图片。

enter image description here

我想在listbox上绘制透明图像。当mousemove。

clearTmpStatus

这是我的代码。

但我有一个问题。

虽然我输入了相同的透明度值,但每张图片的透明度都不同。

我该如何解决?

++添加代码

我使用滚动条。

private void ListBox_DrawItem(object sender, DrawItemEventArgs e)
{
    int iWidth = image.Width;
    int iHeight = image.Height;

    ImageAttributes attr = new ImageAttributes();

    ColorMatrix matrix = new ColorMatrix();
    matrix.Matrix33 = 0.8f;
    attr.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

    e.Graphics.DrawImage(image, new Rectangle(0, 0 iWidth, iHeight), 0, 0, iWidth, iHeight, GraphicsUnit.Pixel, attr);
}

1 个答案:

答案 0 :(得分:0)

当所有者提取ListBox时,了解如何调用DrawItem事件非常重要。

它会在几个场合调用,总是只引用它所要求的Item

但是为了获得更好的效果并非所有场合都会让ListBox绘制全部其项目!

您要绘制的区域是e.Bounds矩形。

您仍然可以绘制整个ListBox,但由于事件通常连续多次被调用,您可能会遇到一些问题。其中一个问题是透明图纸,因为它们会堆叠并变得越来越透明!

让我们看几个案例:

  • Refresh期间,将绘制所有可见项目
  • 选择 Item 已选择项目时,所有先前选定的项目将是绘制

因此,在初始显示后,每个项目都会被一次绘制,但在选择item3然后item1后,前三个项目将被绘制不同的时间: item1:2x,item2:1x和item3:3x。

工作重点通常是在绘制项目之前创建一个干净的石板,可能是这样的:

e.Graphics.FillRectangle(Brushes.White, e.Bounds);

然而,对于您在项目范围内绘制的任何内容,这都不会很好!

您在Item上绘制的任何图像都应该尊重边界。您可以将图像压缩到项目的边界:

e.Graphics.DrawImage(image, e.Bounds, 0, 0, iWidth, iHeight, GraphicsUnit.Pixel, attr);

或者你可以只画一张更大的图像,也许是这样的:

e.Graphics.DrawImage(image, e.Bounds, 
                            0, e.Index * e.Bounds.Height, iWidth, e.Bounds.Height, 
                            GraphicsUnit.Pixel, attr);