Screensaver-Previews anzeigen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

x-pressive

Betreff: Screensaver-Previews anzeigen

BeitragDi, Jan 27, 2004 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Einen rudimentären Screensaver mit Blitz zu gestalten, ist zwar kein Problem, aber so richtig professionell wirkt das nicht, wenn kein Preview des Savers im kleinen Monitor des Bildschirmschoner-Dialogs angezeigt wird.

Jetzt frage ich mich, ob und welche Workarounds es hier geben könnte. Ich bin kein C++ler, aber vielleicht wäre folgendes möglich:

1. Ein Wrapper-Tool oder eine DLL, mit der man Blitz erweitert.

2. Ein simples, externes .EXE file, das man einfach mit einem Parameter aufruft, und das dann wenigstens ein statisches Bild oder einen kleinen AVI in diesem Fenster anzeigt.

Gibt es so etwas schon bzw. kennt sich hier jemand ein bisschen mit C++ aus und kann mir sagen, ob das im Prinzip möglich wäre?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL
 

INpac

BeitragDi, Jan 27, 2004 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
also, wenn ich einen einfachen Bildschirmschoner haben will, der zufällig ein bidl wo anzeigt (wie der standart von XP), nehm ich den ressourcenhacker und replace das bild mit meinem aigenen - so hab ich einen schönen weißen apple auf schönem schwarz Wink



trägt nichts dem thema bei, ich weiß

Jan_

Ehemaliger Admin

BeitragDi, Jan 27, 2004 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Daddy sagt,

Yup, gibt es, weiß aber jetzt nicht wo, auf RMs CD ist er dabei!
between angels and insects

Markus2

BeitragDi, Jan 27, 2004 20:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit kommt man ans DC und kann alles machen wenn man
weiß mit APIs umzugehen .

VB6
Code: [AUSKLAPPEN]

Private Sub CheckShouldRun()
   
 ' See if another instance of the program is
 ' running in screen saver mode.
       
    ' If no instance is running, we're safe.
    If Not App.PrevInstance Then Exit Sub

    ' See if there is a screen saver mode instance.
    If FindWindow(vbNullString, APP_NAME) Then End

    ' Set our caption so other instances can find
    ' us in the previous line.
    frmMain.Caption = APP_NAME

End Sub

Public Sub Main()
 
 'MR 25.12.2001

 ' Start the program.

 Dim args As String
 Dim preview_hwnd As Long
 Dim preview_rect As RECT
 Dim window_style As Long

    ' Get the command line arguments.
    args = UCase$(Trim$(Command$))

    ' Examine the first 2 characters.
    Select Case Mid$(args, 1, 2)
        Case "/C"   ' Display configuration dialog.
            RunMode = rmConfigure
        Case "", "/S"   ' Run as a screen saver.
            RunMode = rmScreenSaver
        Case "/P"       ' Run in preview mode.
            RunMode = rmPreview
        Case Else       ' This shouldn't happen.
            RunMode = rmScreenSaver
    End Select

    Select Case RunMode
        Case rmConfigure    ' Display configuration dialog.
           
            frmConfig.Show
       
        Case rmScreenSaver  ' Run as a screen saver.
            ' Make sure there isn't another one running.
            CheckShouldRun

            ' Display the cover form.
            Load frmMain
           
            frmMain.Left = 0
            frmMain.Top = 0
            frmMain.Width = Screen.Width
            frmMain.Height = Screen.Height
           
            frmMain.Resize

            Saver_Init

            frmMain.Show
                       
        Case rmPreview      ' Run in preview mode.
            ' Get the preview area hWnd.
            preview_hwnd = GetHwndFromCommand(args)

            ' Get the dimensions of the preview area.
            GetClientRect preview_hwnd, preview_rect

            Load frmMain
           
            ' Set the caption for Windows 95.
            frmMain.Caption = "Preview"

            ' Get the current window style.
            window_style = GetWindowLong(frmMain.hwnd, GWL_STYLE)

            ' Add WS_CHILD to make this a child window.
            window_style = (window_style Or WS_CHILD)

            ' Set the window's new style.
            SetWindowLong frmMain.hwnd, GWL_STYLE, window_style

            ' Set the window's parent so it appears
            ' inside the preview area.
            SetParent frmMain.hwnd, preview_hwnd

            ' Save the preview area's hWnd in
            ' the form's window structure.
            SetWindowLong frmMain.hwnd, GWL_HWNDPARENT, preview_hwnd

            ' Show the preview.
            SetWindowPos frmMain.hwnd, HWND_TOP, 0&, 0&, preview_rect.Right, preview_rect.Bottom, SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW
               
            frmMain.Width = frmMain.ScaleX(preview_rect.Right, vbPixels, vbTwips)
            frmMain.Height = frmMain.ScaleY(preview_rect.Bottom, vbPixels, vbTwips)

            frmMain.Resize
           
            Saver_Init
           
            frmMain.Show

    End Select

End Sub

Private Function GetHwndFromCommand(ByVal args As String) As Long
 
 'MR 25.12.2001
 
 ' Get the hWnd for the preview window from the
 ' command line arguments.

 Dim argslen As Integer
 Dim i As Integer
 Dim ch As String

 ' Take the rightmost numeric characters.
 args = Trim$(args)
 argslen = Len(args)
 For i = argslen To 1 Step -1
  ch = Mid$(args, i, 1)
  If ch < "0" Or ch > "9" Then Exit For
 Next i

 GetHwndFromCommand = CLng(Mid$(args, i + 1))

End Function

x-pressive

BeitragMi, Jan 28, 2004 12:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code beschreibt leider nur, wie man die Commandline parst, aber nicht das eigentliche Kernstück, das Blitten.

Das Prinzip ist klar, bin aber Momentan nicht sicher, wo der Unterschied zwischen einem Window Handle (Hwnd) und einem Device Context (DC) liegt. Soweit ich weiß, ist ein Handle eine Integerzahl, also die Kennung eines Fensters. Den bekomme ich ja von Window mit der CommandLine. Und einen DC kann ich doch dann mittels API-Funktion ermitteln, oder nicht?

Dann müsste folgender Code doch eigentlich den Inhalt des Blitz-Fensters in das Preview-Fenster Blitten (PrevHnd ist die Nummer, die aus der CommandLine gelesen wurde, also das Handle des Preview-Fensters, denke ich):

Code: [AUSKLAPPEN]

Const SRCCOPY = $CC0020
hdc          = API_GetDC(PrevHnd%)
BlitzHwnd = API_GetActiveWindow()
Blitzhdc    = API_GetDC(BlitzHwnd)
API_BitBlt(hdc, 0, 0, 150, 113, Blitzhdc, 0,0, SRCCOPY)
API_ReleaseDC(PrevHnd, hdc)
API_ReleaseDC(BlitzHwnd, Blitzhdc)


Funktioniert aber leider nicht Confused Muss ich vielleicht irgendwelche Buffer angeben, oder stimmt die Verwendung der DCs nicht?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Markus2

BeitragMi, Jan 28, 2004 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht schon gut aus aber mach mal debug ausgaben der DCs

Und Teste erstmal mit GetDesktopWindow
oder blitte erstmal versetzt in dein eigenes Fenster .

Gibt auch noch GetWindowDC

x-pressive

BeitragMi, Jan 28, 2004 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier eine Test-Ausgabe der Handles und DCs:

Commandline: /p 14353858
Preview Window Handle: 14353858
Preview Window hdc: 1828788975
Blitz Window Handle: 3606124
Blitz Window hdc: 1426132087

Seltsamerweise kommen bei einigen Durchläufen immer wieder mal Minuswerte heraus, so z.B.:

Commandline: /p 5440964
Preview Window Handle: 5440964
Preview Window hdc: -16706983
Blitz Window Handle: 3409516
Blitz Window hdc: -738127282

Wenn ich statt GetDC() GetWindowDC() benutze, kommt das selbe raus. Woran kann das liegen?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Markus2

BeitragDo, Jan 29, 2004 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht ok aus ,
haste mal versucht in deinem eigen Fenster zu blitten ?
Vieleicht haste auch nur das falsche Handle von Blitz Fenster .


GetDC() und GetWindowDC() scheinen dann wohl die
selbe Funk. zu sein .

x-pressive

BeitragDo, Jan 29, 2004 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nee du, da funktioniert nichts, weder Blitten vom Desktop ins Preview Fenster, nicht von Blitz auf den Dekstop, nicht vom Desktop ins Blitz-Fenster... manchmal flackert ganz kurz etwas für den Bruchteil einer Sekunde, aber sonst nix.

Ist das mit den Minuswerten normal? Ob's daran liegt?
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

Markus2

BeitragMo, Feb 02, 2004 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal an den Blitz Support geschrieben ob man
an das Bitmap Handle oder DC vom Backbuffer() oder ImageBuffer() kommt wegen dem Screensaver preview Smile
Mal gespannt was die antworten ...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group