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);
}
}
Il n'y a pas de question ici. – Lazarus
Par intérêt, pourquoi voulez-vous faire cela? Peut-être qu'il y a une meilleure solution. –
Désolé. Mais maintenant est-ce une question? – magol