Heim Backend-Entwicklung C#.Net-Tutorial C# GDI+ Programmierung (5)

C# GDI+ Programmierung (5)

Dec 17, 2016 am 10:09 AM

Rufen Sie die API-Funktion auf, um im Nicht-Client-Bereich des Fensters zu zeichnen.

In der Graphics-Klasse von GDI+ gibt es eine FromHdc-Funktion. Diese Funktion kann ein Grafikobjekt basierend auf dem Fenstergerät erstellen Kontext (DC). In vc++ ist das Zeichnen des Fenster-Client-Bereichs mit dem Nicht-Client-Bereich nichts anderes als unterschiedliche Aufrufe der Funktionen GetWindowDC und GetDC. Ersteres erhält den gesamten Fenster-DC und letzteres den Fenster-Clientbereich-DC.

Dann können wir die GetWindowDC-Funktion in C# aufrufen, um den gesamten Fenster-DC abzurufen, und ihn dann über FromHdc laden, sodass wir für das gesamte Fenster zeichnen können.

Wie ruft C# die WINDOWS-API auf oder wie ruft man Funktionen in einer Dynamic Link Library (DLL) auf?

Ähnlich wie bei VC++ importieren Sie zuerst die Dynamic Link Library und deklarieren dann die API-Funktion wie folgt:

[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hwnd);

Natürlich ist das Obige das einfachste, es gibt noch einige Details, die nicht erwähnt werden, also machen wir es erst einmal, wir wissen nur, wie man es grundsätzlich verwendet. Diese Einzelheiten werden später im Detail erläutert.

In C# stellen wir fest, dass die Parametertypen von API-Funktionen unterschiedlich sind, z. B. behandelt HDC und HWND in VC++. Bei der Deklaration wurde stattdessen IntPtr verwendet. Dies ist nicht möglich, da C# nicht über das Konzept von Zeigern verfügt und wir bei der Überprüfung der HDC- und HWND-Typdefinitionen festgestellt haben, dass es sich bei beiden um Zeigertypen handelt.

In C# werden diese „Handle“-Typen also durch IntPtr ersetzt, einschließlich Bereichshandles HRGN, HICON-Symbole, HFONT-Schriftarthandles usw.

Sehen wir uns ein Beispiel an (Fortsetzung des vorherigen Kapitels)

öffentliche Teilklasse Form1: Form
{
//Importieren Sie die dynamische Linkbibliothek und deklarieren Sie die Funktion. Diese Funktion wird in der Klasse Form1 deklariert.
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hwnd);
//Pfad zum Speichern des nicht transparenten Teils des PNG
private GraphicsPath path = new GraphicsPath();
//PNG-Bild laden
Bitmap bmp = new Bitmap("d:\Image\win.png");
public Form1()
{
​​ InitializeComponent ();
//Beurteilen Sie den Farbwert jedes Pixels und erhalten Sie den Anzeigebereich des Bildes
for (int y = 0; y < bmp.Height; y++)
for (int x = 0; x < bmp.Width; x++)
{
Color cor = bmp.GetPixel(x, y);
int argb = cor .ToArgb (); GetBytes(argb);
//Pixelfarbwert ist nicht transparent
if (bargb[3] != 0)
                         //Diesen Pixelbereich zum Pfad hinzufügen
                path.AddRectangle(neues Rechteck (x, y, 1, 1));                                                                                                                                                            . Fensteranzeigebereich, Bereich erstellen durch Pfad
This.Region = new Region( path);
this.Paint += formPaint;

}
private void formPaint(object sender, PaintEventArgs e)
{
                                                                                                                >                 //Handle ist das Fensterhandle, es ist ein IntPtr-Typ
          IntPtr hdc = GetWindowDC(this.Handle); Graphics.FromHdc (hdc);
                                                                                                                                                                                                                                                          Seitprotected override void OnPaintBackground(PaintEventArgs e)
                                                                       void. es.Transparent , this.ClientRectangle) ;
                                                                                                                    Es wird einige Probleme oder eine Menge Ärger mit sich bringen. Es ist nur so, dass ich es nicht gelöst habe. Das Verschieben des Fensters oder das Maximieren des Fensters, ohne das gesamte Fenster vollständig zu aktualisieren, führt zu diesem Problem. Dieses Problem wird später gelöst.

Freunde, die Interesse haben, können dieses Problem auch lösen.

Außerdem habe ich nur den Client-Bereich des Fensters mit einem transparenten Pinsel gefüllt. Wenn ich das gesamte Fenster (einschließlich der Titelleiste) füllen möchte, ist die Methode dieselbe wie beim Zeichnen auf dem gesamten Fenster Fenster, holen Sie sich WindowDC und erstellen Sie dann

ein Grafikobjekt und zeichnen Sie den Fensterhintergrund.

(Exkurs: In vc++ haben der Client-Bereich und der Nicht-Client-Bereich unterschiedliche Neuzeichnungsnachrichten, WM_PAINT und WM_NCPAINT. Bitte beachten Sie dies. Wenn Sie den Nicht-Client-Bereich aktualisieren, zeichnen Sie den Client-Bereich nicht neu. , obwohl es keine Probleme geben wird, ist es immer schlecht, wenn es die Effizienz beeinträchtigt. Vermeiden Sie es, wenn Sie können)

Nicht-Client-Bereich des selbst gezeichneten Fensters (einschließlich Titelleiste, Maximum, Minimieren). , Schaltflächen schließen)

Schreiben Sie die Nachrichtenverarbeitungsfunktion WndProc neu

öffentliche Teilklasse Form1: Form

{

public Form1()

{

InitializeComponent();

       }

protected override void WndProc(ref Message m)

{
if (m.Msg == 0xA3)//WM_NCLBUTTONDBLCLK Doppelklicken Sie auf die Titelnachricht
MessageBox.Show(" You doppelklickte auf die Titelleiste");
                                           beschäftigen.

Um den der Nachricht entsprechenden Wert zu überprüfen, können Sie ihn im VC++-Compiler überprüfen. Markieren Sie beispielsweise WM_LBUTTONDOWN und klicken Sie mit der rechten Maustaste, wählen Sie „Zur Definition gehen“, um ihn anzuzeigen.

m.HWnd speichert das Fensterhandle m.LParam und m.WParam. Weitere Informationen finden Sie in der Erläuterung der Parameter WPARAM und LPARAM in der Funktion CreateWindow.



Der Arbeitsaufwand, den Nicht-Kundenbereich selbst zu zeichnen, ist wirklich zu groß. Hier werde ich nur eine allgemeine Vorstellung und Richtung geben, wenn ich Zeit habe Zukunft.

Die Voraussetzung besteht natürlich darin, verschiedene Daten zu berechnen, z. B. ob das Fenster Ränder hat. Wenn ja, ermitteln Sie die Randbreite und -höhe und berechnen Sie dann die rechteckige Fläche der vier Ränder.

Bestimmen Sie abschließend, ob das Fenster über die maximalen und minimalen Attribute verfügt, und ermitteln Sie dann den Bereich für die drei Schaltflächen.

Die SystemInformation-Klasse speichert diese Daten. Beispielsweise speichert SystemInformation.CaptionButtonSize die Größe der Titelleistenschaltfläche. Sobald die Größe ermittelt wurde, können Sie

den Bereich der Schaltfläche bestimmen , weil diese drei Die Schaltflächen befinden sich alle in der oberen rechten Ecke des Fensters, mit Ausnahme der Höhe und Breite des Rahmens.

SystemInformation.CaptionHeight speichert die Höhe der Titelleiste, und die Höhe und Breite des Rahmens werden in SystemInformation.BorderSize oder SystemInformation.Border3DSize gespeichert, die entsprechend dem FormBorderStyle des Fensters bestimmt werden. Sie können bestimmen, ob das Fenster durch MaximizeBox maximiert wird, was maximiert wird, wenn true.

Nach Erhalt der oben genannten Daten reagiert es auf verschiedene Nachrichten im Nicht-Client-Bereich, z. B. auf die Nachrichten mit der linken Maustaste WM_NCLBUTTONDOWN und WM_NCLBUTTONUP.

Die Maus verschiebt die Nachricht WM_NCMOUSEMOVE und dann beginnt die Selbstzeichnung.

Die Funktion „Contains“ in der Klasse „Rechteck“ kann bestimmen, ob sich ein Punkt innerhalb eines rechteckigen Bereichs befindet.

Weitere Artikel zum Thema C# GDI+-Programmierung (5) finden Sie auf der chinesischen PHP-Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Alternativen zu Null in der C -Sprache Was sind die Alternativen zu Null in der C -Sprache Mar 03, 2025 pm 05:37 PM

In diesem Artikel wird die Herausforderungen des Nullzeigers in C untersucht. Es argumentiert, dass das Problem nicht null selbst, sondern seinen Missbrauch ist. Der Artikel beschreibt Best Practices zur Verhinderung der Verhindern, einschließlich Vor-Dre-Dre-Dereferenz-Überprüfungen, Zeiger initiali

Welcher C -Sprachkompiler ist besser? Welcher C -Sprachkompiler ist besser? Mar 03, 2025 pm 05:39 PM

Dieser Artikel führt Anfänger bei der Auswahl eines C -Compilers. Es wird argumentiert, dass GCC aufgrund seiner Benutzerfreundlichkeit, der breiten Verfügbarkeit und der umfangreichen Ressourcen für Anfänger am besten geeignet ist. Es wird jedoch auch GCC, Clang, MSVC und TCC vergleicht, wodurch ihre Unterschiede hervorgehoben werden

So fügen Sie C-Compiler der nächsten Ebene hinzu So fügen Sie C-Compiler der nächsten Ebene hinzu Mar 03, 2025 pm 05:44 PM

In diesem Artikel wird erläutert, wie Sie neue Zeilenzeichen in C mit der \ n Escape -Sequenz innerhalb von Printf erstellen und Funktionen setzt. Es beschreibt die Funktionalität und liefert Codebeispiele, die die Verwendung für Zeilenumbrüche in der Ausgabe demonstrieren.

Ist Null in der modernen Programmierung in der C -Sprache noch wichtig? Ist Null in der modernen Programmierung in der C -Sprache noch wichtig? Mar 03, 2025 pm 05:35 PM

Dieser Artikel betont die anhaltende Bedeutung von NULL in der modernen C -Programmierung. Trotz Fortschritten bleibt NULL für die explizite Zeigerverwaltung von entscheidender Bedeutung und verhindert Segmentierungsfehler, indem das Fehlen einer gültigen Speicheradresse markiert wird. Bestes Prac

Was sind die Webversionen von C -Sprach Compilern? Was sind die Webversionen von C -Sprach Compilern? Mar 03, 2025 pm 05:42 PM

Dieser Artikel bewertet Online -C -Compiler für Anfänger, die sich auf die Benutzerfreundlichkeit und Debugging -Funktionen konzentrieren. OnlineGDB und Repl.it sind für ihre benutzerfreundlichen Schnittstellen und hilfreichen Debugging-Tools hervorgehoben. Andere Optionen wie Programmiz und Compil

C Sprache Online -Programmierwebsite C Sprachkompiler Offizielle Website Zusammenfassung C Sprache Online -Programmierwebsite C Sprachkompiler Offizielle Website Zusammenfassung Mar 03, 2025 pm 05:41 PM

Dieser Artikel vergleicht Online -C -Programmierplattformen und zeigt Unterschiede in Funktionen wie Debugging -Tools, IDE -Funktionalität, Standardkonformität und Speicher-/Ausführungsgrenzen. Es wird argumentiert, dass die "beste" Plattform von den Benutzerbedürfnissen abhängt.

Methode zum Kopieren von Code nach C -Sprachkompiler Methode zum Kopieren von Code nach C -Sprachkompiler Mar 03, 2025 pm 05:43 PM

In diesem Artikel werden effizientes Codekopieren in C -IDEs erläutert. Es wird betont, dass das Kopieren eine IDE -Funktion ist, keine Compiler -Funktion, und Details Strategien für eine verbesserte Effizienz, einschließlich der Verwendung von IDE -Auswahltools, Codefalten, Suchen/Ersetzen, Templa

So lösen Sie das Problem, das Ausgangsfenster durch den C -Sprachkompiler nicht zu verbessern So lösen Sie das Problem, das Ausgangsfenster durch den C -Sprachkompiler nicht zu verbessern Mar 03, 2025 pm 05:40 PM

In diesem Artikel wird die Ausgabefenster in der C -Programmkompilierung fehlt. Es werden Ursachen untersucht, wie das Ausführen der ausführbaren Datei, Programmfehler, falsche Compiler -Einstellungen, Hintergrundprozesse und schnelle Programmabschluss. Lösungen umfassen Ch

See all articles