C# GDI+ Programmierung (5)
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.
{
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.
Weitere Artikel zum Thema C# GDI+-Programmierung (5) finden Sie auf der chinesischen PHP-Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

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

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

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.

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

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

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.

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

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
