Tutorials - ScreenSaver programmieren

Sprachenübersicht/Programmierung/C / C++/ C#/Grafik

ScreenSaver programmieren

Diese Seite wurde 12336 mal aufgerufen.

Dieser Artikel wurde in einem Wikiweb System geschrieben, das heißt, Sie können die Artikel jederzeit editieren, wenn Sie einen Fehler gefunden haben, oder etwas hinzufügen wollen.

Editieren Versionen Linkpartnerschaft Bottom Printversion

Keywords: Bildschirmschoner, programmieren, C++, Screen, Bildschirm

Vorwort Top



Orginal von Thomas Nitschke aka namespace.

Das Programmieren von Screensavern ist eingentlich recht einfach.
Theoretisch kann man jede Exe in Scr umbennen und voila, man hat einen
ScreeS.. Das Problem ist nur, daß bestimmte Sachen, wie Vollbild
oder das automatische Schließen bei Mausbewegungen, nicht unterstützt
werden (es sei denn, man schreibt den Code dafür). Das elegantere und
einfachere Verfahren ist, sich von VC6 das Grundgerüst basteln zu lassen.

Grundgerüst Top



  • Normale WinApi Anwendung erstellen.


  • Bei den Linker- und Debugereinstellungen den Namen der
    Endatei von exe auf scr ändern.


  • scrnsave.lib dem Projekt hinzufügen


  • windows.h und scrnsave.h "includen".



Ein Screensaver besteht grundlegend aus 3 Funktionen:


  • long WINAPI ScreenSaverProc(HWND hWnd,UINT message,WPARAM wParam,
    LPARAM lParam)


  • BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message,
    WPARAM wParam,LPARAM lParam)


  • BOOL WINAPI RegisterDialogClasses(HANDLE hInst)



Ihre Namen lassen schon auf den Zweck schließen.
So, das war das Grundwissen, jetzt schreiben wir am besten ein
komplettes Gerüst um zu sehen, wie's denn funktioniert.

Normale Api-Programme verfügen über die
Funktion WindowProc() bei ScreenSaver heißt diese
Funktion ScreenSaverProc(). Von ihr wird, wie auch bei
der WindowProc(), das MessageHandling übernommen.

Code:


long WINAPI ScreenSaverProc(HWND hWnd,UINT message,WPARAM wParam,
LPARAM lParam)
{
   switch(message)
   {
   case WM_CREATE:
      //Initialisierung
      //und erstellen eines Timers
      break;
   case WM_TIMER:
      //Hier stehen norm. die Grafikfunktionen
      break;
   case WM_DESTROY:
      //Speicher frei machen und Fenster schließen
      break;
   }
   return DefScreenSaverProc(hWnd,message,wParam,lParam);
}



Das würde für einen kleinen Screensaver reichen, aber wir haben noch
keinen Konfigurationsdialog eingerichtet. Der kann unabhängig von der
ScreenSaverProc() aufgerufen werden.

Code:


BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message,
WPARAM wParam,LPARAM lParam)
{
   switch(message)
   {
   case WM_INITDIALOG:
      //Initialisierung
      return TRUE;
   case WM_COMMAND:
      //Handling von Befehlen
      break;
   case WM_CLOSE:
      //Schließen des Fensters und evtl. Speicher freimachen
      return TRUE;
   }
   return FALSE;
}



Für den Dialog brauchen wir natürlich eine Dialog-Resource.
Die muß aber als 2003 in der resource.h definiert sein:
also: #define DLG_SCRNSAVECONFIGURE 2003).
Ach ja, man muß natürlich resource.h includen.

Zu guter letzt brauchen wir noch eine Funktion, um
spezielle Fensterklassen für den Konfigurationsdialog
zu deklarieren.

Code:


BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
   return TRUE;
}



da wird diese Funktion aber fast nie brauchen, können wir sie
leer lassen. ACHTUNG: SIE muß aber auf jeden Fall vorhanden sein.

Jo, das wars auch schon, eigentlich ganz easy.
Damit ihr das auch mal an einem echten Beispiel sehen könnt, ist
hier der komplette Sourcecode von einem Saver:

Code:


#include <windows.h>
#include <scrnsave.h>

UINT timer_id;
int r,g,b = 50;

long WINAPI ScreenSaverProc(HWND hWnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
HDC dc;
dc = GetDC(hWnd);
char hallo[] = "Hallo Welt";

    switch(message)
    {
    case WM_CREATE:
        SetTimer(hWnd,timer_id,100,NULL);
        break;
    case WM_TIMER:
        SetBkColor(dc,RGB(0,0,0));
        SetTextColor(dc,RGB(r,g,b));
        TextOut(dc,300,250,hallo,strlen(hallo));
        r = r+5;
        b = b+10;
        g = g+2;
        break;
    case WM_DESTROY:
        KillTimer(hWnd,timer_id);
        ReleaseDC(hWnd,dc);
        break;
    }
    return DefScreenSaverProc(hWnd,message,wParam,lParam);
}


BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_INITDIALOG:
        return TRUE;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDOK:
            EndDialog(hWnd,0);
            return TRUE;
        case IDCANCEL:
            EndDialog(hWnd,0);
            return FALSE;
        }
        break;
        case WM_CLOSE:
            EndDialog(hWnd,0);
            return TRUE;
    }
    return FALSE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
    return TRUE;
}



Have Fun!
Thomas

Gibt es noch irgendwelche Fragen, oder wollen Sie über den Artikel diskutieren?

Editieren Versionen Linkpartnerschaft Top Printversion

Haben Sie einen Fehler gefunden? Dann klicken Sie doch auf Editieren, und beheben den Fehler, keine Angst, Sie können nichts zerstören, das Tutorial kann wiederhergestellt werden

Sprachenübersicht/Programmierung/C / C++/ C#/Grafik/ScreenSaver programmieren