C # Прозрачный сплошной прямоугольник, нарисованный на 50% непрозрачной форме - PullRequest
2 голосов
/ 01 апреля 2012

Я пытался имитировать Windows 7 Snipping Tool, чтобы он перекрывал экран полупрозрачным серым слоем, который становится полностью прозрачным внутри области выделения. Я подошел довольно близко. Я отображаю непрозрачную серую форму без полей 50%, которая покрывает весь экран и имеет прозрачный ключ цвета фуксии. Затем поверх этой формы я рисую 2 прямоугольника. Сплошной цвет фуксии для прозрачности и еще один прямоугольник для красной рамки. Это работает, но только если я делаю одну из трех вещей, ни одна из которых не является опцией.

  1. Отключить двойную буферизацию, которая заставляет форму мерцать при рисовании
  2. Изменить цветовой режим рабочего стола на 16 бит с 32 бит
  3. Сделать форму 100% непрозрачной

Вот мой код. Любое предложение о том, как заставить это работать?

public partial class frmBackground : Form
{
    Rectangle rect;

    public frmBackground()
    {
        InitializeComponent();

        this.MouseDown += new MouseEventHandler(frmBackground_MouseDown);
        this.MouseMove += new MouseEventHandler(frmBackground_MouseMove);
        this.Paint += new PaintEventHandler(frmBackground_Paint);
        this.DoubleBuffered = true;
        this.Cursor = Cursors.Cross;
    }

    private void frmBackground_MouseDown(object sender, MouseEventArgs e)
    {
        Bitmap backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
        rect = new Rectangle(e.X, e.Y, 0, 0);
        this.Invalidate();
    }

    private void frmBackground_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);

        this.Invalidate();
    }

    private void frmBackground_Paint(object sender, PaintEventArgs e)
    {
        Pen pen = new Pen(Color.Red, 3);
        e.Graphics.DrawRectangle(pen, rect);

        SolidBrush brush = new SolidBrush(Color.Fuchsia);
        e.Graphics.FillRectangle(brush, rect);
    }
}

1 Ответ

0 голосов
/ 13 марта 2013

вы можете использовать

Brush brush = new SolidBrush(Color.FromArgb(alpha, red, green, blue))

, где альфа изменяется от 0 до 255, поэтому значение 128 для вашей альфы даст вам 50% непрозрачности.

это решение было найдено в этот вопрос

...