AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte [nonVCL] Screensaver mit Preview (Template)
Thema durchsuchen
Ansicht
Themen-Optionen

[nonVCL] Screensaver mit Preview (Template)

Ein Thema von turboPASCAL · begonnen am 29. Jan 2006 · letzter Beitrag vom 12. Mai 2007
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von turboPASCAL
turboPASCAL
Registriert seit: 8. Mai 2005
Nach dem ich nun einen (dähm.) Fehler hier beseitigen konnte, stelle den korrigierten Code hier zur Verfügung.

Bei dem Sourcecode handel es sich um einen nonVCL - Screensaver der sich leicht an eigene Bedürfnisse anpassen lässt. Wer Fehler findet oder Vorschläge hat möge es hier posten.

Happy Screensaving !
Miniaturansicht angehängter Grafiken
preview_190.gif  
Angehängte Dateien
Dateityp: zip templatescreensaver_585.zip (16,3 KB, 148x aufgerufen)
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
 
Benutzerbild von Sunlight7
Sunlight7

 
Delphi 5 Standard
 
#21
  Alt 25. Dez 2006, 18:24
Ja, die Regelmäßigen Serverabstürtze bringen mich auch etwas aus dem Konzept.
Oje, die Portalseite is grad kaputt


Ich weiß, ich war grad zu faul, den WM_MOUSEMOVE zu zerlegen

So besser?

Delphi-Quellcode:
    WM_MOUSEMOVE:
      begin
        // Exit Screensaver on mouse move with a Workaround for the "Non-Kugel Mäuse Bug" :)
        if (ScreenMode = scrmStart) and (Counter >= 10) then begin
           If StartUpCursorPos.x+StartUpCursorPos.y=0 then begin
             StartUpCursorPos.x:=LOWORD(lParam);
             StartUpCursorPos.y:=HIWORD(lParam);
           end else begin
             CurrentPos.x:=LOWORD(lParam);
             CurrentPos.y:=HIWORD(lParam);
             If (CurrentPos.x-StartupCursorPos.x<-10) or
                (CurrentPos.x-StartupCursorPos.x> 10) or
                (CurrentPos.y-StartupCursorPos.y<-10) or
                (CurrentPos.y-StartupCursorPos.y> 10) then
                  PostMessage(hWnd, WM_CLOSE, 0, 0);
          end;
        end;
      end;
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#22
  Alt 25. Dez 2006, 19:57
Aber sischa !
Matti
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23
 
#23
  Alt 8. Mai 2007, 15:37
Moin!
Wie stell denn ich das an dass ich ohne Timer dauerhaft rendern kann?
Also wie in Application.OnIdle?

Wenn ich das einfach in "Application.Run" reinschreib passiert nicht viel und wenn ich statt GetMessage PeekMessage nehm beendet er sich sofort wieder
  Mit Zitat antworten Zitat
teebee

 
Delphi 6 Professional
 
#24
  Alt 8. Mai 2007, 16:05
Ich nehme abhängig vom Modus (Vorschau oder Schoner) zwei verschiedene Nachrichtenschleifen:

Delphi-Quellcode:
If (Mode<>mPreview) Then Begin // nur im Schonermodus mit voller Leistung
  While Not(Beenden) Do Begin
   While PeekMessage(Message,0,0,0,PM_REMOVE) Do Begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
   Render; // rendern, sobald alles andere abgearbeitet ist - "OnIdle"
  End;
 End
 Else Begin // Timer für Vorschaumodus
  Timer := SetTimer(hWnd,0,10,Nil);
  Try
   While GetMessage(Message,0,0,0) Do begin
    TranslateMessage(Message);
    DispatchMessage(Message);
   End;
  Finally
   KillTimer(hWnd,Timer);
  End;
 End;

...

//In WndProc:

WM_TIMER: Render; // Rendern bei "OnTimer"

WM_CLOSE: ...
          Beenden := True;
          ...
Gruß, teebee
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23
 
#25
  Alt 10. Mai 2007, 16:25
Yo, das sieht ja eigentlich nicht schlecht aus, hat aber die gleiche Macke wie mein erster Versuch mit PeekMessage:
Der Bildschirm wird schwarz, es wird nichts gerendert, meine Musik läuft weiter und nach einer Weile startet der Rechner neu als ob ich Reset gedrückt hätte.
Ich kann den Schoner nicht mehr beenden, noch nichtmal den Taskmanager aufrufen
  Mit Zitat antworten Zitat
teebee

 
Delphi 6 Professional
 
#26
  Alt 10. Mai 2007, 22:02
Ein Schoner, der genau diese Schleife verwendet, läuft seit einiger Zeit anstandslos auf diversen Rechnern.

Ich vermute das Problem eher in der Rendering-Funktion, die im "OnIdle"-Modus viel öfter aufgerufen wird als mit einem Timer.

In meiner Rendering-Funktion muss ich ganz zum Schluss, nach dem letzten BitBlt, noch ein GetPixel(hMem,0,0) als Dummy-Funktion ausführen, damit alles funktioniert. (hMem ist der Speicherkontext mit der Bitmap, auf die gerendert wird). Es soll ein Problem mit ATI-Treibern geben, was das erforderlich macht. Leider weiss ich nicht mehr, woher ich diese Information habe, ist schon eine Weile her. Finde jetzt auch gerade keine Quelle. Jedenfalls funktioniert es damit bei mir. Wenn mein Schoner im Timer-Modus läuft, geht es auch ohne das GetPixel.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#27
  Alt 11. Mai 2007, 10:41
Zitat:
Ich vermute das Problem eher in der Rendering-Funktion, die im "OnIdle"-Modus viel öfter aufgerufen wird als mit einem Timer.
Ja, das ist so.

Selbst in der VCL im "OnIdle" bekommt man leicht eine 98%-tige Systemauslastung hinn.

Lagere das Zeichnen doch in einen Thread aus wenn du keinen Timer willst.
Matti
  Mit Zitat antworten Zitat
Benutzerbild von SnuffMaster23
SnuffMaster23
 
#28
  Alt 11. Mai 2007, 14:21
Ich hab nen ATi-Treiber, das werd ich demnächst ausprobieren, hab grad nur keine Zeit.
Wie krieg ich den Kontext der Bitmap? Das ist doch der Framebuffer der Grafikkarte
Redest du auch von OpenGL-Rendern? Nicht dass wir hier aneinander vorbeireden...

Der Rest der Renderroutine wirds kaum sein:
Delphi-Quellcode:
procedure Render;
var NowTime: Int64;
begin
    QueryPerformanceCounter(NowTime);
    TimePos := (NowTime - StartTime) / PerfFreq;

    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glTranslatef(Tri(TimePos * SpeedX), Tri(TimePos * SpeedY), Tri(TimePos * SpeedZ));
    glCallList(List);
end;
In der Liste sind 6 Quadrate drin.
  Mit Zitat antworten Zitat
teebee

 
Delphi 6 Professional
 
#29
  Alt 11. Mai 2007, 20:51
Zitat von SnuffMaster23:
Redest du auch von OpenGL-Rendern? Nicht dass wir hier aneinander vorbeireden...
Nein, ich rendere mit dem GDI, dementsprechend handelt es sich bei mir um einen 'normalen' Speicherkontext mit Bitmap.
Ich benutze aber die PeekMessage-Schleife auch in einem nonVCL-OpenGL-Projekt, dort klappt es alles so wie es soll, Fenster oder Vollbild.
Funktioniert es denn, wenn Du mit dem Timer arbeitest?
  Mit Zitat antworten Zitat
Benutzerbild von Daniel Schuhmann
Daniel Schuhmann

 
Turbo Delphi für Win32
 
#30
  Alt 11. Mai 2007, 21:11
Eine Option, um das Ding multimonitorfähig zu machen, wär noch nicht schlecht
Daniel Schuhmann
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz