Comment remplacer la méthode de peinture d'un contrôle Winforms pour le faire peindre en une texture?

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

Question

J'essaye d'intégrer Winforms à un projet SharpDX, afin d'utiliser Winforms (et éventuellement WPF via HostElement) dans mon application 3D.

J'ai besoin de créer ou de configurer un contrôle ou un formulaire de telle sorte que je puisse:

a. Rendez-le dans une texture (que je peux afficher en tant que sprite *)
b. Filtrez son entrée pour supprimer les événements souris / clavier lorsque le contrôle n'est pas actif.

J'ai essayé de sous-classer Control et Form, pour remplacer OnPaint et OnPaintBackground mais ceux-ci n'ont aucun effet sur les contrôles enfants - ou d'ailleurs les bordures des formulaires (et même s'ils le faisaient, ils ne sont pas suffisants à eux seuls comme je le suis encore laissé avec un carré blanc où je suppose que le «parent» a été dessiné).

Comment puis-je arrêter une peinture de contrôle ou de formulaire à l'écran et à la place dessiner uniquement sur une image bitmap? (Existe-t-il un moyen de remplacer les graphiques avant que l'arborescence ne soit peinte, par exemple?)

* Cela doit être fait de cette façon (au lieu de laisser le contrôle s'afficher à l'écran) car Winforms ne prend pas en charge la vraie transparence, donc j'ai besoin de découper les pixels codés par couleur dans mon pixel shader.

(Pour confirmer, je ne parle pas spécifiquement d'une texture DirectX - je suis satisfait (en fait préférerais) un simple System.Drawing Bitmap)

Était-ce utile?

La solution

Voici une façon de commencer:

  • Créez une classe de contrôle dérivée afin que nous puissions exposer InvokePaint qui est protégé
  • Appelez notre méthode personnalisée pour obtenir l'image du contrôle
  • Le formulaire de test nécessite une zone d'image et une instance 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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top