Seite 1 von 2

direkt auf Desktop malen? (ähnlich Win-BüroklammerAssistent)

Verfasst: 14.12.2004 18:17
von SirCus
tag allerseits
ich versuche etwas ähnliches wie diesen Büroklammer Assistenten zu machen. Will allerdings nicht Merlin etc benutzen.

Kann ich irgendwie Transparente Sprites/3DSprites auf den Desktop malen?

Hab jetz mal Unsichtbare Fenster benutzt, aber sobald ich z.B. DrawText ein bisschen Text ausgeben möchte, wird das Fenster sichtbar.. erwartet hatte ich, dass es unsicthbar bleibt, und nur der Text sichtbar wird.. wohl mein Denkfehler.

danke
M.

Verfasst: 14.12.2004 19:10
von SirCus
ich denke am besten ist es, SkinWin vonDanilo zu nutzen. Ich versuchs mal damit.
Das Problem das ich noch habe ist, wie mache ich es, dass der "Agent" immer im Vordergrund ist, auch wenn eine andere Anwendung gerade aktiv ist?

- edit :

gefunden:
SetWindowPos_(WindowID(WindowID), #HWND_TOPMOST, WindowX(), WindowY(), WindowWidth(), WindowHeight(), #SWP_SHOWWINDOW)

Verfasst: 14.12.2004 21:27
von bobobo
gab da kürzestens erst was gepostet .. mit skinwin vom Danilo und Ton


im thread
3D Model als EXE ohne Player

Verfasst: 14.12.2004 21:50
von Falko

Verfasst: 14.12.2004 22:38
von SirCus
ja, mit skinwin bin ich jetz grade dran.

dabei taucht aber ein Problem auf:
ich tausche für die Animation des "Sprites" die Bilder aus, und führe dann ein Skinwin aus.

Nach einiger Zeit..bzw eigen Animationsfolgen, spätestens aber nach dem 2. Richtungswechsel irgendwann, wird zwar die Siliuette korrekt ausgeschnitten, aber das Bild eines alten Sprites bleibt im hintergrund sichtbar, der rest wird entweder schwarz oder Bildschirmhitnergrundmässig angezeigt..

versuchts mal:
http://www.chamaeleo-fx.de.vu/Dateien/TamaCham.rar

Code, Exe und Bitmaps liegen bei, 120kb
Danilos PureTools werden benötigt. (SkinWin)

Einfach ausführen, das Tier läuft von links nach rechts .. irgendwann werdet ihr bei der animierten Vorderpfote einen Grafikfehler im Hintergurnd feststellen, nach einem Richtungswechsel evtl sogar am ganzen Tier.

Verfasst: 15.12.2004 11:04
von bobobo
auf dem Trichter die skinwin's bei Bedarf neru zu erzeugen war ich auch zuerst .. das ging aber aus dem geschilderten Grund nicht ..

Ich hab einfach (einfach??) n Sack voll Fenster generiert die ich nacheinander per Hidewindow() anknipse und ausknipse.

Kostet zwar Speicher und dauert beim Initialisieren ne Ewigkeit (je nach Größe und Anzahl der zu erzeugenden Fenster) aber es geht.

Dein Chamäleon frisst zuviel Speicher. und es verschwindet tlw. nach einer gewissen Zeit.

Ich hab mir mal erlaubt Deine Echsen zu missbrauchen.
rechter Mausklick auf der Echse läss die laufen. (nur nach Rechts aber immerhin)
ESC oder F10 oder Alt-F4 wenn auf die Echse getippt wurde beendet das Programm (undokumentierte evenWParam() Funktion)

Code: Alles auswählen



Global maxx,maxy,hwnd,x,y
maxx = GetSystemMetrics_(#SM_CXSCREEN)
maxy = GetSystemMetrics_(#SM_CXSCREEN)


LengSound=120
LengSound1=224
LengSound2=446

AnimPause=0
AnimPause1=0
AnimPause2=0
UsePNGImageDecoder()


Image0=CatchImage(0,?SkinPicture0)
Image1=CatchImage(1,?SkinPicture1)
Image2=CatchImage(2,?SkinPicture2)
Image3=CatchImage(3,?SkinPicture3)
Image4=CatchImage(4,?SkinPicture4)
Image5=CatchImage(5,?SkinPicture5)
Image6=CatchImage(6,?SkinPicture6)



Procedure updateallwins()
   For I=0 To   6
     UseWindow(i)
     MoveWindow(x,y)
   Next i
EndProcedure

Procedure MoveIt(S)
   x=x+S
   Updateallwins()
EndProcedure 


b=ImageWidth()
h=ImageHeight()

OpenWindow(6,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(6))
SkinWin(WindowID(6),Image6)
OpenWindow(5,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(5))
SkinWin(WindowID(5),Image5)
OpenWindow(4,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(4))
SkinWin(WindowID(4),Image4)
OpenWindow(3,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(3))
SkinWin(WindowID(3),Image3)
OpenWindow(2,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(2))
SkinWin(WindowID(2),Image2)
OpenWindow(1,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID(1))
SkinWin(WindowID(1),Image1)
OpenWindow(0,maxx-b,0,b,h,#PB_Window_BorderLess|#PB_Window_Invisible,"PB - SkinWin Example 4")
CreateGadgetList(WindowID())
SkinWin(WindowID(),Image0)
HideWindow(0,0)
SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#swp_nosize)




;    CreateThread(@moveit(),0)
Repeat
  evnt=WaitWindowEvent()
  If evnt<>512
    Debug evnt
    Debug EventwParam()
    Debug EventlParam()
    
  EndIf
  Select EventwParam()
  Case 27
    End
  Case 121
    End
  EndSelect
  Select evnt
    ; IF LeftMouseButton pressed...
    
  Case #WM_LBUTTONDOWN
    SendMessage_(WindowID(),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  Case #WM_RBUTTONDOWN
  For lauf=1 To 20
  
    For i= 0 To 5
      Moveit(2)
      HideWindow(i+1,0)
      HideWindow(i,1)
      Delay(150)
    Next i
    HideWindow(0,0)
    HideWindow(6,1)
    Next Lauf
  Case #PB_EventGadget
    Select EventGadgetID()
    Case 1 ; EXIT
      End
    EndSelect
    ; pressed ALT+F4 ??
  Case #PB_EventCloseWindow
    End
  EndSelect
  
  x=WindowX()
  y=WindowY()
  
  If x<0
    x=0
  EndIf
  If y<0
    y=0
  EndIf
  
  If x>(maxx-WindowWidth())
    x=maxx-WindowWidth()
  EndIf
  If y >(maxy-WindowHeight()*2)
    y=maxy-WindowHeight()*2
  EndIf
Updateallwins()

  
ForEver

End

DataSection
SkinPicture0:IncludeBinary "Cham1-0.PNG"
SkinPicture1:IncludeBinary "Cham1-1.PNG"
SkinPicture2:IncludeBinary "Cham1-2.PNG"
SkinPicture3:IncludeBinary "Cham1-3.PNG"
SkinPicture4:IncludeBinary "Cham1-4.PNG"
SkinPicture5:IncludeBinary "Cham1-5.PNG"
SkinPicture6:IncludeBinary "Cham1-6.PNG"
EndDataSection

Verfasst: 15.12.2004 19:58
von SirCus
hm. is das ein bug , oder gehört das so? ne weile funktioniert das ja prima..

Verfasst: 15.12.2004 20:06
von bobobo
Danilo fragen

Verfasst: 15.12.2004 21:09
von ChaOsKid
hi SirCus,

ich dachte immer das SkinWin() nur das fenster zuschneidet,
aber das zeichet ja sogar auf das fenster, meistens zumindest ;)
wenn man vor SkinWin() das image auf das fenster zeichnet, dann geht es scheinbar ohne fehler....
und ich hab festgestellt das das tier fast stehen bleibt, wenn man mit der maus an ihm rumfummelt :)
da hab ich jetzt noch schnell einen timer reingebastelt...
hier mal der geänderte code von deiner hauptschleife:

Code: Alles auswählen

;
; immer im Vordergrund bleiben (einmal aufrufen reicht)
MakeStayOnTop(WindowID(WindowID), 1)
Timer = 40
Zeit = ElapsedMilliseconds() + Timer
Repeat 

  If Zeit < ElapsedMilliseconds()
    Zeit = ElapsedMilliseconds() + Timer
    Move_Cham()
    Anim_Cham()
    StartDrawing(WindowOutput())
    DrawImage(UseImage(CurrentCham), 0, 0)
    StopDrawing()
    SkinWin(WindowID(WindowID), UseImage(CurrentCham))
  EndIf
      
  Delay(5) 
   
Until WindowEvent() = #PB_Event_CloseWindow
mfG
Tobi

Verfasst: 15.12.2004 21:36
von SirCus
:allright:
das klappt hervorragend! du bist für heute mein Held :)