Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - WinAPI ::  Bildschirmschoner erstellen?!     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Jessi
Unregistrierter




Beitrag Jessi Unregistrierter 16:04:00 06.04.2002   Titel:   Bildschirmschoner erstellen?!            Zitieren

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!!
Werbeunterbrechung
Descartes
Unregistrierter




Beitrag Descartes Unregistrierter 16:17:00 06.04.2002   Titel:              Zitieren

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:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
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.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.

C/C++ Code:
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
  return TRUE;
}
C/C++ Code:
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
return TRUE;
}
C/C++ 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:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* 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
CMatt
Moderator

Benutzerprofil
Anmeldungsdatum: 21.05.2001
Beiträge: 3449
Beitrag CMatt Moderator 16:19:00 06.04.2002   Titel:              Zitieren

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

_________________
nur her mit euren Problemen....
- Mod im WinAPI und .NET Forum -
C/C++ Forum :: FAQ - WinAPI ::  Bildschirmschoner erstellen?!   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.