Фоновое изображение элемента управления прослушивается - PullRequest
0 голосов
/ 27 февраля 2019

Я выполнил мини-тестовую программу для создания прототипа способа перетаскивания изображения (справа) (с помощью кнопки в качестве опоры) на панель (левая часть) (текущая фоновая буква панели предназначена только дляцель тестирования) и переместить его по периметру панели.

image2

Изображение на движущемся элементе управления рисуется вручную во время события Paint:

    void bouton_Paint( object sender, PaintEventArgs e )
    {
        Button but = sender as Button;

        Bitmap img = new Bitmap(WindowsFormsApplication1.Properties.Resources.triaxe);
        img.MakeTransparent(Color.White);
        e.Graphics.DrawImage(img, 0, 0, but.Width, but.Height);
    }

Как вы можете видеть ниже, во время процесса перемещения фон перемещенного элемента управления размыт.Так что это не очень красиво

image

Чтобы сделать процесс более плавным?

Спасибо.

Это код для перемещения моего триакса в форме:

    void bouton_MouseUp( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;

        button.Tag = false;
        button.BackColor = Color.Transparent;
    }

    void bouton_MouseMove( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;
        if (button.Tag != null && (bool)button.Tag == true)
        {
            button.Left += e.X - MouseDownLocation.X;
            button.Top += e.Y - MouseDownLocation.Y;
        }
    }

    private Point MouseDownLocation;

    void bouton_MouseDown( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;

        MouseDownLocation = e.Location;
        button.Tag = true;
        button.BackColor = SystemColors.Control;
    }

1 Ответ

0 голосов
/ 28 февраля 2019

Предположим, вы не хотите рисовать графику в одиночку, но хотите, чтобы Control с прозрачностью переместился поверх другой Control.

Вам нужно решить две задачи.:

  1. Winforms плохо поддерживает прозрачность;у вас есть два варианта:

    • Либо пусть система подделает его для вас
    • , либо подделайте сами.

Длясначала достаточно иметь элемент управления с прозрачным задним цветом и Image или BackgroundImage (в зависимости от типа элемента управления) с прозрачностью, а затем nest движущийся элемент управления в фоновом элементе управления.

Для упрощенного теста вы можете добавить if (button.Parent != panel1) button.Parent = panel1; к вашему коду mousedown.Это будет выглядеть странно, но должно отображаться правильно.(Не забудьте сделать Backcolor прозрачным; в вашем коде вы можете сделать его SystemColors.Control.

. Чтобы подделать его самостоятельно, вы будете делать именно то, что делает система:

  • Youполучить целевую поверхность в растровых изображениях (с DrawToBitmap) и затем объединить область, которую движущий элемент в настоящее время покрывает изображением, здесь получение этой области является ключевым.
  • Затем вы можете установить это изображение в качестве фона изображения или нарисовать егона двигатель.

Другая проблема связана с движущимся кодом.Здесь проблема в том, что при перемещении мыши вызывается событие MouseMove, и вы можете перемещать элемент управления.Но, перемещая его, мышь переместится относительно на новое место и событие снова будет вызвано , что приведет к вспыхиванию скачка!

Чтобы избежатьдля этого вы можете проверить числа или , используя флаг или , отменить регистрацию события перемещения перед установкой местоположения и затем повторно зарегистрироваться.

Хорошей идеей также является установка местоположения за один раз вместо двух координат ..: button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);


Имо, вам все равно стоит рассмотреть рисование только графики на Вкл panel.MouseMove и panel.Paint.На panel.MouseUp вы все равно можете добавить Button к panel.Controls прямо здесь.Обе проблемы устраняются, и вы также можете свободно добавлять нужные вам функции.

...