Come faccio a prevalere sul metodo di verniciatura di un controllo di Winforms per farlo dipingere in una trama?

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

Domanda

Sto cercando di integrare Winforms con un progetto SharpDX, al fine di utilizzare WinForms (e infine WPF tramite osello) nella mia app 3D.

Devo creare o configurare un controllo o una forma in modo tale che io possa:

un. Renderlo a una trama (che posso visualizzare come sprite*)
b. Filtra il suo input per rimuovere gli eventi del mouse/tastiera quando il controllo non è attivo.

Ho provato il controllo e la forma della sottoclasse, per scavalcare l'OnPaint e OnPaintBackground, ma questi non hanno alcun effetto sui controlli del bambino - o per questo motivo le forme borcano (e anche se lo hanno fatto non sono sufficienti da soli perché sono ancora lasciato con Una piazza bianca in cui presumo che il "genitore" sia stato disegnato).

Come posso fermare un controllo o formare la pittura sullo schermo e invece disegnare solo su una bitmap? (C'è un modo per sovrascrivere la grafica prima che l'albero sia dipinto, per esempio?)

*Deve essere fatto in questo modo (invece di consentire il rendering di controllo sullo schermo) poiché Winforms non supporta la vera trasparenza, quindi devo tagliare i pixel codificati a colori nel mio shader pixel.

(Per confermare, non intendo una trama DirectX in particolare: sono contento di (in effetti preferirebbe) un semplice sistema.

È stato utile?

Soluzione

Ecco un modo per iniziare a farlo:

  • Crea una classe di controllo derivata in modo da poter esporre InvokePint che è protetto
  • Chiama il nostro metodo personalizzato per ottenere l'immagine del controllo
  • Il modulo di prova ha bisogno di una casella di immagini e di un'istanza di 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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top