Как переопределить метод рисования элемента управления Winforms, чтобы сделать его текстурой? - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь интегрировать Winforms с проектом SharpDX, чтобы использовать Winforms (и в конечном итоге WPF через HostElement) в моем 3D-приложении.

Мне нужно создать или настроить элемент управления или форму так, чтобы яможно:

а.Визуализируйте его в текстуру (которую я могу отобразить как спрайт *)
b.Отфильтруйте входные данные, чтобы удалить события мыши / клавиатуры, когда элемент управления не активен.

Я попытался создать подклассы Control и Form, чтобы переопределить OnPaint и OnPaintBackground, но они не влияют на дочерние элементы управления - или в этом отношенииграницы форм (и даже если они это сделали, их недостаточно, поскольку у меня все еще остается белый квадрат, где, как я полагаю, нарисован «родитель»).

Как я могу остановитьсярисование элемента управления или формы на экране и рисование только на растровом изображении? (Есть ли какой-то способ переопределить графику, например, до того, как дерево будет нарисовано?)

* Это необходимо сделатьтаким образом (вместо того, чтобы позволить элементу управления отображаться на экране), поскольку Winforms не поддерживает истинную прозрачность, поэтому мне нужно обрезать пиксели с цветовой кодировкой в ​​моем пиксельном шейдере.

(Чтобы подтвердить, я нея имею в виду текстуру DirectX - я доволен (на самом деле предпочел бы) простой растровой картой System.Drawing)

1 Ответ

3 голосов
/ 22 февраля 2012

Вот один из способов начать:

  • Создайте производный класс управления, чтобы мы могли предоставить InvokePaint, защищенный
  • Вызовите наш пользовательский метод, чтобы получить изображение элемента управления
  • Тестовой форме требуется графическое окно и экземпляр Mybutton


using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1() { InitializeComponent(); }

        private void Form1_Load(object sender, EventArgs e)
        {
            // create image to which we will draw
            var img = new Bitmap(100, 100);

            // get a Graphics object via which we will draw to the image
            var g = Graphics.FromImage(img);

            // create event args with the graphics object
            var pea = new PaintEventArgs(g, new Rectangle(new Point(0,0), new Size(100,100)));

            // call DoPaint method of our inherited object
            btnTarget.DoPaint(pea);

            // modify the image with algorithms of your choice...

            // display the result in a picture box for testing and proof
            pictureBox.BackgroundImage = img;
        }
    }

    public class MyButton : Button
    {
        // wrapping InvokePaint via a public method
        public void DoPaint(PaintEventArgs pea)
        {
            InvokePaint(this, pea);
        }
    }
}
...