¿Cómo anulación el método de pintura de un control de WinForms para que pinte a una textura?

StackOverflow https://stackoverflow.com/questions/9399945

Pregunta

Estoy tratando de integrar WinForms con un proyecto SharpDX, para usar WinForms (y eventualmente WPF a través del HostElement) en mi aplicación 3D.

Necesito crear o configurar un control o forma de tal manera que pueda:

una. Renderelo a una textura (que puedo mostrar como un sprite*)
b. Filtre su entrada para eliminar eventos de mouse/teclado cuando el control no está activo.

He intentado subclasificar el control y la forma, para anular el Paint y el Paintbackground, pero estos no tienen ningún efecto en los controles de los niños, o en el caso de los Bordes de las Formularios (e incluso si lo hicieron, no son suficientes por su cuenta. Se ha dibujado un cuadrado blanco donde supongo que el 'padre' ha sido dibujado).

¿Cómo puedo detener una pintura de control o forma en la pantalla y, en cambio, dibujar solo para un mapa de bits? (¿Hay alguna forma de anular los gráficos antes de que el árbol esté pintado, por ejemplo?)

*Debe hacerse de esta manera (en lugar de dejar que el control renderice a la pantalla) ya que WinForms no admite la verdadera transparencia, por lo que necesito recortar píxeles codificados en color en mi sombreador de píxeles.

(Para confirmar, no me refiero a una textura DirectX específicamente: estoy contento con (de hecho, preferiría) un sistema simple. Drawing Bitmap)

¿Fue útil?

Solución

Aquí hay una forma de comenzar a hacerlo:

  • Cree una clase de control derivada para que podamos exponer InvokePaint que está protegida
  • Llame a nuestro método personalizado para obtener la imagen del control
  • El formulario de prueba necesita un cuadro de imagen y una instancia de 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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top