2009-11-17 9 views
0

J'ai créé un contrôle utilisant OnPaint et base.OnPaint. Maintenant, je veux que toutes les couleurs soient inversées dans certaines conditions. Mais comment je fais ça? Je sais comment inverser une image, mais comment faire avec un objet Graphics?Inverser les couleurs d'un contrôle

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    MyOwnPaint(e); 

    if(Condition) 
    InvertColors(e); 
} 
+1

Il n'y a pas de question ici. – Lazarus

+0

Par intérêt, pourquoi voulez-vous faire cela? Peut-être qu'il y a une meilleure solution. –

+0

Désolé. Mais maintenant est-ce une question? – magol

Répondre

2

Avant de commencer, je voudrais dire que je suis d'accord avec Xaero sur son point. Il semble que votre objectif visé bénéficierait de la classe ErrorProvider. Cela dit, vous pouvez inverser le contenu d'une zone graphique en utilisant BitBlt via P/Invoke. Voici une fonction qui peut le faire pour vous, mais sans optimisations. Je vais laisser cette partie à vous. Cette fonction utilise des opérations raster pour inverser la zone cible. Un XOR avec une source blanche sur la destination entraîne l'inversion des couleurs à la destination (par valeur logique, pas nécessairement par espace de couleur).

private void InvertGraphicsArea(Graphics g, Rectangle r) 
{ 
    if (r.Height <= 0) { return; } 
    if (r.Width <= 0) { return; } 

    using (Bitmap bmpInvert = GetWhiteBitmap(g, r)) 
    { 
     IntPtr hdcDest = g.GetHdc(); 
     using (Graphics src = Graphics.FromImage(bmpInvert)) 
     { 
      int xDest = r.Left; 
      int yDest = r.Top; 
      int nWidth = r.Width; 
      int nHeight = r.Height; 
      IntPtr hdcSrc = src.GetHdc(); 
      BitBlt(hdcDest, xDest, yDest, nWidth, nHeight, 
        hdcSrc, 0, 0, (uint)CopyPixelOperation.DestinationInvert); 
      src.ReleaseHdc(hdcSrc); 
     } 
     g.ReleaseHdc(hdcDest); 
    } 
} 

Dans la classe qui contient cette fonction utilitaire, vous devez importer System.Runtime.InteropServices et aussi la définition de BitBlt(). De plus, les internes de cette fonction sont un peu plus succincts avec une méthode d'assistance GetWhiteBitmap().

using System.Runtime.InteropServices; 

// ... 

[DllImport("gdi32.dll", 
      EntryPoint="BitBlt", 
      CallingConvention=CallingConvention.StdCall)] 
extern public static int BitBlt(
    IntPtr hdcDesc, int nXDest, int nYDest, int nWidth, int nHeight, 
    IntPtr hdcSrc, int nXSrc, int nYSrcs, uint dwRop); 

private Bitmap GetWhiteBitmap(Graphics g, Rectangle r) 
{ 
    int w = r.Width; 
    int h = r.Height; 

    Bitmap bmp = new Bitmap(w, h); 
    using (Graphics gTmp = Graphics.FromImage(bmp)) 
    { 
     gTmp.Clear(Color.White); 
    } 
    return bmp; 
} 

Ce n'est pas vrai inversion de conversion de couleur des couleurs sur les graphiques, mais cela est Surface- à peu près analogue à la façon dont les faits saillants ont été faites dans les vieux jours win32. Pour tester cela, j'ai piraté une application WinForms par défaut et ajouté le code suivant, qui gère double-cliquez sur, peindre, et a une variable membre pour l'état alternatif.

bool m_Highlight = false; 

private void Form1_DoubleClick(object sender, EventArgs e) 
{ 
    m_Highlight = !m_Highlight; 
    this.Invalidate(); 
} 

private void Form1_Paint(object sender, PaintEventArgs e) 
{ 
    // Note: sloppy, but just to show that everything is inverted. 
    using(Font font = new Font(FontFamily.GenericSerif, 20.0f, FontStyle.Bold)) 
    { 
     e.Graphics.DrawString("Hello World!", font, Brushes.Red, 0.0f, 0.0f); 
    } 

    if (m_Highlight) 
    { 
     InvertGraphicsArea(e.Graphics, e.ClipRectangle); 
    } 
} 
1

Ce n'est pas une réponse directe à votre question, mais une alternative possible qui est un peu plus propre et, à mon avis, est conforme aux normes de Windows un peu plus que l'inversion de la couleur d'un contrôle.

ErrorProvider Class

ErrorProvider Class

+0

+1, comme mentionné dans ma réponse- je suis d'accord c'est mieux. – meklarian

+0

Merci pour le downvote sans explication ... inutile! –

Questions connexes