0

首先,这不是让 PictureBox 控件透明。这是关于完全不透明的“画布”上的位图透明度。

PictureBox 将始终具有白色背景的 300*300 大小。控件不需要透明度。

我需要的是将透明矩形(或其他任何东西)绘制到图片框上的方法,因此已经存在的任何东西都可以“透过”矩形看到。

说我有以下代码

Bitmap bmp = new Bitmap(300, 300);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 100, 100);
pictureBox.Image = bmp;

这将在白色画布的中间绘制一个红色矩形。现在,我需要包含另一个矩形的图片上的另一个(透明)“层”,但一个是透明的。

我可以试试

Brush brush = new SolidBrush(Color.FromArgb(128, 0, 80, 0));
g.FillRectangle(brush, 50, 50, 200, 200);

由于我通过指定其 alpha = 128 来使用颜色,因此生成的矩形应该是透明的,因此第一个红色矩形应该可以通过另一个绿色矩形看到。

但是,这不会正确发生。我可以看到新绿色矩形后面的红色矩形,但绿色矩形中与红色矩形不重叠的部分将保持完全不透明。但是,如果我将颜色的 alpha 值设置为某个非常小的值(例如 1-5),则整个矩形将看起来是透明的。这在我看来是不正常的 - 5/255 只是半透明,而 128/255 根本不透明......如果之前使用 g.DrawString() 绘制了一个字符串,则该字符串要么显示在后面绿色矩形或不是,取决于透明度。例如,如果 Alpha 大于或等于(大约)40,则字符串根本不可见,如果小于 40,则会显示,对于较小的 alpha 值更可见,直到 alpha = 0。

这个画笔(从 Argb 颜色创建时)是如何应用的?我错过了什么吗?对我来说,设置透明画笔似乎使背景“更明显”,而不是设置对象“不那么明显”。

感谢您对建议的任何回复。

[编辑]似乎我在应用程序逻辑中有一个讨厌的错误,所以绘图程序发生在一个循环中,所以当我积累一定数量的透明矩形时,它们变得越来越粗。

代码从循环中取出后可以正常工作。

我的错。

4

1 回答 1

0

替代文字 http://lh4.ggpht.com/_1TPOP7DzY1E/S02ivAoGgTI/AAAAAAAAC6s/ZQvZQ5GdwSU/s800/Capture4.png

由以下代码完成:

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap bmp = new Bitmap(300, 300);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(new SolidBrush(Color.White), 0, 0, 300, 300);
        g.FillEllipse(new SolidBrush(Color.Blue), 25, 25, 100, 200);
        g.FillRectangle(new SolidBrush(Color.Red), 100, 100, 300, 100);
        g.DrawString("this is a STRING", SystemFonts.DefaultFont, 
            Brushes.Black, new Point(150, 150));
        pictureBox1.Image = bmp;

        Brush brush = new SolidBrush(Color.FromArgb(40, 0, 80, 0));
        g.DrawRectangle(Pens.Black, 50, 50, 200, 200);
        g.FillRectangle(brush, 50, 50, 200, 200);
    }

如您所见,绿色部分不是不透明的……字符串完全可见。

对我来说,设置透明画笔似乎使背景“更明显”,而不是设置对象“不那么明显”。

背景“更明显”和对象“不那么明显”是一回事......

于 2010-01-13T10:16:06.390 回答