Winapi-32 Auflösungsabfrage für einen Screen mit DirectX9, C++ und der Winapi-32



  • Haaaaaaaaaallo liebe Programmierfreunde,

    habe eine bitte an denjenigen der mir helfen kann, an meinem Bildschirmschoner die Auflösungsabfrage einzustellen. Also ich habe einen Bildschirmschoner entwickelt mit den oben genannten Tool´s(Microsoft visual c++, unter verwendung von DirectX9 und der Winapi-32, only for XP)! Bin soweit fertig(mache gerade eine Ausbildung zum Fachinformatiker, und das ist meine Projektarbeit), mein toller Bildschirmschoner kann allerdings 2 Sachen gar nicht, und zwar . . .

    Als erstes habe ich probleme, wenn mein Bildschirmschoner auf einer anderen Auflösung als geschrieben gefahren wird, dann habe ich immer um den Sprite schwarze Balken, und der Sprite "fliegt" aus dem sichtbaren Bereich aus.
    Habe schon herausgefunden, das dies eine DX Frage wäre.
    Als zweites kann ich den Bildschirmschoner nicht in der Systemsteuerung in dem Vorschaubildschimausschnitt sehen, darüberhinaus ist es so, das wenn ich den Bild´schirmschoner über Desktop/Eigenschaften/Bildschirmschoner auswähle, springt dieser sofort an, bis einer der Abbruchbedingungen greift! Wenn ich die Einstellung im Bildschirmscho´ner auswähle, springt dieser sofort an, bis einer der Abbruchbedingungen greift. Wenn ich dann den OK-Button drücke, springt dieser sofort an . . .

    Also, wie funzt die Auflösungsabfrage bei einem Bildschirmschoner der mit den oben genannten Tools geschieben wurde(winmain habe ich unten drangehängt)???

    Und wie bekomme ich den Bildschirmschoner hin, das er sich mit Einstellung, Vorschau usw. funktioniert???

    // winmain.cpp
    
    // Include-Bibliotheken
    #include "Direct3D.h"
    #include "Sprite.h"
    #include <iostream>
    #include <string>
    
    // Zuweisung der Werte der
    // Globalen Variablen der Startposition des Sprites
    // Und der Startwert der Mouseabfrage
    int SPosWeight = 0;
    int SPosHeight = 0;
    int Mousewatch = 0;
    
    // Zielordner der Spritedatei
    #define SPRITE_NAME "c:/windows/system32/files/A.png"
    
    // Anwendungsfenster erzeugen
    // Erstellung des Datengrundgerüstes des 
    // Window-Anwendungsfensters
    HWND CreateMainWindow(HINSTANCE hInstance);
    
    // Callback Funktion zur Nachrichtenbehandlung. Funktionsweise der ungarischen Notation
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
    
    // Das Fensterhandle / Initialisierung des hWnd-Wertes
    HWND hWnd = 0;
    
    // Aufruf/Bekanntgebung der Klasse CDirect3D
    // mit dem Objekt Direct3D
    CDirect3D Direct3D;
    
    // Aufruf/Bekanntgebung der Instanzen der
    // Klasse CSprite mit dem Objekt Sprite3D
    CSprite Sprite;
    
    // Windows Main-Haupt-Funktion
    int WINAPI WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                       HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                       LPSTR lpCmdLine,          // Kommandozeile
                       int nCmdShow)             // Art wie das Fenster angezeigt werden soll
    {
        // Fenster erzeugen und Handle zwischenspeichern
        hWnd = CreateMainWindow(hInstance);
    
    	// Befehl zum Ausblenden des Cursor´s
    	ShowCursor(0);
    
        // Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    	// Wenn hWnd Null bleibt konnte das Fenster nicht erzeugt werden
        if(0 == hWnd)
        {
    		// Aufbau einer OK-Messagebox mit Fehlermeldung und ggf
    		// Veränderung der Variablen zum Abbruch
            MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
            return -1;
        }
    
        // Direct3D initialisieren mit Init
        if(!Direct3D.Init(hWnd))
        {
            return -1;
        }
    
    	// Initialisierung des RGB Werts der bei jedem 
    	// Bilschirmaufbau/Löschvorgang verwendet werden soll
        Direct3D.SetClearColor(D3DCOLOR_XRGB(6,34,117));
    
    	// Struktur, in der Informationen zur Nachricht gespeichert werden
    	// Name der Massage an Windows
        MSG msg;
    
    	// Aufbau des Sprites
    	Sprite.Create(Direct3D.GetDevice(),SPRITE_NAME);
    
        // Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird, 
    	// wenn sie empfangen wird, wird das Fenster geschlossen.
    	while(msg.message != WM_QUIT)
        {
    		// Wenn die if Abfrage nicht erfüllt ist, 
    		// wird der Bildschirmschoner gestartet
            if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
    			// Spriteaufbau mit den Informationen . . . 
                Direct3D.BeginScene();
    
    			// . . . der Spritebewegung horizontal und . . .
    	  		SPosWeight = Sprite.Move(SPosWeight);
    
    			//  . . . der Spritebewegung vertikal, und . . . 
    			SPosHeight = Sprite.Move2(SPosHeight);
    
    			// . . . der Sprite-Anfangs-Position, und . . . 
    			Sprite.SetPosition (SPosWeight,SPosHeight);
    
    			// . . . dem Befehl des Zeichnens des Sprites, und . . .
                Sprite.Draw();
    
    			// . . . Information zur Beendigung der Spritescene.
                Direct3D.EndScene();
    
            }
    	}
    
        // Rückgabewert an Windows
        return 0;
    }
    
    // Datengerüst zum erzeugen des Fensters
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
        WNDCLASSEX wndClass =
        {
            sizeof(WNDCLASSEX),                                 // Größe angeben
            CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW,    // Standardstile
            MessageHandler,                                     // Callback-Funktion
            0,                                                  // Zusätzliche Angaben
            0,                                                  // nicht benötigt
            hInstance,                                          // Anwendungsinstanz
            LoadIcon(NULL, IDI_WINLOGO),                        // Windows-Logo
            LoadCursor(NULL, IDC_CROSS),                        // IDC_ARROW = PFEIL ; IDC_WAIT = SANDUHR ; IDC_NO = AUSFAHRT VERBOTEN ; NULL = Sanduhr ; WAS GIBT ES SONST NOCH SO!!! 
            (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
            NULL,                                               // kein Menü
            "WindowClass",                                      // Der Name der Klasse
            LoadIcon(NULL, IDI_ASTERISK)                        // Windows Logo
        };
    
        // Klasse registrieren
        RegisterClassEx(&wndClass);
    
        return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                              "WindowClass",          // Klassenname
                              "Füllgrafscreen",       // Fenstertitel
                              WS_POPUP |              // Fenster mit Titelleiste und Taskleiste = WS_OVERLAPPEDWINDOW // Oder WS_OVERLAPPED ist gleich Nur Task 
                              WS_VISIBLE,             // Eigenschaften
                              0, 0,                   // Anfangspositionen, einmal die x und einmal die Y Achse! Man kann die Startpositionen mit z.B.: 100, 200 ausfüllen, und das Fenster öffnet sich an den Koordinaten
                              SCR_WIDTH, SCR_HEIGHT,  // und Größe des Fenster
                              NULL,                   // Handle des Elternfensters
                              NULL,                   // Handle des Menüs
                              hInstance,              // Anwendungsinstanz
                              NULL);                  // wird nicht benötigt
    }
    
    // Diese Funktion wird von Windows aufgrufen, wenn
    // eine Nachricht für mein Programm vorliegt
    LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    
    	// Identifizierung der eingehenden Nachrichten, 
    	// Behandlung und Reaktion auf die eingehenden Nachrichten,
    	// In switch eingebundene Abbruchbedingungen
        switch(msg)
        {
            // Windows Fenster beenden, wenn die Nachricht 
    		// PostQuitMessage empfangen wird
            case WM_DESTROY:
                    PostQuitMessage(0);
                    return 0;
                 break;
    
    	    // Abbruchbedingung für alle Keyboardtasten
            case WM_KEYDOWN:
                    DestroyWindow(hWnd);
                 break;
    
            // Abbruchbedingung für die linke Mousetaste
    		case WM_LBUTTONDOWN:
    				DestroyWindow(hWnd);
    			break;
    
            // Abbruchbedingung für die rechte Mousetaste
    		case WM_RBUTTONDOWN:
    				DestroyWindow(hWnd);
                break; 
    
    		// Abbruchbedingung für alle Mousebewegungen
    		case WM_MOUSEMOVE:
    
    				if (Mousewatch <4)
    				{	Mousewatch++;}
    				else
    				{
    					DestroyWindow(hWnd);
    				}
    
    			  break;
    
    	}
    
    	// Standardnachrichtenverarbeitung von Windows
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    

    Würde mich tierisch über hilfe freuen!
    Danke im vorraus.
    Euer Martin K





  • . . . daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaake . . .

    MFG

    Martin Kor


Anmelden zum Antworten