So erstellen Sie mehrere Fenster mit der Win32-API

8

Ich sehe viele Tutorials und Artikel, die mir zeigen, wie man ein einfaches Windows-Programm erstellt, was großartig ist, aber keiner von ihnen zeigt mir, wie man mehrere Fenster macht.

Im Moment habe ich Arbeitscode, der ein mehrschichtiges Fenster erstellt und zeichnet, und ich kann Sachen mit GDI blitzen, um alles zu zeichnen, was ich will, um es herumzuziehen, es sogar transparent zu machen, usw.

Aber ich wollte einen zweiten rechteckigen Bereich, den ich zeichnen kann, umherziehen usw. Mit anderen Worten, ein zweites Fenster. Wahrscheinlich möchte es ein Kinderfenster sein. Frage ist, wie mache ich es?

Wenn jemand gute Ressourcen (vorzugsweise online) wie Artikel oder Tutorials für die Fensterverwaltung in der Windows-API kennt, teilen Sie dies bitte mit.

    
Steven Lu 22.05.2010, 01:46
quelle

5 Antworten

6

Sie können CreateWindow () mehrmals drücken, wenn Sie möchten. Die Nachrichtenschleife in Ihrem WinMain übergibt Ereignisse an alle von WinMain erstellten Fenster. Sie können sogar zwei überlappende Fenster erstellen und das übergeordnete Fenster des zweiten als das Handle des ersten festlegen, wenn Sie möchten.

    
JustJeff 22.05.2010, 02:04
quelle
7

Um mehr als ein Fenster zu erstellen, wiederholen Sie alle Schritte, die Sie beim Erstellen des ersten Fensters zum Erstellen eines zweiten Fensters ausgeführt haben. Ein guter Weg, dies zu tun, ist das Kopieren und Einfügen des gesamten Codes aus dem ersten Fenster. Dann suche und ersetze in dem du alle Namen des ersten Fensters durch eindeutige Namen für das zweite Fenster ersetzt. Der Code, in dem ich das tue, ist unten.

Am wichtigsten ist, dass die Windows-Klasse für das zweite Fenster einen eindeutigen Namen im Code hat Zeile "windowclassforwindow2.lpszClassName=" window class2 ". Wenn es keinen eindeutigen Namen hat, wird die Windows-Registrierung fehlschlagen.

%Vor%

Ein komplexeres Beispiel - Funktionen zum Erstellen von Fenstern verwenden.

Wenn Sie jedes Fenster ohne eine Funktion erstellen, kann der Code unübersichtlich werden - vor allem, wenn es sich um if-Anweisungen handelt. Der folgende Code verwendet eine separate Funktion zum Erstellen jedes Fensters. Die ersten drei Fenster haben eine Schaltfläche zum Erstellen eines Fensters, um das nächste Fenster zu erstellen.

%Vor%

Was passiert, wenn Sie ein Fenster schließen und erneut öffnen?

Wenn Sie auf die Schließen-Schaltfläche klicken und dasselbe Fenster erneut öffnen, beachten Sie Folgendes. Wenn das Fenster nach dem Schließen geschlossen wird, wird es geschlossen. Aber das Zerstören eines Fensters zerstört nicht die Windows-Klasse. Es zerstört nur das Fenster von der createwindow Funktion. Dies macht es notwendig, dass die if-Anweisung im obigen Programm nur die Windows-Klasse erstellt, wenn das Fenster zum ersten Mal angezeigt wird.

Einige Seitennotizen

Sie könnten mehrere Fenster mit nur einer Windows-Klasse erstellen. Aber das Problem damit ist, dass Sie eine Windows-Prozessfunktion haben, um mit mehr als einem Fenster umzugehen. Das würde in diesem einfachen Beispiel gut funktionieren. Aber je heterogener die Fenster sind, desto größer ist die Notwendigkeit, für jedes Fenster eine eigene Windows-Klasse zu erstellen.

Auch die mehreren createwindow-Funktionen könnten zu einer Funktion zusammengefasst sein. Beachten Sie, dass der einzige Unterschied zwischen ihnen die Codezeile wc.lpszClassName war. Aber Windows wird sich wahrscheinlich von einander unterscheiden, daher ist es nicht notwendig, die Funktionen in einem zu kombinieren - es ist eher eine Vorliebe dafür, keine Code-Wiederholungen zu haben.

Weitere Informationen

Der Link auf der Website mit der Domain-Funktionx enthält weitere Details zu den Konzepten im Windows-Design. Der Link ist hier

Die Homepage von functionx.com bietet gute Lernressourcen für das Programmieren. Besonders wichtig ist diese Seite, die Programmierreferenzmaterial für Dinge wie das Ändern der Windows-Klasse, Erstellen von Listboxen und anderen Windows-Steuerelementen hat. Es ist auch eine gute Ressource für Win32 Programmierung lernen im Allgemeinen. functionx.com win32 Programmierung

functionx.com win32-Programmierung

    
rauprog 28.08.2015 01:28
quelle
3

Es klingt wie eine Schnittstelle für mehrere Dokumente . Hier ist ein Beispiel für eins:

Ссылка

    
Robert Harvey 22.05.2010 01:50
quelle
2

Sie können mit CreateWindow / CreateWindowEx beliebig viele Fenster erstellen, wobei die Beziehung zwischen ihnen beliebig ist (Eigentümer / Kind).

Sie können ein Fenster mit einem anderen "besitzen":

%Vor%

Um ein Fenster in Kind zu konvertieren, verwenden Sie SetParent .

Beachten Sie, dass sich der SetWindowLongPtr -Aufruf mit GWLP_HWNDPARENT nicht wie SetParent verhält (MSDN ist darin falsch, denke ich). GWLP_HWNDPARENT konvertiert ein Fenster nicht in "Kind", sondern in "Besitzer".

    
Hernán 22.05.2010 02:05
quelle
1

Ich weiß, dass dies bereits beantwortet wurde, aber ich habe gerade ein Programm geschrieben, das eine beliebige Anzahl von Fenstern über eine for-Schleife öffnet.

Hier ist meine Version. Im Grunde verwendet es denselben Klassengenerator, um mehrere Fenster zu erstellen. Sie können beliebig viele erstellen. Stellen Sie nur sicher, dass Sie Ihre HWND [] - und WNDCLASSEX wc [] - Arrays entsprechend anpassen.

Hinweis 1: Dieser Codeabschnitt verwendet eine globale ApplicationInstance, die von der WinMain-Funktion abgeleitet ist. Weisen Sie in Ihrem WinMain empfangene hInstance ApplicationInstance zu, die in diesem Beispiel als global verfügbar angenommen wird. Dies ist Ihre primäre Anwendungsfensterinstanz.

Hinweis 2: Natürlich muss die WinProc-Routine bereits vordefiniert sein und irgendwo in einer anderen Header-Datei oder etwas darüber enthalten sein (in diesem Beispiel nicht gezeigt). In diesem Code wird auf WinProc verwiesen, wenn es an PopulateClass (WNDPROC-Prozess) übergeben wird

Hinweis 3: SpawnWindow unterstützt "zentrierte" und "maximierte" Flags. Was sie tun, ist selbsterklärend.

Außerdem wird der Name der Fensterklasse automatisch generiert, so dass Sie sich nie darum kümmern müssen, ihn zu benennen. Weisen Sie ihm einfach einen guten Basisnamen zu.

%Vor%

Lasst es uns jetzt zusammenstellen, indem wir eine SpawnWindow-Funktion zur Verfügung stellen!

%Vor%

Erstellen Sie schließlich so viele Fenster, wie Sie wollen, mit jeweils nur einer Codezeile:

%Vor%

Rufen Sie CreateWindows () von Ihrem WinMain auf, bevor Sie die Hauptschleife aufrufen.

Hoffe, das hilft jemandem da draußen.

    
InfiniteStack 01.11.2017 05:01
quelle

Tags und Links