Bildschirmschoner erstellen?!



  • Hallöchen!

    Folgendes Problem, ich muss für die Schule einen Bildschirmschoner mit C++ erstellen. Ich habe allerdings irgendwie keine Ahnung wie ich das anstellen soll. Bin totaler Anfänger!!

    Bin dankbar für jede Idee bzw. Anregung!!



  • Unter welchem Betriebssystem ?
    Ich gehe mal davon aus, du meinst Windows 😉

    Zum Themas Bildschirmschoner unter Windows gab es hier im Forum schon mal einen Thread. Da ich die URL nicht mehr habe poste ich das ganze einfach noch einmal:

    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 VollbildWindow 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.

    1. Normale WinApi Anwendung erstellen.

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

    3. scrnsave.lib dem Projekt hinzufügen

    4. 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.

    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.

    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.

    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:

    /* minimaler Bildschirmschoner fuer Windows
     *
     * kompilieren mit:
     *    cl -GX main.cpp /link scrnsave.lib /link user32.lib /link gdi32.lib /link advapi32.lib
     *
     *    scrnsave.lib
     *         wegen scrnsave.h
     *    user32.lib
     *         GetForegroundWindow
     *         IsWindow
     *         SystemParametersInfoA
     *         GetCursorPos
     *         DefWindowProcA
     *         SetCursor
     *         PostMessageA
     *         GetParent
     *         PostQuitMessage
     *         DispatchMessageA
     *         TranslateMessage
     *         GetMessageA
     *         CreateWindowExA
     *         RegisterClassA
     *         RegisterWindowMessageA
     *         SetForegroundWindow
     *         FindWindowA
     *         GetClientRect
     *         LoadIconA
     *         DialogBoxA
     *         DialogBoxParamA
     *         SendMessageA
     *         PeekMessageA
     *         CharNextA
     *    gdi32.lib
     *         GetClibBox
     *         GetStockObject
     *    advapi32.lib
     *         RegCloseKey
     *         RegQueryValueExA
     *         RegOpenKey
     */
    
    #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;
    }
    

    oder such doch mal in google nach "Screensaver.cpp"/-.c Bildschirmschoner.cpp/-.c
    http://www.th-soft.com/en_forum/disc_e_frm.htm
    http://www.coastlight.com/ken/visualc/
    http://www.crackinguniversity2000.it/Borland_C++Builder_How-To/157169109x/book-index.html

    How to Do Windows(32bit) Screensavers in C by Andy Clark
    http://dspace.dial.pipex.com/town/square/fc77/hobbies/screen/screen_c32.htm

    Sunrise Screensaver Sourcecode
    http://www.coastlight.com/ken/visualc/sunrise.htm



  • @Hume:
    Wenn dus verschiebst, pack auch gleich ne Kopie davon in die WinAPI-FAQ images/smiles/icon_wink.gif


Anmelden zum Antworten