2016-03-31 13 views
-1

Ich habe den folgenden CodeWie kann ich die IntPtr der Bitmap zu CreateCaret in C# passieren

Bitmap Bmp=new Bitmap(nWidth, nHeight); 
using (Graphics gfx=Graphics.FromImage(Bmp)) { 
    using (SolidBrush brush=new SolidBrush(ForeColor)) { 
     gfx.FillRectangle(brush, 0, 0, nWidth, nHeight); 
    } 
    Bmp = new Bitmap(nWidth, nHeight, gfx); 
    CreateCaret(base.Handle, Bmp, nWidth, nHeight); 
} 

ShowCaret(base.Handle); 

Das Problem Ich habe auf dieser Linie ist:

CreateCaret(base.Handle, Bmp, nWidth, nHeight); 

... Weil es erwartet, dass Bmp IntPtr ist

Dieses Konzept Ich versuche, dies auf eine Weise zu tun, die nicht erfordert, ein Bitmap aus einer Datei oder Ressource, sondern mehr im laufenden Betrieb erstellt. Ich verstehe, dass ich IntPtr.Zero überschreiten kann, und es wird ein Karat schaffen, aber die Farbe ist weg, wenn ich es so mache.

Wie kann ich die Bitmap wie erstellt an die CreateCaret Methode übergeben?

+0

Sie könnten an der 'Bitmap.LockBits' Methode aussehen wollen: https://msdn.microsoft.com/en-us/library/5ey6h79d(v=vs.100).aspx – vesan

+0

Ich habe es gerade getan, habe ein 'Lock' nicht in dieser Methode oder so ähnlich beim. Glücklicherweise konnte ich eine Lösung 'CreateCaret (base.Handle, bmp.GetHbitmap(), nWidth, nHeight) finden;', eine Art Verrückter, dass MS eine Methode für die Konvertierung eingeführt hat, aber die Leute immer noch dumm sind, sie zu sperren/unlock/etc etc, um dasselbe zu tun, indem mehr Arbeitsspeicher und Ressourcen als benötigt verwendet werden. Schön, dass es einen direkten Weg gibt, um die Referenz des Objekts im Speicher nativ zu bekommen. –

+0

Ich habe immer noch das Problem der Verfärbung, es zeigt sich jedoch als bräunliche Farbe, wenn ich 'ForeColor' auf GhostWhite gesetzt habe, und der Hintergrund der Richtextbox ist Slate, also braun? heh. –

Antwort

0

Die einfachste Methode zum Übergeben einer Bitmap besteht darin, das Handle zur Bitmap zu ziehen. Microsoft hat freundlicherweise die GetHbitmap() Erweiterung zu Bitmap Typen zur Verfügung gestellt.

Dies kann wie folgt geschehen:

CreateCaret(base.Handle, bmp.GetHbitMap(), hWidth, hHeight); 

Ergebnis ist folgendes::

Bitmap bmp = new Bitmap(800, 600); // create a new bitmap 800x600 
IntPtr ptr = bmp.GetHbitmap(); // get the IntPtr handle 

das obige Beispiel aus meiner Frage verwenden, können die Caret Schöpfung als solche behandelt werden

// Set the Caret color 
Color CaretColor = Color.White; 

// Invert the Caret color (ineffective) 
Color invertedCaretColor=Color.FromArgb(CaretColor.ToArgb()^0xffffff); 

// Get the character size 
int nHeight = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Height); // set the height to full character height 
int nWidth = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Width); // set the width to full character width 

if (nWidth>0&&nHeight>0) { 
    // initialize bitmap 
    using (Bitmap bmp=new Bitmap(nWidth, nHeight)) { 

     // initialize graphics 
     using (Graphics gfx=Graphics.FromImage(bmp)) { 
      nWidth = Convert.ToInt32(gfx.MeasureString("Z", base.Font).Width * .66); // set the width to 2/3 character width 

      // initialize brush for drawing background 
      using (SolidBrush brush=new SolidBrush(invertedCaretColor)) { 
       gfx.FillRectangle(brush, 1, 1, nWidth, nHeight); // draw offset by 1 pixel 

       // initialize final bitmap for output as Caret 
       using (Bitmap bmp2=new Bitmap(nWidth, nHeight, gfx)) { 

        // Draw the Caret; 

        CreateCaret(base.Handle, bmp2.GetHbitmap(), nWidth, nHeight); 
        ShowCaret(base.Handle); 
       } 
      } 
     } 
    } 
} 

HINWEIS Die Caret-Farbe wird IMMER basierend auf der Hintergrundfarbe berechnet. Dies kann geändert werden, aber die Dokumentation hier gibt nur eine grobe Vorstellung von einem Konzept, dass es möglich ist: How To Control the Caret Color.

Das Dokument hat das auf dem Konzept zu sagen:

Um die caret Farbe auf etwas anderes als schwarz oder weiß erfordert erheblich mehr Arbeit, mit viel weniger zuverlässigen Ergebnissen zu ändern, da die Anwendung der folgenden Gleichung lösen muß :

NOT(caret XOR background) = desired_color on the 
          "blink" of the caret.