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