Ein Fenster WinAPI mit 2D-Grafiken und Scrollbar unter C++ wie vereinen?



  • Hallo,
    ich bin noch Anfänger in C++ und habe zu o.g. Projekt das Problem, beides zusammen zu vereinbaren. Bisher habe ich über die Vorlage unter MSDN eigene 2D-Grafiken erfolgreich erstellt. Da mein Projektfenster "nur" 1900x900 Pixel anzeigen soll und aber gleichzeitig einen Inhalt von 1900x2140 Pixel haben soll, habe ich versucht, Fenster mit Scrollbars zu erzeugen. Dazu habe ich die Grundlage bei Stackoverflow.com gefunden.
    Angenommen, HWND mywindow1 wäre das Hauptfenster und falls erforderlich der Inhalt des größeren Child-Fensters HWND mywindow2.
    Was ich nicht verstehe ist

    1. Brauche ich zum Erstellen eines Hauptfensters zwingend ein Child-Fenster für den größeren Inhalt? Falls ja, habe ich auch nicht rausbekommen, ob ich
    2. folgenden Code so lassen kann:
    	WNDCLASSEX wc;
    	wc.cbSize = sizeof(wc);
    	wc.style = CS_OWNDC;
    	wc.lpfnWndProc = HandleMsgSetup;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hInstance;
    	wc.hIcon = nullptr;
    	wc.hCursor = nullptr;
    	wc.hbrBackground = nullptr;
    	wc.lpszMenuName = nullptr;
    	wc.lpszClassName = "myClassName1";
    	wc.hIconSm = nullptr;
    	RegisterClassEx(&wc);
    
    	WNDCLASSEX wc2;
    	wc2.cbSize = sizeof(wc2);
    	wc2.style = CS_OWNDC;
    	wc2.lpfnWndProc = WndProc;
    	wc2.cbClsExtra = 0;
    	wc2.cbWndExtra = 0;
    	wc2.hInstance = hInstance;
    	wc2.hIcon = nullptr;
    	wc2.hCursor = nullptr;
    	wc2.hbrBackground = nullptr;
    	wc2.lpszMenuName = nullptr;
    	wc2.lpszClassName = "myClassName2";
    	wc2.hIconSm = nullptr;
    	RegisterClassEx(&wc2);
    
    	mywindow1 = CreateWindowEx(
    		0, "myClassName1",
    		"Cockpitsimulator",
    		WS_OVERLAPPED | WS_SYSMENU | WS_VSCROLL,
    		0, 100, 1900, 900,
    		nullptr, nullptr, hInstance, nullptr
    	);
    

    Wobei ich nicht weiß, wie sich HandleMsgSetup und WndProc parallel vertragen bei zwei Fenstern? Siehe MSDN Part 4 und in der Antwort von Stackoverflow mit WindowProcedure(...). Ich habe sogar versucht, beides zu kombinieren, führte aber auch nicht zum Ziel.

    Folgendes wird dann später erstellt:

    		HWND mywindow2 = CreateWindow(
    			"myClassName2",
    			"",
    			WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL,
    			0, 100, 1900, 2140,
    			hWnd, nullptr, nullptr, nullptr);
    

    Wie bekomme ich das ganze Projekt mit einem Fenster mit scrollbaren Inhalt funktionierend zum Laufen? Dass ich die Objektnamen und Klasseneinträge (z.B. Window::HandleMsgSetup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) ) anpassen muss, ist mir schon klar. Und wie ich den Code in der Headerdatei und in der CPP-Datei unter Visual Studio 2019 anders schreiben muss, ist auch klar. Dass die Projekteigenschaften wie insbesodnere SUBSYSTEM:WINDOWS einzustellen sind, weiß ich auch. Das ist nicht das Problem.

    Ich hoffe, dass ich mein Anliegen verständlich dargestellt habe.
    Viele Grüße,
    Stefan



  • Du mußt eigentlich nur für das 2. Fenster mywindow1 als parent angeben (wo jetzt hWnd steht).
    Beachte, daß die Positionen dann relativ dazu sind, d.h. daher nimm (vermutlich) 0, 0 (statt 0, 100) als Positionsangabe.

    Packe beide CreateWindow(Ex)-Aufrufe hintereinander in eine Funktion. So kannst du dann auf die Message-Behandlung in WindowProcedure hierfür verzichten und direkt beide Fenster erzeugen.

    Außerdem kannst du auf das Registrieren des Child-Fensters verzichten (WNDCLASSEX wc2) - dies ist nur für das Hauptfenster nötig.
    Für die Anzeige von Text und/oder Grafiken nimmst du (als Child-Control) am besten ein Static Control.

    Und wie in dem Stackoverflow-Beitrag schon verlinkt, benötigst du für das eigentliche Scrollen die Auswertung der entsprechenden Scroll-Messages, s. Using Scroll Bars.

    Edit: Die generelle Frage ist aber, warum du dir das direkte Hantieren mit der WinAPI antust und nicht ein bequemeres Framework (wie z.B. Qt, wxWidgets oder SFML) benutzt?



  • Danke soweit. Bei Qt hatte ich schon mal auf deren Seite geschaut und ich hatte fälschlicherweise verstanden, man müsse bei Entwicklung auf einem Windows-PC für eine Windows-Anwendung zahlen. Aber jetzt bin ich gerade dabei, Qt mit einer OpenSource-Lizenz zu installieren. Wahrscheinlich mache ich dann zukünftig nichts mehr mit der WinAPI.



  • Viel Erfolg dabei.
    Und bei Fragen dazu gibt es hier auch ein passendes Subforum: Andere GUIs - Qt, GTK+, wxWidgets



  • Herzlichen Dank!



  • Was mir noch einfällt: auf der Qt-Webseite gibt es viele Beispielprojekte unter Qt Examples And Tutorials, wovon du eine als Vorlage für dein Projekt nehmen kannst (evtl. eines der Graphics-Projekte).

    Bedenke: es gibt 2 verschiedene Arten von GUI-Projekten bei Qt, s.a. mein Beitrag in Workflow zwischen den Projekten von Qt und Visual Studio.



  • @Th69
    Anhand der Sprachsyntax von Qt merke ich jetzt schon, dass ich höchstwahrscheinlich mit der "QtQuick und QML-Variante" viel besser mein Ziel erreichen kann als mit dem D2D1-Zeugs von C++ bzw. DirectX. Danke nochmals!


Log in to reply