заполненная резинка в приложении Winforms - PullRequest
6 голосов
/ 14 января 2010

как я могу нарисовать резинку с нулевой непрозрачностью поверх формы с непрозрачностью 0,3? (Резинка сделана по примеру Microsoft


Обновление:

Мне нужна эта резинка, чтобы она работала как маска. Если вы используете Jing или любой другой инструмент для создания снимков экрана, вы увидите ТОЧНО, что мне нужно делать, когда вы пытаетесь сделать снимок экрана: экран становится полупрозрачным, а когда вы делаете выбор, вы увидите выбор прозрачности 0

Ответы [ 4 ]

7 голосов
/ 16 января 2010

Это тот дроид, которого вы искали?

    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
    }

    bool mouseDown = false;
    Point mouseDownPoint = Point.Empty;
    Point mousePoint = Point.Empty;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        mouseDown = true;
        mousePoint = mouseDownPoint = e.Location;
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        mouseDown = false;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        mousePoint = e.Location;
        Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (mouseDown)
        {
            Region r = new Region(this.ClientRectangle);
            Rectangle window = new Rectangle(
                Math.Min(mouseDownPoint.X, mousePoint.X),
                Math.Min(mouseDownPoint.Y, mousePoint.Y),
                Math.Abs(mouseDownPoint.X - mousePoint.X),
                Math.Abs(mouseDownPoint.Y - mousePoint.Y));
            r.Xor(window);
            e.Graphics.FillRegion(Brushes.Red, r);
            Console.WriteLine("Painted: " + window);
        }
    }
1 голос
/ 03 февраля 2010

Я использовал код, который @Dearmash предоставил в утилите захвата экрана, которая поставляется с моим приложением с открытым исходным кодом BugTracker.NET. Приложение не очень большое, поэтому, если вы делаете снимки экрана, это может быть хорошей отправной точкой. Больше информации здесь:

http://ifdefined.com/blog/post/Screen-capture-utility-in-C-NET.aspx

1 голос
/ 14 января 2010

При рисовании необходимо использовать частично непрозрачный цвет:

Обновлена ​​строка из связанной статьи, в методе MyDrawReversibleRectangle:

ControlPaint.DrawReversibleFrame( rc, Color.FromArgb(80, 120, 120, 120), FrameStyle.Dashed );
0 голосов
/ 14 января 2010

Просто используйте дополнительную форму, не отображая ее на панели задач или других опциях формы. Установите область формы, которая показывает только резинку. И убедитесь, что оба окна ведут себя так, как если бы это было одно окно (перемещение, закрытие, ...). Я знаю, что это не элегантный способ, но с небольшой работой это может дать хорошие результаты. Вы можете убедиться, что форма находится сверху в иерархии форм и все еще не получает фокус.

Если установить регион в хорошем состоянии, все события перейдут в другую форму.

Так я решил эквивалентную проблему (я не говорю, что это хорошее решение, но оно работает)

...