我制作了一个ListBox。
ListBox中有图像和文字,如图片。
我想在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);
}
答案 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);