c # - Hvordan overstyrer jeg malingsmetoden for en Winforms kontrol for at gøre det maling til en tekstur?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at integrere Winforms med et SharpDX-projekt, for at bruge Winforms (og til sidst WPF via HostElement) i min 3D-app.


Jeg skal oprette eller konfigurere en kontrol eller form sådan, at jeg kan:


en. Gend det til en tekstur (som jeg kan vise som en sprite *)

b. Filtrer dens indgang for at fjerne mus/tastaturhændelser, når kontrollen ikke er aktiv.


Jeg har prøvet underklasse Control og Form for at tilsidesætte OnPaint og OnPaintBackground, men disse har ingen indflydelse på børnenes kontrol - eller for så vidt formularerne grænser (og selvom de gjorde det, er de ikke tilstrækkelige alene som jeg stadig er tilbage med et hvidt firkant, hvor jeg antager, at 'forældre' er blevet tegnet).


Hvordan kan jeg stoppe et Kontrol eller Form maleri til skærmen og i stedet kun tegne en bitmap? (Er der nogen måde jeg kan tilsidesætte Graphics før træet er malet for eksempel?)


* Det skal gøres på denne måde (i modsætning til at lade kontrollen gøre på skærmen), da Winforms ikke understøtter ægte gennemsigtighed, så jeg skal klippe farvekodede pixels i min pixel shader.


(For at bekræfte, mener jeg ikke specifikt en DirectX-tekstur - jeg er tilfreds med (faktisk foretrækker) en simpel System.Drawing Bitmap)

Bedste reference


Her er en måde at begynde at tænke på:



  • Opret en afledt kontrolklasse, så vi kan udsætte InvokePaint, som er beskyttet

  • Ring til vores brugerdefinerede metode for at få kontrolens image

  • Testformularen har brug for en billedboks og en forekomst af 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);
        }
    }
}