CodeArchiv für PB v4 - aktueller Status & Mithelfer gesu

Ankündigungen PureBasic oder die Community betreffend.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Hallo zusammen,

kurzer Zwischenbericht:

Die Konvertierung ist jetzt nahezu abgeschlossen. (Liste im ersten Posting habe ich eben aktualisiert) :)
Danke an Leonhard für die beiden neu konvertierten Codes (habe auch Deine neue Version des POP3 erstmal aufgenommen).

CAV wurde auf PB v4 umgeschrieben und um einige kleine neue Funktionen erweitert. Beta-Test läuft. :D

Anleitung muss noch geschrieben werden. :|

Bin schon dabei, neue Codes hinzuzufügen.
Werde mich dabei bevorzugt auf die "Codes, Tipps & Tricks" Bereiche im deutschen und englischen Forum stützen. Wer darin sehr gute (aber nur zu PB3.94 kompatible) Codes kennt, darf gerne in den entsprechenden Threads eine v4 Version posten. :twisted:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Hallo,

ich habe eine reichlich einwöchige Forumpause (u.a.) dazu genutzt, inzwischen bereits mehr als 300 neue Codes zum CodeArchiv hinzuzufügen.

Ein Screenshot siehe hier:
Bild

Bei den neuen Codes handelt es sich vorwiegend um bereits bei mir zwischengespeicherte Codes aus den Jahren 2004/05, die ich alle an PB v4 angepasst habe.

Es gibt also noch viel Potential, um weitere neue Codes hinzuzufügen.
Insbesondere die Codes, Tipps & Tricks Bereiche (deutsches + englisches Forum) werden dazu noch genutzt werden. Das Konvertieren kostet aber eine Menge Zeit. Jede Hilfe ich deshalb willkommen!

Eine sehr willkommene Hilfe für mich wäre deshalb, wenn ihr die bereits in diesen Tipps&Tricks Bereichen vorhandenen Codes (noch für PB v3.9x geschrieben) an PB v4 anpassen würdet. Einfach in den jeweiligen Threads die neuen Codes posten.

Dies hat nämlich zwei Vorteile: einerseits stehen die Codes sofort im Forum für alle Anwender zur Verfügung, andererseits spart dies mir wertvolle Zeit und beschleunigt damit die Veröffentlichung des neuen CodeArchivs.

Unabhängig davon habe ich jedoch auch hier gleich nochmal sofort Arbeit für euch. Die nachfolgende Liste an Codes ist bei meinen Konvertierungsarbeiten übrig geblieben, weil es zu POLINK-Fehlern kam oder andere Dinge noch nicht wie gewünscht laufen.

Es wäre schön, wenn Updates zu den entsprechenden Codes gleich wieder hier gepostet werden. Danke schonmal im voraus :allright:

http://www.purearea.net/temp/CodeArchiv ... n-Blitz.pb
http://www.purearea.net/temp/CodeArchiv ... ceBalls.pb
http://www.purearea.net/temp/CodeArchiv ... ntFiles.pb
http://www.purearea.net/temp/CodeArchiv ... tButton.pb
http://www.purearea.net/temp/CodeArchiv ... on_xxxx.pb
http://www.purearea.net/temp/CodeArchiv ... olorBox.pb
http://www.purearea.net/temp/CodeArchiv ... ombobox.pb
http://www.purearea.net/temp/CodeArchiv ... ler_xxx.pb
http://www.purearea.net/temp/CodeArchiv ... rpreter.pb
http://www.purearea.net/temp/CodeArchiv ... reeView.pb
http://www.purearea.net/temp/CodeArchiv ... ast_Len.pb
http://www.purearea.net/temp/CodeArchiv ... ePlayer.pb
http://www.purearea.net/temp/CodeArchiv ... ation3D.pb
http://www.purearea.net/temp/CodeArchiv ... ulation.pb
http://www.purearea.net/temp/CodeArchiv ... ndow_xx.pb
http://www.purearea.net/temp/CodeArchiv ... section.pb
http://www.purearea.net/temp/CodeArchiv ... nctions.pb
http://www.purearea.net/temp/CodeArchiv ... andling.pb
http://www.purearea.net/temp/CodeArchiv ... ap_xxxx.pb
http://www.purearea.net/temp/CodeArchiv ... missing.pb
http://www.purearea.net/temp/CodeArchiv ... -Editor.pb
http://www.purearea.net/temp/CodeArchiv ... Example.pb
http://www.purearea.net/temp/CodeArchiv ... pSoap32.pb
http://www.purearea.net/temp/CodeArchiv ... dSprite.pb
http://www.purearea.net/temp/CodeArchiv ... new_xxx.pb
http://www.purearea.net/temp/CodeArchiv ... eeClass.pb
http://www.purearea.net/temp/CodeArchiv ... enSaver.pb
http://www.purearea.net/temp/CodeArchiv ... erPrint.pb
http://www.purearea.net/temp/CodeArchiv ... ingGrid.pb
http://www.purearea.net/temp/CodeArchiv ... -fehlen.pb
http://www.purearea.net/temp/CodeArchiv ... indowed.pb
http://www.purearea.net/temp/CodeArchiv ... Control.pb
http://www.purearea.net/temp/CodeArchiv ... ShowMap.pb
http://www.purearea.net/temp/CodeArchiv ... Drawing.pb
http://www.purearea.net/temp/CodeArchiv ... ffering.pb
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=1385&highlight=
; Author: andi256 (updated for PB 4.00 by Andre)
; Date: 29. December 2004
; OS: Windows
; Demo: Yes

; SHA Algorithmus 
; ------------------
; Fingerabdruck (Hashcode) von Daten. Dieser Code hat die Eigenschaft, nicht 
; zurückgerechnet werden zu können. Also aus dem Fingerabdruck (zB MD5 oder 
; SHA-1) kann der ursprüngliche Datensatz nicht zurückgerechnet werden. 

; Das schöne ist, dass auch nur ein verändertes Bit am Ursprungsdatensatz den 
; Fingerabdruck stark und fast nicht vorherzusehen verändert. Demnach kann 
; man die Integrität von z.B. Dateien etc. testen (Erweiterung dazu ist die 
; Digitale Signatur, in der Hashcodes auch eine grosse Rolle spielen). 
; Desweiteren kann man Passwörter nur als Fingerabdruck speichern (also nur 
; den Hashcode) und später so vorgehen, dass man das eingegebene Passwort 
; durch den Hash-Algorithmus jagt und dann das Ergebnis mit dem gespeicherten 
; Hash vergleicht. Somit kann man feststellen, ob es das selbe Passwort war. 
; Allerdings ist das Passwort selbst nicht wiederherstellbar oder 
; herauszufinden und demnach sehr sicher verpackt. 

; Weitere Info's zu SHA-1: 
; http://de.wikipedia.org/wiki/SHA-1 


Global Dim state.l(4) 
Global Dim magic.l(4) 
Global Dim w.l(80) 

Procedure UpeekB(*mem) 
 ProcedureReturn Val(StrU(PeekB(*mem),#Byte)) 
EndProcedure 

Procedure.s speicherout_hex(*mem,l,q$) 
 For i = 0 To l-1 
  q$ = q$ + RSet(Hex(UPeekB(*mem+i)),2,"0") + " " 
 Next i 
ProcedureReturn q$ 
EndProcedure 

Procedure toLE(value) 
dummy1 = ((value >> 24) & $FF) 
dummy2 = ((value >> 8) & $FF00) 
dummy3 = ((value & $FF) << 24) 
dummy4 = ((value & $FF00) << 8) 
dummy5 = dummy1 |dummy2 |dummy3 |dummy4 
 ProcedureReturn dummy5 
EndProcedure 

Procedure RotL(num,count) ; rotate left 
  If count>0 And count<32 
    !MOV dword ECX,[p.v_count] 
    !ROL dword [p.v_num],cl 
  EndIf 
  ProcedureReturn num 
EndProcedure 

Procedure f(round,x,y,z) 
 If round < 20 
  dummy = ( x & y ) | ( ~x & z ) 
 Else 
  If round < 40 
   dummy = ( x ! y ! z ) 
  Else 
   If round < 60 
    dummy = ( x & y ) | ( x & z ) | ( y & z ) 
   Else 
    dummy = ( x ! y ! z ) 
   EndIf 
  EndIf 
 EndIf    
 ProcedureReturn dummy 
EndProcedure 

Procedure SHA_1(*digest,*buf,len,pad,ende) 

 magic(0) = $5A827999 
 magic(1) = $6ED9EBA1 
 magic(2) = $8F1BBCDC 
 magic(3) = $CA62C1D6 

 *databuf = AllocateMemory(64) 
  
 state(0) = $67452301 
 state(1) = $EFCDAB89 
 state(2) = $98BADCFE 
 state(3) = $10325476 
 state(4) = $C3D2E1F0 
  
 blocks = (len + 3 + 63) >> 6 
 bytes_left = len 
 If (pad|ende) = #True 
  len=0 
  Debug "len : " +Str(len) 
 EndIf 
  
 For i=0 To blocks-1 
  If bytes_left >= 64 
   CopyMemory(*buf,*databuf, 64) 
   buf = buf + 64 
   bytes_left = bytes_left - 64 
  Else  
   j=0  
   If bytes_left > 0 
    CopyMemory(*buf,*databuf,bytes_left) 
    j = bytes_left 
   EndIf 
   If bytes_left >= 0 
    PokeB(*databuf+j,Ende) 
    j = j + 1 
    bytes_left = -1 
   EndIf 
   For  j = j To 61 
    PokeB(*databuf+j,pad) 
   Next j  
    
   If j=62 
    dummy = ((8*len) >> 8) & $FF 
    PokeB(*databuf+62,dummy) 
    j = j + 1 
   EndIf 
   If j=63 
    dummy = (8*len) & $FF 
    PokeB(*databuf+63,((8*len) & $FF)) 
   EndIf    
  EndIf 
          
  CopyMemory(*databuf,@w(0),64) 
    
  For j=0 To 15 
   w(j)= toLE(w(j))  
  Next j 
  
  For j=16 To 79 
   w(j) = RotL(w(j-3) ! w(j-8) ! w(j-14) ! w(j-16),1) 
  Next j 

  a = state(0) 
  b = state(1) 
  c = state(2) 
  d = state(3) 
  e = state(4) 
  
  For j=0 To 79 
   t= RotL(a,5) + f(j,b,c,d) + e + w(j) + magic(j/20) 
   e = d 
   d = c 
   c= RotL(b,30) 
   b = a 
   a = t 
  Next j 
  
  state(0) = state(0) + a 
  state(1) = state(1) + b 
  state(2) = state(2) + c 
  state(3) = state(3) + d 
  state(4) = state(4) + e 
  
    
 Next i 
  
  state(0) = toLE(state(0)) 
  state(1) = toLE(state(1)) 
  state(2) = toLE(state(2)) 
  state(3) = toLE(state(3)) 
  state(4) = toLE(state(4)) 
  
CopyMemory(@state(0),*digest,20) 

EndProcedure 

OpenConsole() 

Input.s = "abc" 
*digest = AllocateMemory(19) 

sha_1(*digest,@input,3,0,$80) 
PrintN(speicherout_hex(*digest,20,"ist   : ")) 

PrintN ("soll  : A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D") 
Input() 
CloseConsole() 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = --
; DisableDebugger

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=2126&highlight= 
; Author: sverson (updated for PB 4.00 by Andre) 
; Date: 19. February 2005 
; OS: Windows 
; Demo: No 


; Brightness control for system colors 
; System- (oder auch andere Farben) noch heller oder dunkler machen 

;/ RGB farbhelligkeit korrigieren  PB 3.92 / ASM 
;/ Eine schnelle ASM-Routine zur "om the fly" Korrektur der RGB Farbhelligkeit 
;/ BrightnessRGB(RGB_Color.l, Delta.w) Delta -255...255 - andere Werte sind sinnlos 
;/ 02/2005 sverson 

Enumeration 
  #DemoWindow 
  #DemoImage 
  #DemoImageGeaget 
  #ColorTrackBar 
  #BrightnesTrackBar 
EndEnumeration 

Structure SYSCOLORS 
  ColorConst.s 
  ColorNumber.l 
EndStructure 
Global NewList ColorList.SYSCOLORS() 

Procedure InitColorList() ;/ Systemfarben 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DDKSHADOW" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DDKSHADOW) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DFACE = #COLOR_BTNFACE" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DFACE) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DHILIGHT = #COLOR_BTNHIGHLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DHILIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DHIGHLIGHT = #COLOR_BTNHIGHLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DHIGHLIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DLIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_3DSHADOW = #COLOR_BTNSHADOW" : ColorList()\ColorNumber = GetSysColor_(#COLOR_3DSHADOW) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_ACTIVEBORDER" : ColorList()\ColorNumber = GetSysColor_(#COLOR_ACTIVEBORDER) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_ACTIVECAPTION" : ColorList()\ColorNumber = GetSysColor_(#COLOR_ACTIVECAPTION) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_APPWORKSPACE" : ColorList()\ColorNumber = GetSysColor_(#COLOR_APPWORKSPACE) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BACKGROUND" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BACKGROUND) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BTNFACE" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BTNFACE) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BTNHIGHLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BTNHIGHLIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BTNHILIGHT = #COLOR_BTNHIGHLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BTNHILIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BTNSHADOW" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BTNSHADOW) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_BTNTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_BTNTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_CAPTIONTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_CAPTIONTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_DESKTOP = #COLOR_BACKGROUND" : ColorList()\ColorNumber = GetSysColor_(#COLOR_DESKTOP) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_GRAYTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_GRAYTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_HIGHLIGHT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_HIGHLIGHT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_HIGHLIGHTTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_HIGHLIGHTTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_INACTIVEBORDER" : ColorList()\ColorNumber = GetSysColor_(#COLOR_INACTIVEBORDER) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_INACTIVECAPTION" : ColorList()\ColorNumber = GetSysColor_(#COLOR_INACTIVECAPTION) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_INACTIVECAPTIONTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_INACTIVECAPTIONTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_INFOBK" : ColorList()\ColorNumber = GetSysColor_(#COLOR_INFOBK) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_INFOTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_INFOTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_MENU" : ColorList()\ColorNumber = GetSysColor_(#COLOR_MENU) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_MENUTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_MENUTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_SCROLLBAR" : ColorList()\ColorNumber = GetSysColor_(#COLOR_SCROLLBAR) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_WINDOW" : ColorList()\ColorNumber = GetSysColor_(#COLOR_WINDOW) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_WINDOWFRAME" : ColorList()\ColorNumber = GetSysColor_(#COLOR_WINDOWFRAME) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLOR_WINDOWTEXT" : ColorList()\ColorNumber = GetSysColor_(#COLOR_WINDOWTEXT) 
  AddElement(ColorList()) : ColorList()\ColorConst = "#COLORONCOLOR" : ColorList()\ColorNumber = GetSysColor_(#COLORONCOLOR) 
  ;/ + 3 Demofarben 
  AddElement(ColorList()) : ColorList()\ColorConst = "Demo Blue" : ColorList()\ColorNumber = RGB(0,0,128) 
  AddElement(ColorList()) : ColorList()\ColorConst = "Demo Green" : ColorList()\ColorNumber = RGB(0,128,0) 
  AddElement(ColorList()) : ColorList()\ColorConst = "Demo Red" : ColorList()\ColorNumber = RGB(128,0,0) 
EndProcedure 

Procedure BrightnessRGB(RGB_Color.l, Delta.w);- RGB farbhelligkeit korrigieren 
  !XOR Edx, Edx         ;/ EDX-Register löschen 
  !XOR Ebx, Ebx         ;/ EBX-Register löschen 
  !XOR Ecx, Ecx         ;/ ECX-Register löschen 
  !MOV BX, Word [p.v_Delta] ;/ Delta-Wert in BX einlesen 
  !MOV Eax, dWord [p.v_RGB_Color] ;/ RGB-Farbwert in EAX einlesen 
  !MOV DL, AL           ;/ R-Wert nach DL 
  !CALL .adddelta       ;/--> DELTA ZU DL (R) ADDIEREN ++ 
  !MOV CL, DL           ;/ R-Wert in CL zwischenspeichern 
  !MOV DL, AH           ;/ G-Wert nach DL 
  !CALL .adddelta       ;/--> DELTA ZU DL (G) ADDIEREN ++ 
  !MOV CH, DL           ;/ G-Wert in CH zwischenspeichern 
  !BSWAP Eax            ;/ B-Wert via BYTESWAP in AH zugänglich machen 
  !MOV DL, AH           ;/ G-Wert nach DL 
  !CALL .adddelta       ;/--> DELTA ZU DL (B) ADDIEREN ++ 
  !MOV AH, DL           ;/ G-Wert nach AH zurückschreiben 
  !BSWAP Eax            ;/ G-Wert via BYTESWAP wieder an richtige Position bringen 
  !MOV AX, CX           ;/ R und G Wert aus Zwischenspeicher CX wieder in AX schreiben 
  !JMP .ready           ;/==> FARBKORREKTUR BEENDET ++ 
  !.adddelta:           ;/ ++ DELTA ZU DL ADDIEREN ++ 
  !ADD DX, BX           ;/ Delta aus BX zu DX addieren 
  !BT DX, 15            ;/ auf Negativwert testen 
  !JC .negativ          ;/==> NEUER WERT KLEINER NULL ++ 
  !CMP DX, $FF          ;/ auf Maximalwert testen 
  !JBE .inrange         ;/==> NEUER ZWISCHEN 0 UND 255 ++ 
  !.bigger:             ;/ ++ NEUER WERT GRÖSSER 255 ++ 
  !MOV DX, $00FF        ;/ DX auf 255 begrenzen 
  !JMP .inrange         ;/==> WERT IN DEN GRENZEN ++ 
  !.negativ:            ;/ ++ NEUER WERT KLEINER NULL ++ 
  !XOR Edx, Edx         ;/ DX auf 0 begrenzen 
  !.inrange:            ;/ ++ WERT IN DEN GRENZEN ++ 
  !RET                  ;/ Rücksprung aus Makro 
  !.ready:              ;/ ++ FARBKORREKTUR BEENDET ++ 
  ProcedureReturn 
EndProcedure 

Procedure UpdateImage(ITitle$,IColor.l,iDelta.w);/ Image aktualisieren 
  StartDrawing(ImageOutput(#DemoImage)) 
  newColor = BrightnessRGB(IColor,iDelta) 
  Box(0,0,280,200,IColor) 
  Box(78,48,124,104,RGB(255,255,255)) 
  Box(79,49,122,102,RGB(0,0,0)) 
  Box(80,50,120,100,newColor) 
  DrawingMode(1) 
  FrontColor(RGB(255,255,255)) 
  DrawText(10, 10, ITitle$) 
  DrawText(90, 65, "R"+RSet(Str(Red(newColor)),3,"0")+"G"+RSet(Str(Green(newColor)),3,"0")+"b"+RSet(Str(Blue((newColor))),3,"0")) 
  DrawText(90, 80, "delta: "+Str(iDelta)) 
  FrontColor(RGB(0,0,0)) ; print the text to white ! 
  DrawText(90, 100, "delta: "+Str(iDelta)) 
  DrawText(90, 115, "R"+RSet(Str(Red(newColor)),3,"0")+"G"+RSet(Str(Green(newColor)),3,"0")+"b"+RSet(Str(Blue((newColor))),3,"0")) 
  DrawText(10, 175, ITitle$) 
  StopDrawing() 
EndProcedure 

If OpenWindow(#DemoWindow,0,0,320,240,"Helligkeitsregler",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#DemoWindow)) 
  If CreateImage(#DemoImage, 280, 200) 
    InitColorList() 
    LastElement(ColorList()) 
    UpdateImage(ColorList()\ColorConst,ColorList()\ColorNumber,0) 
    ImageGadget(#DemoImageGeaget,5,5,280,200,ImageID(#DemoImage),#PB_Image_Border) 
    TrackBarGadget(#BrightnesTrackBar, 5, 215, 280, 20,0,510) 
    SetGadgetState(#BrightnesTrackBar,255) 
    TrackBarGadget(#ColorTrackBar, 295, 5, 20, 200,1,CountList(ColorList()),#PB_TrackBar_Vertical) 
    SetGadgetState(#ColorTrackBar,CountList(ColorList())) 
    Repeat : 
      WinEvent = WaitWindowEvent() 
      Select WinEvent 
        Case #PB_Event_Gadget 
          SelectElement(ColorList(),GetGadgetState(#ColorTrackBar)-1) 
          UpdateImage(ColorList()\ColorConst,ColorList()\ColorNumber,GetGadgetState(#BrightnesTrackBar)-255) 
          SetGadgetState(#DemoImageGeaget,ImageID(#DemoImage)) 
      EndSelect 
    Until WinEvent = #PB_Event_CloseWindow 
  EndIf 
EndIf 
End 

; IDE Options = PureBasic v4.02 (Windows - x86) 
; Folding = - 
Gruss
Helle
Zuletzt geändert von Helle am 04.02.2007 18:14, insgesamt 3-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

http://www.purearea.net/temp/CodeArchiv ... -fehlen.pb

Code: Alles auswählen

; 
; Author: edel
; Date: 29. March 2006
; OS: Windows
; Demo: No
  
  Declare CProc(hWnd.l,uMsg.l,wParam.l,lParam.l)
  
  ;/ Declare variables
  Define hwnd , OldWndProc
  Define hInstance.l = GetModuleHandle_(0)
  Define wndc.WNDCLASSEX
  Define Button0,Button1
  Define WindowEvent
  
  ;/ Open window
  hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,220,120,"SUPERCLASSING")
  
  ;/ superclassing
  
  ;- Klassen Info holen
  
  wndc\cbSize = SizeOf(WNDCLASSEX)
  GetClassInfoEx_(hInstance,@"Button",@wndc)
  
  ;- alte controlprocadresse speichern
  OldWndProc = wndc\lpfnWndProc
  
  ;- neue controlprocadresse setzen
  wndc\lpfnWndProc = @CProc()
  
  ;- neuen Klassennamen setzen
  wndc\lpszClassName = @"OWNBUTTONCLASS"
  wndc\hInstance = hInstance
  
  ;- Neue Klasse registrieren
  RegisterClassEx_(@wndc)
  
  ;/ neues control erstellen
  Button0 = CreateWindowEx_(0,"OWNBUTTONCLASS","Button0",#WS_CHILD|#WS_VISIBLE,10,10,100,100,hwnd,0,hInstance,0)
  Button1 = CreateWindowEx_(0,"OWNBUTTONCLASS","Button1",#WS_CHILD|#WS_VISIBLE,110,10,100,100,hwnd,1,hInstance,0)
  
  ;/ Window eventloop
  Repeat
    WindowEvent = WaitWindowEvent()
  Until WindowEvent = #WM_CLOSE
  
  ;/ OWNBUTTONCLASS Subproc
  Procedure CProc(hWnd.l,uMsg.l,wParam.l,lParam.l)
    shared OldWndProc
    Protected buffer.s
    ;/ Hier ganz normal die Message verarbeiten.
    If uMsg = #WM_RBUTTONUP
      buffer.s = Space(50)
      SendMessage_(hWnd,#WM_GETTEXT,50,buffer)
      MessageRequester(Str(hwnd),"Rechtsklick -> " + buffer)
    EndIf
    If uMsg = #WM_LBUTTONUP
      buffer.s = Space(50)
      SendMessage_(hWnd,#WM_GETTEXT,50,buffer)
      MessageRequester(Str(hwnd),"Linksklick -> " + buffer)
    EndIf
    ProcedureReturn CallWindowProc_(OldWndProc,hWnd,uMsg,wParam,lParam)
  EndProcedure

http://www.purearea.net/temp/CodeArchiv ... missing.pb

Code: Alles auswählen


Define.iPBSC Lexer = New_PBSC()
Define.s     Text,Token
Define.l     Typ

Text = "procedure Testproc(a.l,b.s,c.l = 10)" + #lf$
Text + "  protected d = a+b*c"                + #lf$
Text + "procedureReturn d"                    + #lf$
Text + "endprocedure"                         

;- String

Lexer\SetFileString(Text)
 
While Lexer\IsNextToken()
  
  Token = Lexer\GetNextToken()
  Typ   = Lexer\GetCurrentType()
  
  Select Typ
    Case #PBSC_Other        : Debug "Other        : " + Token
    Case #PBSC_Identifier   : Debug "Identifier   : " + Token
    Case #PBSC_Number       : Debug "Number       : " + Token
    Case #PBSC_String       : Debug "String       : " + Token
    Case #PBSC_Comment      : Debug "Comment      : " + Token
    Case #PBSC_NewLine      : Debug "NewLine  : LF"  
  EndSelect
  
Wend 


;- Datei

; If Lexer\SetFile("test.pb")
  ; 
  ; While Lexer\IsNextToken()
    ; Token = Lexer\GetNextToken()
    ; Typ   = Lexer\GetCurrentType()
    ; 
    ; Select Typ
      ; Case #PBSC_Other        : Debug "Other        : " + Token
      ; Case #PBSC_Identifier   : Debug "Identifier   : " + Token
      ; Case #PBSC_Number       : Debug "Number       : " + Token
      ; Case #PBSC_String       : Debug "String       : " + Token
      ; Case #PBSC_Comment      : Debug "Comment  : " + Token
      ; Case #PBSC_NewLine      : Debug "NewLine  : LF"  
    ; EndSelect
  ; Wend
  ; 
  ; Lexer\CloseFile()
; EndIf
Zuletzt geändert von edel am 05.02.2007 00:54, insgesamt 3-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

http://www.purearea.net/temp/CodeArchiv ... ntFiles.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=3626&highlight=
; Author: benny (updated for PB 4.00 by Andre)
; Date: 09. June 2005
; OS: Windows
; Demo: Yes


; Count all files in a directory (incl. sub-dirs)
; Alle Dateien in einem Verzeichnis (inkl. Unterverzeichnissen) zählen

Procedure.l CountFiles(Dir.s)
	Protected ID.l, files.l

	If Right(Dir, 1) <> "\"
		Dir + "\"
	EndIf

	ID = ExamineDirectory(#PB_Any, Dir, "")
	If ID
		While NextDirectoryEntry(ID)
			Select DirectoryEntryType(ID)
				Case 0
					Break
				Case #PB_DirectoryEntry_File
					files + 1
				Case #PB_DirectoryEntry_Directory
					If DirectoryEntryName(ID) <> "." And DirectoryEntryName(ID) <> ".."
						files + CountFiles(Dir + DirectoryEntryName(ID))
					EndIf
			EndSelect
		Wend
		FinishDirectory(ID)
	EndIf

	ProcedureReturn files
EndProcedure

Dir.s = PathRequester("Pfad auswählen...", "C:\")

If Dir
	files.l = CountFiles(Dir)
	MessageRequester(Dir, "Das Verzeichnis enthält " + Str(files) + " Dateien und Verzeichnisse.")
EndIf
http://www.purearea.net/temp/CodeArchiv ... indowed.pb

Code: Alles auswählen

; www.PureArea.net
; Author: Andre
; Date: 05. March 2006
; OS: Windows, Linux, MacOS
; Demo: Yes

If Not InitSprite() Or Not InitKeyboard()
	MessageRequester("Error!", "There was an error during initialization of sprite and keyboard enviroment.")
	End
EndIf

ExamineDesktops()
screenwidth  = DesktopWidth(0) : screenheight = DesktopHeight(0) : screendepth  = DesktopDepth(0)

#Windowed   = 0
#Fullscreen = 1
NewMode = #Fullscreen

Procedure.l SwitchScreen(NewMode)
	Shared screenwidth, screenheight, screendepth
	If NewMode = #Windowed
		CloseScreen()
		If OpenWindow(0, 0, 0, 260, 260, "Press F1 to switch to fullscreen...", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
			OpenWindowedScreen(WindowID(0), 0, 0, 260, 260, 0, 0, 0)
		EndIf
	Else   ; NewMode = #Fullscreen
		CloseScreen()
		CloseWindow(0)
		OpenScreen(screenwidth, screenheight, screendepth, "Switch between fullscreen and windowed screen...")
	EndIf
	ProcedureReturn NewMode
EndProcedure

If OpenScreen(screenwidth, screenheight, screendepth, "Switch between fullscreen and windowed screen...")

	Repeat
		If NewMode = #Windowed
			Event.l = WindowEvent()
		Else
			Event = 0
		EndIf
		If Event = #PB_Event_CloseWindow
			End
		Else
			FlipBuffers()
			ClearScreen(RGB(0, 0, 0))
			StartDrawing(ScreenOutput())
				Box(30, 30, 200, 200, RGB(255, 255, 255))
				Circle(130, 130, 70, RGB(255, 0, 0))
				DrawingMode(1)
				DrawText(5, 5, "Press F1 to switch to windowed screen...", RGB(255, 255, 255))
			StopDrawing()

			ExamineKeyboard()
			If KeyboardReleased(#PB_Key_F1)
				If NewMode = #Fullscreen
					; If IsScreenActive()   ; fullscreen is active
					; Debug 1
					NewMode = SwitchScreen(#Windowed)
				Else
					; Debug 0             ; windowed mode is active
					NewMode = SwitchScreen(#Fullscreen)
				EndIf
			EndIf

			If KeyboardPushed(#PB_Key_Escape)
				End
			EndIf

		EndIf

	ForEver

	End

EndIf
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Herzlichen Dank euch drei :allright:

Habe diese Codes nun schon integriert und euch natürlich auch in die jeweiligen "Code-Credits" aufgenommen... :wink:

Hier der neueste Stand der Liste:

http://www.purearea.net/temp/CodeArchiv ... n-Blitz.pb
http://www.purearea.net/temp/CodeArchiv ... ceBalls.pb
http://www.purearea.net/temp/CodeArchiv ... tButton.pb
http://www.purearea.net/temp/CodeArchiv ... on_xxxx.pb
http://www.purearea.net/temp/CodeArchiv ... olorBox.pb
http://www.purearea.net/temp/CodeArchiv ... ombobox.pb
http://www.purearea.net/temp/CodeArchiv ... ler_xxx.pb
http://www.purearea.net/temp/CodeArchiv ... rpreter.pb
http://www.purearea.net/temp/CodeArchiv ... reeView.pb
http://www.purearea.net/temp/CodeArchiv ... ast_Len.pb
http://www.purearea.net/temp/CodeArchiv ... ePlayer.pb
http://www.purearea.net/temp/CodeArchiv ... ation3D.pb
http://www.purearea.net/temp/CodeArchiv ... ulation.pb
http://www.purearea.net/temp/CodeArchiv ... ndow_xx.pb
http://www.purearea.net/temp/CodeArchiv ... section.pb
http://www.purearea.net/temp/CodeArchiv ... nctions.pb
http://www.purearea.net/temp/CodeArchiv ... andling.pb
http://www.purearea.net/temp/CodeArchiv ... ap_xxxx.pb
http://www.purearea.net/temp/CodeArchiv ... -Editor.pb
http://www.purearea.net/temp/CodeArchiv ... Example.pb
http://www.purearea.net/temp/CodeArchiv ... ldItems.pb
http://www.purearea.net/temp/CodeArchiv ... pSoap32.pb
http://www.purearea.net/temp/CodeArchiv ... dSprite.pb
http://www.purearea.net/temp/CodeArchiv ... new_xxx.pb
http://www.purearea.net/temp/CodeArchiv ... eeClass.pb
http://www.purearea.net/temp/CodeArchiv ... enSaver.pb
http://www.purearea.net/temp/CodeArchiv ... dTetris.pb
http://www.purearea.net/temp/CodeArchiv ... ingGrid.pb
http://www.purearea.net/temp/CodeArchiv ... ShowMap.pb
http://www.purearea.net/temp/CodeArchiv ... Drawing.pb
http://www.purearea.net/temp/CodeArchiv ... ffering.pb
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

http://www.purearea.net/temp/CodeArchiv ... ast_Len.pb

Ist bei mir um 300 ms schneller, unterstuetzt nur kein Unicode.

http://www.purearea.net/temp/CodeArchiv ... ndow_xx.pb

Keine Ahnung ob es vorher genauso 'gesprungen' ist /:->
Skinwin hab ich auskommentiert.

Code: Alles auswählen

; German forum: http://www.purebasicforums.com/german/viewtopic.php?t=2890&highlight=
; Author: Konne
; Date: 08. April 2005
; OS: Windows
; Demo: No


; Make a physical correct jumping of a window...
; Lustige Procedure, um ein Fenster physikalisch korrekt springen zu lassen 

  
 ;              _________Physik_Fenster___________ 
  ;            |                                  | 
   ;           |Programmierer: Konstantin *****   | 
    ;          |Firma:         KoMaNi             | 
  ;            |                                  |    
  ;            |--------|Beschreibung|------------|  
     ;         |Ist eine lustige Procedure um ein | 
      ;        |Fenster springen zu lassen        | 
        ;      |__________________________________| 


Procedure PhysikFenster() 
  
  Protected Anziehung   ;Gibt die Geschwindigkeit der Anziehung an 
  Protected Huepfen     ;Gibt die Hüpfkraft an 
  Protected Abweichung  ;Gibt die Geschwindigkeit der Abweichung an 
  Protected Abweichung2 ;Gibt die Seitliche Abweichung nach rechts + | links- an 
  Protected Anziehung2  ;Gibt die Anziehung nach unten + | oben- an 
  Protected Geschwindigkeit  ;Gibt an wie oft das Fenster verschoben wird 
  Protected WHoehe      ;Bild Hoehe 
  Protected WBreite     ;Bildbreite 
  Protected Breite      ;Breiten koordinaten start punkt 
  Protected Hoehe       ;Gibt die Hoehe des Fensters aus (zB zum Debugen) 
  Protected oldHoehe    ;Brechnung der max. Hoehe 
  Protected AufHoehe    ;Auflösung Hoehe 
  Protected AufBreite   ;Auflösung Breite 
  Protected i           ;Zähl Variable 
  Protected v           ;Zähl Variable 
  Protected c           ;Zähl Variable 
  Protected l           ;Zähl Variable 
  Protected a           ;Zähl Variable 
  Protected x           ;Zähl Variable 
  
  
  ;______Hier_können_die_einzelnen_Faktoren_geändert_werden___________________________________________ 
  
  Anziehung      =10   ;Je mehr desto schwächer 
  Huepfen        =15  ;Je mehr deto höher 
  Abweichung     =1   ;weniger is mehr 
  
  
  ;______Änderungen_hier_können_zu_einem_Ruckeln_führen_______________________________________________ 
  
  Abweichung2    =5   ;5 ist gut, mehr is mehr 
  Anziehung2     =3   ;3 ist gut 
  Geschwindigkeit=10  ;Bild refresh zeit 
  
  
  
  ;______Fenstereinstellungen_________________________________________________________________________ 
  
  WHoehe       =369  ;Hoehe des Bildes 
  WBreite      =548  ;Breite des Bildes 
  Breite       =100  ;Je mehr desto weiter rechts 
  
  ;___________________________________________________________________________________________________ 
  
  
  
  
  ;UseJPEGImageDecoder()  ;Um JPGs einbinden zu können 
  
  If OpenWindow(1,Breite,0, WBreite, WHoehe, "Physik", #PB_Window_Invisible|#PB_Window_SystemMenu) ;Fenster erstellen 
    
    
    
    ;SkinWin(WindowID(1),CatchImage(0,?SkinPicture))    ;Fenster erstellen 
    
    
    HideWindow(1,0)   ;Fenster anzeigen 
  EndIf 
  
  
  i=1            
  v=0 
  oldHoehe=8000          ;NUR zur höhenmessung benötigt 
  
  ExamineDesktops()   ;Die Auflösung auslesen um das Bild dynamisch zur Auflösung springen zu lassen 
  
  AufHoehe=DesktopHeight(0)  ;Hoehe ermitteln 
  AufBreite=DesktopWidth(0)  ;Breite ermitteln 
  
  Repeat            ;Hauptschleife öffnen 
    e = WaitWindowEvent(Geschwindigkeit)
    
    if not e
      oldticks=GetTickCount_()  ;oldticks dem tickcount gleichstellen 
      
      
      If c=Abweichung And l=0       ;Seitliche Abweichung 
        Breite=Breite+Abweichung2      
        c=0 
      EndIf 
      
      If c=Abweichung And l=1 
        Breite=Breite-Abweichung2 
        c=0 
      EndIf 
      
      If v<3 
        c=c+1 
      EndIf 
      
      If Breite>AufBreite-WBreite 
        l=1 
      EndIf 
      
      If Breite<0 
        l=0 
      EndIf 
      
      ;________________________________________________________________ 
      
      
      If x=Anziehung  ;Berechnet die Anziehung 
        a=a+Anziehung2 
        x=0 
      EndIf 
      
      x=x+1 
      
      
      If v=0            ;lässt den Gegenstand fallen 
        Hoehe=Hoehe+a 
      EndIf 
      
      
      If  Hoehe=>AufHoehe-30-WHoehe And v=0  ;Wenn es den Boden erreicht... 
        v=1 
        a=0 
        oldHoehe=AufHoehe+800 
        y=0 
      EndIf 
      
      If v=1                                ;Aufspringen 
        If Huepfen/i> 1.5 
          Hoehe=Hoehe-Huepfen+a+i*2.5+1 
          
          If Hoehe>AufHoehe-30-WHoehe 
            i=i+1 
            a=0 
            oldHoehe=AufHoehe+800 
            y=0 
          EndIf 
          
        Else 
          v=2 
        EndIf 
      EndIf 
      
      
      If v=2 And Hoehe>AufHoehe-WHoehe-30     ;wenn es auf dem Boden ist... 
        v=3 
        Hoehe=AufHoehe+60-WHoehe 
        ResizeWindow(1,Breite, Hoehe,#PB_Ignore,#PB_Ignore)
        Delay(500) 
      EndIf 
      
      If v=3                    ;Bild runterziehen ... 
        s=s+2 
        Hoehe=Hoehe+s 
        Delay(10) 
        If Hoehe > AufHoehe+200 
          v=4 
          a=0 
        EndIf 
      EndIf 
      
      If v=4                     ;Bild hochspringen lassen... 
        Hoehe=Hoehe-50 
        Delay(10) 
      EndIf 
      
      If v=4 And Hoehe<0           ;Wenn es oben ist die ganze sache nomal wiederholen 
        i=1 
        v=0 
        a=0 
      EndIf 
      
      ;_________Höchster Punkt ausrechnen (nicht nötig)_____________________________________ 
      
      
      ;Höchsten Punkt ausrechnen 
      
      If Hoehe < oldHoehe 
        oldHoehe = Hoehe 
        
        ;  If y=1 
        
      EndIf 
      
      ;Höchsten Punkt debugen 
      
      If Hoehe > oldhoehe And y=0 
        Debug(oldHoehe)  
        y=y+1 
        
      EndIf 
      
      
      
      ;________________________________________________________________- 
      
      
      ResizeWindow(1,Breite, Hoehe,#PB_Ignore,#PB_Ignore)    ;Fenster an die angegebenen Koordinaten bewegen 
      
      
      
      ;___________________________________________________________________________________________ 
      
    endif
    
  ForEver 
EndProcedure 

physikfenster()   ;Ruft das Programm auf 


; DataSection 
; SkinPicture: 
; IncludeBinary "Bilder\bg1.jpg" 
; EndDataSection 


; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
http://www.purearea.net/temp/CodeArchiv ... reeView.pb

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=4478&highlight=
; Author: FWeil (updated for PB 4.00 by Andre)
; Date: 28. August 2002
; OS: Windows
; Demo: No

;================================================================
;
; EnumWindows TreeView
; F.Weil 20020828
;
; Two linked lists are used for both parent windows and children objects
;
; Each list is updated using a callback Enum procedure
;
; The Tree gadget is build when opening the program's main window
; then you have just to click the items / nodes and surf.
;
; This program has a resizing feature linking the tree gadget size to the main window.
;
; I choosed to put all handle, text and class name information in a single label in the
; tree gadget for each item, so that no more action is necessary except looking labels.
;
; I also tried a List icon gadget version of this program but this tree gadget version is
; really simple and convenient for any further feature to add later.
;
; Feel free to modify update this code sample for any use in the PureBasic community.
;

Structure FindWindowData
  hFW.l ; variable to store a handle
  sFW.s ; variable to store a Window name
  cFW.s ; variable to store a window class name
EndStructure

Global NewList FindWindow.FindWindowData()
Global NewList FindChild.FindWindowData()

Procedure.l EnumChildProc(hChild, lParam)
  ChildName.s = Space(255)
  ChildClass.s = Space(255)
  If GetWindowText_(hChild, @ChildName, 255)
  Else
    SendMessage_(hChild, #WM_GETTEXT, 255, ChildName)
  EndIf
  If GetClassName_(hChild, @ChildClass, 255)
    AddElement(FindChild())
    FindChild()\hFW = hChild
    FindChild()\sFW = ChildName
    FindChild()\cFW = ChildClass
  EndIf
  ProcedureReturn 1
EndProcedure

Procedure.l EnumWindowsProc(hFind, lParam)
  WindowName.s = Space(255)
  WindowClass.s = Space(255)
  If GetWindowText_(hFind, WindowName, 255)
    Result = GetClassName_(hFind, WindowClass, 255)
    AddElement(FindWindow())
    FindWindow()\hFW = hFind
    FindWindow()\sFW = WindowName
    FindWindow()\cFW = WindowClass
  EndIf
  ProcedureReturn 1
EndProcedure

;
; Main starts here
;

WEvent.l
WindowXSize.l
WindowYSize.l
Quit.l

Quit = #False
WindowXSize = 320
WindowYSize = 240

If OpenWindow(0, 200, 200, WindowXSize, WindowYSize, "MyWindow", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar)
  CreateGadgetList(WindowID(0))
  TreeGadget(100, 0, 0, WindowXSize, WindowYSize, #PB_Tree_AlwaysShowSelection)
  If EnumWindows_(@EnumWindowsProc(), 0)
    ResetList(FindWindow())
    While NextElement(FindWindow())
      AddGadgetItem(100, -1, FindWindow()\sFW + " - " + FindWindow()\cFW + " - " + Str(FindWindow()\hFW), 0, 0)
      ClearList(FindChild())
      If EnumChildWindows_(FindWindow()\hFW, @EnumChildProc(), 0)
        ;OpenTreeGadgetNode(100)
        ResetList(FindChild())
        While NextElement(FindChild())
          ;AddGadgetItem(100, -1, FindChild()\sFW + " - " + FindChild()\cFW + " - " + Str(FindChild()\hFW))
          AddGadgetItem(100, -1, FindChild()\sFW + " - " + FindChild()\cFW + " - " + Str(FindChild()\hFW), 0, 1)
        Wend
        ;CloseTreeGadgetNode(100)
      EndIf
    Wend
  EndIf
  
  Repeat
    WEvent = WaitWindowEvent()
    Select WEvent
      Case #PB_Event_CloseWindow
        Quit = #True
      Default
    EndSelect
    
    If WindowXSize <> WindowWidth(0) Or WindowYSize <> WindowHeight(0)
      WindowXSize = WindowWidth(0)
      WindowYSize = WindowHeight(0)
      ResizeGadget(100, 0, 0, WindowXSize, WindowYSize)
    EndIf
    
  Until Quit
  
EndIf

End
;================================================================
; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
; DisableDebugger

http://www.purearea.net/temp/CodeArchiv ... ap_xxxx.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=1279&highlight=
; Author: LittleFurz (updated for PB 4.00 by Andre)
; Date: 18. December 2004
; OS: Windows
; Demo: No


Procedure NewMenuIcon(id,color)
  CreateImage(id, 16, 16)
  
  StartDrawing(ImageOutput(id))
  box(0,0,16,16,color)
  StopDrawing()
  
  ProcedureReturn ImageID(id)
EndProcedure

Enumeration
  #MENU_OPEN
  #MENU_SAVE
  #MENU_SAVEAS
  #MENU_CLOSE
  #MENU_UNDO
  #MENU_REDO
EndEnumeration


OpenWindow(0, 10, 10, 200, 100, "Menu Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateMenu(0, WindowID(0))    ; hier beginnt das Erstellen des Menüs...
  MenuTitle("Datei")
  MenuItem(#MENU_OPEN   , "Open"   +Chr(9)+"Ctrl+O")
  MenuItem(#MENU_SAVE   , "Save"   +Chr(9)+"Ctrl+S")
  MenuItem(#MENU_SAVEAS , "Save as"+Chr(9)+"Ctrl+A")
  MenuItem(#MENU_CLOSE  , "Close"  +Chr(9)+"Ctrl+C")
  MenuTitle("Bearbeiten")
  MenuItem(#MENU_UNDO   , "Undo"   +Chr(9)+"Ctrl+Z")
  MenuItem(#MENU_REDO   , "Redo"   +Chr(9)+"Ctrl+Y")
EndIf

SetMenuItemBitmaps_(MenuID(0), #MENU_OPEN   , #MF_BYCOMMAND, NewMenuIcon(0,$FF0000), 0)
SetMenuItemBitmaps_(MenuID(0), #MENU_SAVE   , #MF_BYCOMMAND, NewMenuIcon(1,$0000FF), 0)
SetMenuItemBitmaps_(MenuID(0), #MENU_SAVEAS , #MF_BYCOMMAND, NewMenuIcon(2,$FF80FF), 0)
SetMenuItemBitmaps_(MenuID(0), #MENU_CLOSE  , #MF_BYCOMMAND, NewMenuIcon(3,$00FF80), 0)

SetMenuItemBitmaps_(MenuID(0), #MENU_UNDO   , #MF_BYCOMMAND, NewMenuIcon(4,$000080), 0)
SetMenuItemBitmaps_(MenuID(0), #MENU_REDO   , #MF_BYCOMMAND, NewMenuIcon(5,$FFFF00), 0)

Repeat
  
Until WaitWindowEvent() = #PB_Event_CloseWindow

; Hier ne kurze erklärung der API SetMenuItemBitmaps_():

; SetMenuItemBitmaps_(hMenu, uPosition, uFlags, hBitmapUnchecked, hBitmapChecked)
;
; hMenu            - hWnd zum Menü, wo sich das Menüitem befindet
; uPosition        - Position im Menü des Menüitems
; uFlags           - Keine Ahnung o_O. Sollte #MF_BYPOSITION bleiben
; hBitmapUnchecked - hWnd von einem Bild im Ram. Angezeigt, wenn sich vor dem Menüitem kein Häckchen befindet
; hBitmapChecked   - hWnd von einem Bild im Ram. Angezeigt, wenn sich vor dem Menüitem ein Häckchen befindet
;
; Setzt ein kleines Icon vor einem Menuitem im Menü. Kann dazu benutzt werden um ein Programm grafisch etwas aufzuwerten.
; 
;

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
http://www.purearea.net/temp/CodeArchiv ... n-Blitz.pb

Woher hast du das denn ? Ich habe keine Ahnung was das sein soll , PureFortran ? ;-)

http://www.purearea.net/temp/CodeArchiv ... ldItems.pb Habe aber das hier gefunden :
http://www.purebasic.fr/english/viewtop ... 0325#70325

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?p=70325#70325
; Author: GreenGiant 
; Date:  26. September 2004
; OS: Windows
; Demo: No 

#MIIM_STATE=1
#MFS_DEFAULT=4096

OpenWindow(0,0,0,400,400,"test",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreatePopupMenu(0)
MenuItem(0,"Normal1")
MenuItem(1,"Normal2")
MenuItem(2,"Bold")
MenuItem(3,"Normal3")

bold.MENUITEMINFO
bold\cbSize=SizeOf(bold)
bold\fMask=#MIIM_STATE
bold\fState=#MFS_DEFAULT
SetMenuItemInfo_(MenuID(0),2,#True,bold) ;2 specifies the item to be made bold

Repeat
  ev=WaitWindowEvent()
  If ev=#WM_RBUTTONUP
    DisplayPopupMenu(0,WindowID(0))
  EndIf
Until ev=#PB_Event_CloseWindow



http://www.purearea.net/temp/CodeArchiv ... ingGrid.pb

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=9263
; Author: einander (updated for PB 4.00 by Andre)
; Date: 22. January 2004
; OS: Windows
; Demo: No


; Problem: innerhalb der Event-Rountine wird zwar offensichtlich die Maus abgefragt, es passiert aber nichts...


;Stretching grid by Einander  (updated Sizes() procedure included)
;PB 3.81 - jan 22-2004

Enumeration
  #grid
  #IMG
EndEnumeration

Global Xmin, Ymin, Xmax, Ymax
Global _X, _Y, XX, YY, s$, MX, MY, MK, mxant, myant
Global  Xpoints, Ypoints

Global Dim Xgrid(0, 0) : Global Dim Ygrid(0, 0) : Global Dim Xstep.f(0) : Global Dim Ystep.f(0)

_X = GetSystemMetrics_(#SM_CXSCREEN) - 8 : _Y = GetSystemMetrics_(#SM_CYSCREEN) - 68
XX = _X / 2 : YY = _Y / 2
Global Dim PX(3) : Global Dim PY(3)

Procedure VarL(DIR, i) ; RET ELEM I DEL ARRAY CON DIRECCION DIR
  ProcedureReturn PeekL(DIR + i * 4) ; VALE COMO REEMPLAZO PARA PASAR ARRAYS A PROCS
EndProcedure

Procedure Near(x, y, ArrSize, DIR1, DIR2) ; ; retorna indice del elem de LOS ARRAYS EN DIR1, DIR2 mas Near a x,y
  MIN = $FFFF
  For i = 0 To ArrSize
    A = Sqr(Pow(x - VarL(DIR1, i), 2) + Pow(y - VarL(DIR2, i), 2))
    If A < MIN : MIN = A : IN = i: EndIf
  Next i
  ProcedureReturn IN
EndProcedure

Procedure.s LoadIMG()
  Show$ = "c:\"
  Pat$ = "BitMap (*.BMP)|*.bmp;*.bmp|Jpg (*.jpg)|*.bmp|All files (*.*)|*.*"
  File$ = OpenFileRequester("Choose file to load", Show$, Pat$, 0)
  If File$
    ProcedureReturn File$
  Else
    End
  EndIf
EndProcedure

Procedure MOU(Ev)
  Select Ev
    Case #WM_LBUTTONDOWN
      If MK = 2 : MK = 3 : Else : MK = 1 : EndIf
    Case #WM_LBUTTONUP
      If MK = 3 : MK = 2 : Else : MK = 0 : EndIf
    Case #WM_RBUTTONDOWN
      If MK = 1 : MK = 3 : Else : MK = 2 : EndIf
    Case #WM_RBUTTONUP
      If MK = 3 : MK = 1 : Else : MK = 0 : EndIf
    Case #WM_MOUSEMOVE
      MX = WindowMouseX(0) - GetSystemMetrics_(#SM_CYSIZEFRAME)
      MY = WindowMouseY(0) - GetSystemMetrics_(#SM_CYCAPTION) - GetSystemMetrics_(#SM_CYSIZEFRAME)
  EndSelect
EndProcedure

Procedure Sizes()
  Xmax = 0 : Xmin = _X : Ymax = 0 : Ymin = _Y
  For i = 0 To 3
    x = PX(i) : y = PY(i)
    If x < Xmin : Xmin = x : EndIf
    If x > Xmax : Xmax = x : EndIf
    If y < Ymin : Ymin = y : EndIf
    If y > Ymax : Ymax = y : EndIf
  Next
  
  Xstep(0) = (PX(1) - PX(0)) / Xpoints ; step X horiz sup
  Ystep(0) = (PY(1)-PY(0)) / Xpoints ; step Y HOR SUP
  
  Xstep(1) = (PX(2) - PX(3)) / Xpoints ; stepX HOR INF
  Ystep(1) = (PY(2)-PY(3)) / Xpoints ; step Y HOR INF
  
  Xstep(2) = (PX(3) - PX(0)) / Ypoints ; step X VER IZQ
  Ystep(2) = (PY(3)-PY(0)) / Ypoints ; step Y VER IZQ
  
  Xstep(3) = (PX(2) - PX(1)) / Ypoints ; step X VER DER
  Ystep(3) = (PY(2)-PY(1)) / Ypoints ; step Y VER DER
  
  DXstep1.f=(Xstep(1)-Xstep(0))/Ypoints  ; para calcular posic horiz de cruces internos
  DpX1.f=(PX(3)-PX(0))/Ypoints
  DXstep2.f=(Ystep(1)-Ystep(0))/Ypoints
  DpX2.f=(PY(3)-PY(0))/Ypoints
  
  For j=0 To Ypoints
    For i = 0 To Xpoints  ; posic x  para verticales
      Xgrid(i, j) = (Xstep(0)+DXstep1*j)*i+PX(0)+DpX1*j : Ygrid(i, j) = (Ystep(0)+DXstep2*j)*i+PY(0)+DpX2*j
    Next
  Next
  
  DYstep1.f=(Xstep(3)-Xstep(2))/Xpoints  ; para calcular posic vert de cruces internos
  DpY1.f=(PX(1)-PX(0))/Xpoints
  DYstep2.f=(Ystep(3)-Ystep(2))/Xpoints
  DpY2.f=(PY(1)-PY(0))/Xpoints
  
  For j = 1 To Xpoints
    For i = 1 To Ypoints  ; posic Y  para horizontales
      Xgrid( j,i) = (Xstep(2)+DYstep1*j)*i+PX(0)+DpY1*j  :  Ygrid( j,i) = (Ystep(2)+DYstep2*j)*i+PY(0)+DpY2*j
    Next
  Next
EndProcedure ; _______________________________

Procedure ShowGrid()
  hIMG = CreateImage(#IMG, _X,_Y)
  StartDrawing (ImageOutput(#IMG))
  DrawingMode(4)
  BackColor(RGB(0,0,0))
  
  For i = 0 To 3
    Circle (PX(i) , PY(i) , 8,#Yellow)
    DrawText(PX(i) + 10, PY(i), Str(i))
  Next
  Box(Xmin, Ymin, Xmax-Xmin, Ymax-Ymin, #Blue)
  
  For i = 0 To Xpoints ; vertical lines
    LineXY(Xgrid( i, 0), Ygrid( i, 0), Xgrid(i, Ypoints ), Ygrid(i, Ypoints ),  #Green)
  Next
  
  For i = 0 To Ypoints ;horizontal lines
    LineXY(Xgrid(0,i), Ygrid(  0,i), Xgrid( Xpoints,i ), Ygrid( Xpoints,i ),  #Magenta)
  Next
  
  StopDrawing()
  StartDrawing(WindowOutput(0))
  SetGadgetState(#grid, ImageID(#IMG))
  StopDrawing()
EndProcedure
; ____________________________________________________________________________________________________

OpenWindow(0, 0, 0, _X, _Y, "", #WS_OVERLAPPEDWINDOW | #WS_MAXIMIZE)
CreateGadgetList(WindowID(0))
ImageGadget(#grid,0,0,0,0,0)

DisableGadget(#grid,#true)

Xpoints = 28 : Ypoints = 14; Here you can choose how many grid lines*********************************
Dim Xgrid (Xpoints , Ypoints )
Dim Ygrid (Xpoints , Ypoints )
Dim Xstep.f(3 ) : Dim Ystep.f(3 )

PX(0) = _X / 2-100 : PY(0) = _Y / 2-100 : PX(1) = PX(0) + 200 : PY(1) = PY(0)
PX(2) = PX(1) : PY(2) = PY(1) + 200 : PX(3) = PX(0) : PY(3) = PY(2)

Sizes()
ShowGrid()

Repeat
  Ev = WaitWindowEvent(10)
  
  MOU(Ev)
  
  If MX <> mxant Or MY <> myant Or MK <> mkant 
    If sel=0 :   C = Near(MX, MY, 3, @PX(), @PY()):sel=1:EndIf 
    If MK = 1 
      PX(C) = MX : PY(C) = MY
      Sizes()
      ShowGrid()
    Else
      sel=0
    EndIf
  EndIf
  mxant = MX : myant = MY : mkant = MK
Until Ev = #PB_Event_CloseWindow
End

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = --
; DisableDebugger
Zuletzt geändert von edel am 05.02.2007 03:07, insgesamt 3-mal geändert.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

http://www.purearea.net/temp/CodeArchiv ... ulation.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=4873&highlight=
; Author: coldarchon (updated for PB 4.00 by Andre)
; Date: 05. July 2004
; OS: Windows
; Demo: No

; PRoblem: der "Button on WebGadget" verschwindet letztlich doch hinter der INet-Seite

ScreenWidth = 640 
ScreenHeight = 480

hWnd = OpenWindow(0, 0, 0, ScreenWidth, ScreenHeight, "Button im Button", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered) 

CreateGadgetList(hWnd) 
ButtonGadget(1, ScreenWidth*0.4, ScreenHeight*0.4, ScreenWidth*0.2, ScreenHeight*0.2, "Button on WebGadget") 
WebGadget(0, 0, 0, ScreenWidth, ScreenHeight, "www.google.de") 
SetParent_(GadgetID(1),GadgetID(0))
SetActiveGadget(1)

Repeat 
  Event = WaitWindowEvent() 
  Select Event 
  EndSelect 
Until Event = #PB_Event_CloseWindow 
End
; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -


http://www.purearea.net/temp/CodeArchiv ... ombobox.pb

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=13454&highlight=
; Author: Sparkie (updated for PB 4.00 by Andre)
; Date: 23. December 2004
; OS: Windows
; Demo: No

; Dynamically expanding combobox
; make a combobox expand whilst it is being clicked so that the dropdown 
; menu is long enough to show data that is longer that the actual combobox.. 

If OpenWindow(0, 0, 0, 270, 240, "Resizable ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  TextGadget(0, 10, 10, 100, 20, "Items to view") 
  StringGadget(1, 120, 10, 50, 20, "8", #PB_String_Numeric) 
  ComboBoxGadget(2, 10, 40, 250, 100); -- Add #CBS_NOINTEGRALHEIGHT flag For WinXP 
  ; --> Get 3d border height 
  vEdge = GetSystemMetrics_(#SM_CYEDGE) 
  ; --> Number of items to view 
  itemsToView = Val(GetGadgetText(1)) 
  ; --> Get height of ComboBox selection field 
  cbSelectedItemHeight = SendMessage_(GadgetID(2), #CB_GETITEMHEIGHT, -1, 0) 
  ; --> get height of ComboBox item 
  cbListItemHeight = SendMessage_(GadgetID(2), #CB_GETITEMHEIGHT, 0, 0) 
  ; -- Resize adding 4 units of vEdge (2 for selection field and 2 for dropdown) 
  ResizeGadget(2, #PB_Ignore, #PB_Ignore, #PB_Ignore, cbSelectedItemHeight + (cbListItemHeight * itemsToView) + vEdge*4) 
  For a = 1 To 29 
    AddGadgetItem(2, -1, "ComboBox item " + Str(a)) 
  Next 
  Repeat 
    event = WaitWindowEvent() 
    If event = #PB_Event_Gadget And EventGadget() = 1 
      itemsToView = Val(GetGadgetText(1)) 
      If itemsToView > 0 And itemsToView < CountGadgetItems(2)+1 
        ResizeGadget(2, #PB_Ignore, #PB_Ignore, #PB_Ignore, cbSelectedItemHeight + (cbListItemHeight * itemsToView) + vEdge*4)  
      Else 
        MessageRequester("Error", "enter a number between 1 and " + Str(CountGadgetItems(2)), 0) 
        SetGadgetText(1, "8") 
      EndIf 
    EndIf 
  Until event = #PB_Event_CloseWindow 
EndIf 
End 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -

http://www.purearea.net/temp/CodeArchiv ... ffering.pb

Code: Alles auswählen

; German forum: http://forums.purebasic.com/german/viewtopic.php?t=3346&highlight=
; Author: Stefan
; Date: 14. May 2005
; OS: Windows
; Demo: No


;######################################## 
;# Use Triple Buffering in PureBasic    # 
;######################################## 

Structure DDPIXELFORMAT 
  dwSize.l 
  dwFlags.l 
  dwFourCC.l 
  dwRGBBitCount.l 
  dwRBitMask.l 
  dwGBitMask.l 
  dwBBitMask.l 
  dwRGBAlphaBitMask.l 
EndStructure 

Structure DDCOLORKEY 
  dwColorSpaceLowValue.l 
  dwColorSpaceHighValue.l 
EndStructure 

Structure DDSCAPS2 
  dwCaps.l 
  dwCaps2.l 
  dwCaps3.l 
  dwCaps4.l 
EndStructure 

Structure DDSURFACEDESC2 
  dwSize.l 
  dwFlags.l 
  dwHeight.l 
  dwWidth.l 
  lPitch.l 
  dwBackBufferCount.l 
  dwRefreshRate.l 
  dwAlphaBitDepth.l 
  dwReserved.l 
  lpSurface.l 
  ddckCKDestOverlay.DDCOLORKEY 
  ddckCKDestBlt.DDCOLORKEY 
  ddckCKSrcOverlay.DDCOLORKEY 
  ddckCKSrcBlt.DDCOLORKEY 
  ddpfPixelFormat.DDPIXELFORMAT 
  ddsCaps.DDSCAPS2 
  dwTextureStage.l 
EndStructure 

#DDSD_CAPS=1 
#DDSD_BACKBUFFERCOUNT=32 
#DDSCAPS_BACKBUFFER=4 
#DDSCAPS_3DDEVICE=8192 
#DDSCAPS_PRIMARYSURFACE=512 
#DDSCAPS_FLIP=16 
#DDSCAPS_COMPLEX=8 



Procedure OpenScreenEx(Width,Height,bpp,NbOfBuffers,Title$) ;doesn't work with the OGRE-Engine. 
  !extrn _PB_Engine3D_Initialized 
  !extrn _PB_DirectX_PrimaryBuffer 
  !extrn _PB_DirectX_BackBuffer 
  !extrn _PB_DDrawBase 
  
  If NbOfBuffers<2:ProcedureReturn 0:EndIf ; We need at least double buffering. 
  
  OGREUsed.l 
  *FrontDDS.IDirectDrawSurface7 
  *BackDDS.IDirectDrawSurface7 
  *DD.IDirectDraw7 
  
  !MOV Eax,[_PB_Engine3D_Initialized] 
  !MOV [p.v_OGREUsed],Eax 
  
  If OGREUsed:ProcedureReturn 0:EndIf     ;We can't change the number of Buffers if we use the OGRE-Engine. 
  OpenScreenResult=OpenScreen(Width,Height,bpp,Title$) 
  If OpenScreenResult=0:ProcedureReturn 0:EndIf 
  
  !MOV Eax,[_PB_DirectX_PrimaryBuffer] 
  !MOV [p.p_FrontDDS],Eax 
  !MOV Eax,[_PB_DirectX_BackBuffer] 
  !MOV [p.p_BackDDS],Eax 
  !MOV Eax,[_PB_DDrawBase] 
  !MOV [p.p_DD],Eax 
  
  If NbOfBuffers>2 ; change the number of Buffers. 
    
    DDSDESC.DDSURFACEDESC2 
    DDSDESC\dwSize=SizeOf(DDSURFACEDESC2) 
    
    
    If *FrontDDS\GetSurfaceDesc(DDSDESC) 
      CloseScreen():ProcedureReturn 0 
    EndIf 
    
    DEVICE3D=DDSDESC\ddsCaps\dwCaps&#DDSCAPS_3DDEVICE 
    
    RtlZeroMemory_(DDSDESC,SizeOf(DDSURFACEDESC2)) 
    
    DDSDESC\dwSize=SizeOf(DDSURFACEDESC2) 
    DDSDESC\dwFlags=#DDSD_CAPS|#DDSD_BACKBUFFERCOUNT 
    DDSDESC\ddsCaps\dwCaps=#DDSCAPS_PRIMARYSURFACE|#DDSCAPS_FLIP|#DDSCAPS_COMPLEX|DEVICE3D 
    DDSDESC\dwBackBufferCount=NbOfBuffers-1 
    
    ;*BackDDS\Release() is automatically released 
    *FrontDDS\Release() 
    
    *BackDDS=0 
    *FrontDDS=0 
    
    !MOV dword[_PB_DirectX_PrimaryBuffer],0 
    !MOV dword[_PB_DirectX_BackBuffer],0 
    
    Result=*DD\CreateSurface(DDSDESC,@*FrontDDS,0) 
    If Result:ProcedureReturn 0:EndIf 
    
    ddsCaps.DDSCAPS2 
    ddsCaps\dwCaps=#DDSCAPS_BACKBUFFER    
    Result=*FrontDDS\GetAttachedSurface(ddsCaps,@*BackDDS) 
    If Result:*FrontDDS\Release():ProcedureReturn 0:EndIf 
    
    !MOV Eax,[p.p_FrontDDS] 
    !MOV dword[_PB_DirectX_PrimaryBuffer],Eax 
    !MOV Eax,[p.p_BackDDS] 
    !MOV dword[_PB_DirectX_BackBuffer],Eax 
  EndIf 
  
  ProcedureReturn OpenScreenResult 
EndProcedure 






;Example: 


InitSprite() 
InitSprite3D() 
InitKeyboard() 
Result=OpenScreenEx(800,600,16,3,"Triple Buffering Test") 

If Result=0 
  MessageRequester("ERROR","Can't open screen !") 
  End 
EndIf 


CreateSprite(1,64,64,#PB_Sprite_Texture) 
font = LoadFont(1,"Arial Black",10)

StartDrawing(SpriteOutput(1)) 
Box(0,0,64,64,#Yellow) 
DrawingFont(font) 
DrawingMode(1) 
FrontColor(RGB(0,0,128))
DrawText(0, 0, "Enjoy") 
DrawText(0, 18, "Triple-") 
DrawText(0, 36, "buffering") 
StopDrawing() 
CreateSprite3D(1,1) 


RandomSeed(3) 


For count=0 To 2   ; fill all 3 buffers 
  ClearScreen(RGB(0,0,0))
  Start3D() 
  Sprite3DQuality(1) 
  ZoomSprite3D(1,256,256) 
  RotateSprite3D(1,30,0) 
  DisplaySprite3D(1,Random(800-256),Random(600-256)) 
  Stop3D() 
  FlipBuffers() 
  Delay(500) 
Next 

Repeat 
  FlipBuffers() 
  Delay(500) 
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -

http://www.purearea.net/temp/CodeArchiv ... olorBox.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?p=30868#30868
; Author: Stefan
; Date: 07. April 2005
; OS: Windows
; Demo: No


; Speed-improved colorbox drawing via DirectX, also usable for a partwise ClearScreen
; Geschwindigkeitsoptimierte Variante für das Zeichnen einer Farbbox

Structure DDBLTFX 
  dwSize.l 
  dwDDFX.l 
  dwROP.l 
  dwDDROP.l 
  dwRotationAngle.l 
  dwZBufferOpCode.l 
  dwZBufferLow.l 
  dwZBufferHigh.l 
  dwZBufferBaseDest.l 
  dwZDestConstBitDepth.l 
  dwZDestConst.l 
  dwZSrcConstBitDepth.l 
  dwZSrcConst.l 
  dwAlphaEdgeBlendBitDepth.l 
  dwAlphaEdgeBlend.l 
  dwReserved.l 
  dwAlphaDestConstBitDepth.l 
  dwAlphaDestConst.l 
  dwAlphaSrcConstBitDepth.l 
  dwAlphaSrcConst.l 
  dwFillColor.l 
  dwColorSpaceLowValue.l 
  dwColorSpaceHighValue.l 
  dwColorSpaceLowValue2.l 
  dwColorSpaceHighValue2.l 
EndStructure 
#DDBLT_COLORFILL=1024 
#DDBLT_WAIT=16777216 

Procedure _GetScreenWidth() 
  !extrn _PB_Screen_Width  
  !MOV Eax,[_PB_Screen_Width ] 
  ProcedureReturn 
EndProcedure 
Procedure _GetScreenHeight() 
  !extrn _PB_Screen_Height 
  !MOV Eax,[_PB_Screen_Height] 
  ProcedureReturn 
EndProcedure 
Procedure _GetPixelFormat() 
  !extrn _PB_DirectX_PixelFormat 
  !MOV Eax,[_PB_DirectX_PixelFormat] 
  ProcedureReturn 
EndProcedure 
Procedure _GetBackBufferSurface() 
  !extrn _PB_Sprite_CurrentBitmap 
  !MOV Eax,[_PB_Sprite_CurrentBitmap] 
  ProcedureReturn 
EndProcedure 
Procedure _RGBColor(R,G,B) 
  Select _GetPixelFormat() 
    Case #PB_PixelFormat_15Bits 
      ProcedureReturn B>>3+(G>>3)<<5+(R>>3)<<10 
    Case #PB_PixelFormat_16Bits    
      ProcedureReturn B>>3+(G>>2)<<5+(R>>3)<<11    
    Case #PB_PixelFormat_24Bits_RGB 
      ProcedureReturn R+G<<8+B<<16 
    Case #PB_PixelFormat_24Bits_BGR    
      ProcedureReturn b+G<<8+R<<16 
    Case #PB_PixelFormat_32Bits_RGB    
      ProcedureReturn R+G<<8+B<<16 
    Case #PB_PixelFormat_32Bits_BGR 
      ProcedureReturn B+G<<8+R<<16    
  EndSelect 
EndProcedure 


Procedure DrawColorBox(x,y,width,height,RGB)
  *Back.IDirectDrawSurface7=_GetBackBufferSurface()
  
  a.rect\left=x
  a\right=x+width
  a\top=y
  a\bottom=y+height
  
  b.rect\left=0
  b\right=_GetScreenWidth()
  b\top=0
  b\bottom=_GetScreenHeight()
  
  If IntersectRect_(dest.rect,a.rect,b.rect)=0:ProcedureReturn 0:EndIf
  
  BltInfo.DDBLTFX\dwSize=SizeOf(DDBLTFX)
  BltInfo\dwFillColor=_RGBColor(Red(RGB),Green(RGB),Blue(RGB))
  
  ProcedureReturn *Back\Blt(dest,0,0,#DDBLT_COLORFILL|#DDBLT_WAIT,BltInfo)
EndProcedure


InitSprite()
InitKeyboard()
OpenScreen(800,600,16,"Fast colorboxes")

Repeat
  ClearScreen(0) 
  
  For c=0 To 300
    DrawColorBox(100,100,50,50,#red)
  Next
  
  
  Count+1
  If ElapsedMilliseconds()-Start=>1000:Start=ElapsedMilliseconds():FPS=Count:Count=0:EndIf
  
  StartDrawing(ScreenOutput())
  DrawText(0,0,Str(FPS))
  StopDrawing()
  
  FlipBuffers(0)
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_All)
; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = --
; DisableDebugger
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

http://www.purearea.net/temp/CodeArchiv ... dTetris.pb http://www.purearea.net/temp/CodeArchiv ... Drawing.pb

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=17030
; Author: Dr. Dri
; Date: 03. October 2005
; OS: Windows
; Demo: No


Procedure IsDrawing() 
  !extrn _PB_2DDrawing_GlobalStructure
  !MOV EAX,[_PB_2DDrawing_GlobalStructure] 
  ProcedureReturn 
EndProcedure 

Procedure Triangle(x1.l, y1.l, x2.l, y2.l, x3.l, y3.l) 
  ProcedureReturn Polygon_(IsDrawing(), @x1, 3) 
EndProcedure 

Structure Point3D 
  x.f 
  y.f 
  z.f 
EndStructure 

Structure Face3D 
  points.Long[3] 
  color.l 
EndStructure 

Structure Object3D 
  ;position 
  x.f 
  y.f 
  z.f 
  ;orientation 
  ax.f 
  ay.f 
  az.f 
  ;proportion 
  sx.f 
  sy.f 
  sz.f 
  nPoints.l 
  *points.Point3D 
  nFaces.l 
  *faces.Face3D 
EndStructure 

DataSection 
cube_points: 
Data.f -0.5, -0.5, -0.5 
Data.f -0.5, -0.5,  0.5 
Data.f -0.5,  0.5, -0.5 
Data.f -0.5,  0.5,  0.5 
Data.f  0.5, -0.5, -0.5 
Data.f  0.5, -0.5,  0.5 
Data.f  0.5,  0.5, -0.5 
Data.f  0.5,  0.5,  0.5 
cube_faces: 
Data.l 1, 3, 7, $0000FF 
Data.l 1, 7, 5, $0000FF 
Data.l 0, 4, 6, $00FF00 
Data.l 0, 6, 2, $00FF00 
Data.l 2, 6, 7, $FF0000 
Data.l 2, 7, 3, $FF0000 
Data.l 0, 1, 5, $00FFFF 
Data.l 0, 5, 4, $00FFFF 
Data.l 0, 2, 3, $FF00FF 
Data.l 0, 3, 1, $FF00FF 
Data.l 4, 5, 7, $FFFF00 
Data.l 4, 7, 6, $FFFF00 
EndDataSection 

Procedure Face3D_Render(*o.Object3D, face.l, cax.f, sax.f, cay.f, say.f, caz.f, saz.f) 
  Protected x1.l, y1.l, x2.l, y2.l, x3.l, y3.l, *p.Point, i.l, color.l, p.l, *p3D.Point3D 
  Protected x.f, y.f, z.f, tx.f, ty.f, tz.f, l.l, h.l, distance.f, visible.l, *f3D.Face3D 
  
  l = DesktopWidth (0) / 2 
  h = DesktopHeight(0) / 2 
  distance = l * 1.15470052 
  
  *p   = @x1 
  *f3D = *o\faces + face * SizeOf(Face3D) 
  While i < 3 
    p    = *f3D\points[i]\l 
    *p3D = *o\points + p * SizeOf(Point3D) 
    
    x = *p3D\x * *o\sx 
    y = *p3D\y * *o\sy 
    z = *p3D\z * *o\sz 
    
    ;rotation autour de l'axe x 
    ty = y : tz = z 
    y = cax * ty - sax * tz 
    z = sax * ty + cax * tz 
    
    ;rotation autour de l'axe y 
    tx = x : tz = z 
    x = say * tz + cay * tx 
    z = cay * tz - say * tx 
    
    ;rotation autour de l'axe z 
    tx = x : ty = y 
    x = caz * tx - saz * ty 
    y = saz * tx + caz * ty 
    
    x + *o\x 
    y + *o\y 
    z + *o\z 
    
    *p\x = l + distance * x / z 
    *p\y = h - distance * y / z 
    
    i  + 1 
    *p + SizeOf(Point) 
  Wend 
  
  visible = (x1 * y2) - (y1 * x2) + (x2 * y3) - (y2 * x3) + (x3 * y1) - (y3 * x1) 
  If visible < 0 
    color = *f3D\color 
    FrontColor(color)
    Triangle(x1, y1, x2, y2, x3, y3) 
    FrontColor(RGB(0, 0, 0))
  EndIf 
EndProcedure 

Procedure Object3D_Render(*o.Object3D) 
  Protected ax.f, ay.f, az.f, i.l 
  Protected cax.f, sax.f, cay.f, say.f, caz.f, saz.f 
  
  ax = *o\ax * 0.01745329 
  ay = *o\ay * 0.01745329 
  az = *o\az * 0.01745329 
  
  cax = Cos(ax) : sax = Sin(ax) 
  cay = Cos(ay) : say = Sin(ay) 
  caz = Cos(az) : saz = Sin(az) 
  
  While i < *o\nFaces 
    Face3D_Render(*o, i, cax, sax, cay, say, caz, saz) 
    i + 1 
  Wend 
EndProcedure 

Rectangle.Object3D 
Rectangle\z       = 50.0 
Rectangle\sx      = 20.0 
Rectangle\sy      = 10.0 
Rectangle\sz      =  5.0 
Rectangle\nPoints =  8 
Rectangle\points  = ?cube_points 
Rectangle\nFaces  = 12 
Rectangle\faces   = ?cube_faces 

InitSprite() 
InitKeyboard() 

ExamineDesktops() 
OpenWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0), "", 0) 
OpenScreen(DesktopWidth(0), DesktopHeight(0), DesktopDepth(0), "") 

Repeat 
  ClearScreen(RGB(0, 0, 0))
  ExamineKeyboard() 
  
  If StartDrawing( ScreenOutput() ) 
    Object3D_Render(Rectangle) 
    StopDrawing() 
  EndIf 
  
  Rectangle\ax + 1 
  Rectangle\ay + 2 
  Rectangle\az + 3 
  If Rectangle\ax > 360 : Rectangle\ax - 360 : EndIf 
  If Rectangle\ay > 360 : Rectangle\ay - 360 : EndIf 
  If Rectangle\az > 360 : Rectangle\az - 360 : EndIf 
  
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape)


; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
; EnableXP
; DisableDebugger
http://www.purearea.net/temp/CodeArchiv ... dSprite.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=1151&start=10
; Author: S.M. (updated for PB 4.00 by Andre)
; Date: 10. December 2004
; OS: Windows
; Demo: 


; Der Code unterstützt jetzt sogar Clipping und benötigt keine externe Libraries mehr. 
; Anstelle von UseBuffer(Sprite) musst du StartDrawing(SpriteOutput(Sprite)) benutzen.

#DDLOCK_WAIT=1 

Structure DDPIXELFORMAT 
  dwSize.l 
  dwFlags.l 
  dwFourCC.l 
  dwRGBBitCount.l 
  dwRBitMask.l 
  dwGBitMask.l 
  dwBBitMask.l 
  dwRGBAlphaBitMask.l 
EndStructure 



Structure DDCOLORKEY 
  dwColorSpaceLowValue.l 
  dwColorSpaceHighValue.l 
EndStructure 

Structure DDSCAPS2 
  dwCaps.l 
  dwCaps2.l 
  dwCaps3.l 
  dwCaps4.l 
EndStructure 

Structure DDSURFACEDESC2 
  dwSize.l 
  dwFlags.l 
  dwHeight.l 
  dwWidth.l 
  lPitch.l 
  dwBackBufferCount.l 
  dwRefreshRate.l 
  dwAlphaBitDepth.l 
  dwReserved.l 
  lpSurface.l 
  ddckCKDestOverlay.DDCOLORKEY 
  ddckCKDestBlt.DDCOLORKEY 
  ddckCKSrcOverlay.DDCOLORKEY 
  ddckCKSrcBlt.DDCOLORKEY 
  ddpfPixelFormat.DDPIXELFORMAT 
  ddsCaps.DDSCAPS2 
  dwTextureStage.l 
EndStructure 

Structure PB_Sprite 
  Sprite.l 
  Width.w 
  Height.w 
  Depth.w 
  Mode.w 
  FileName.l 
  RealWidth.w 
  RealHeight.w 
  ClipX.w 
  ClipY.w 
EndStructure 

Procedure GetCurrentBuffer() 
  !extrn _PB_Sprite_CurrentBitmap 
  !MOV Eax,[_PB_Sprite_CurrentBitmap] 
  ProcedureReturn 
EndProcedure 

Procedure GetPixelFormat() 
  !extrn _PB_DirectX_PixelFormat 
  !MOV Eax,[_PB_DirectX_PixelFormat] 
  ProcedureReturn 
EndProcedure 

Procedure _ScreenWidth() 
  !extrn _PB_Screen_Width 
  !MOV Eax,[_PB_Screen_Width] 
  ProcedureReturn 
EndProcedure 

Procedure _ScreenHeight() 
  !extrn _PB_Screen_Height 
  !MOV Eax,[_PB_Screen_Height] 
  ProcedureReturn 
EndProcedure 







Procedure PutRotatedSprite(Sprite,XPos,YPos,Angle.f) 
  
  *Sprite.PB_Sprite=IsSprite(Sprite) 
  
  If *Sprite=0:ProcedureReturn 0:EndIf 
  
  Angle.f=Angle*0.017453; *(ACos(-1)*2)/360 
  
  Cos=Cos(Angle.f)*2048 
  Sin=Sin(Angle.f)*2048 
  NSin=-Sin 
  
  SpriteWidth=*Sprite\Width-1 
  SpriteHeight=*Sprite\Height-1 
  
  StartX=*Sprite\ClipX 
  StartY=*Sprite\ClipY 
  EndX=SpriteWidth+StartX 
  EndY=SpriteHeight+StartY 
  
  SpriteWidth2=(SpriteWidth)/2+StartX 
  SpriteHeight2=(SpriteHeight)/2+StartY 
  
  ScreenWidth=_ScreenWidth()-1 
  ScreenHeight=_ScreenHeight()-1 
  
  *SpriteDDS.IDirectDrawSurface7=*Sprite\Sprite 
  *DestDDS.IDirectDrawSurface7=GetCurrentBuffer() 
  
  SpriteDDSD2.DDSURFACEDESC2 
  DestDDSD2.DDSURFACEDESC2 
  
  SpriteDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  DestDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  
  *SpriteDDS\Lock(0,SpriteDDSD2,#DDLOCK_WAIT,0) 
  *DestDDS\Lock(0,DestDDSD2,#DDLOCK_WAIT,0) 
  
  SrcPitch=SpriteDDSD2\lPitch 
  DestPitch=DestDDSD2\lPitch 
  
  SrcAddr=SpriteDDSD2\lpSurface 
  DestAddr=DestDDSD2\lpSurface 
  
  PixelFormat=GetPixelFormat() 
  
  If PixelFormat=#PB_PixelFormat_8Bits 
    
    For y=StartY To EndY 
      *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX 
      
      Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
      Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
      For x=StartX To EndX  
        
        Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 
        Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
        
        If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
          
          PokeW(DestAddr+Yp*DestPitch+Xp,*SrcPtr\l) 
        EndIf 
        *SrcPtr+1 
      Next 
    Next    
    
  EndIf 
  
  If PixelFormat=#PB_PixelFormat_15Bits Or PixelFormat=#PB_PixelFormat_16Bits 
    
    For y=StartY To EndY 
      *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*2 
      
      Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
      Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
      For x=StartX To EndX  
        
        Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 
        Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
        
        If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
          
          PokeL(DestAddr+Yp*DestPitch+Xp*2,*SrcPtr\l) 
        EndIf 
        *SrcPtr+2 
      Next 
    Next    
  EndIf 
  
  
  If PixelFormat=#PB_PixelFormat_24Bits_RGB Or PixelFormat=#PB_PixelFormat_24Bits_BGR 
    
    For y=StartY To EndY 
      *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*3 
      
      Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
      Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
      For x=StartX To EndX  
        
        Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 
        Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
        
        If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
          
          Color=*SrcPtr\l 
          Addr=DestAddr+Yp*DestPitch+Xp*3 
          PokeW(Addr,Color) 
          PokeL(Addr+2,Color>>16|Color<<8) 
          
        EndIf 
        *SrcPtr+3 
      Next 
    Next    
  EndIf 
  
  If PixelFormat=#PB_PixelFormat_32Bits_RGB Or PixelFormat=#PB_PixelFormat_32Bits_BGR 
    
    For y=StartY To EndY 
      *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*4 
      
      Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
      Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
      For x=StartX To EndX  
        
        Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 
        Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
        
        If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
          
          Color=*SrcPtr\l 
          Addr=DestAddr+Yp*DestPitch+Xp*4 
          PokeL(Addr,Color) 
          PokeL(Addr+4,Color) 
          
        EndIf 
        *SrcPtr+4 
      Next 
    Next    
    
  EndIf 
  
  *SpriteDDS\UnLock(0) 
  *DestDDS\UnLock(0) 
  ProcedureReturn -1 
EndProcedure 


InitSprite() 
InitKeyboard() 

ExamineDesktops()

OpenScreen(DesktopWidth(0),DesktopHeight(0),16,"PutRotatedSprite()") 

LoadSprite(1,"..\examples\sources\data\Geebee2.bmp",#PB_Sprite_Memory);Pfad anpassen 

ClipSprite(1,10,10,50,50) 

Repeat 
  ExamineKeyboard() 
  Angle+1 
  
  ClearScreen(RGB(0,0,0))
  
  PutRotatedSprite(1,300,300,Angle) 
  
  FlipBuffers() 
  
Until KeyboardPushed(#PB_Key_Escape) 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -

http://www.purearea.net/temp/CodeArchiv ... new_xxx.pb

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/viewtopic.php?t=1151&start=10
; Author: S.M. (updated for PB 4.00 by Andre)
; Date: 11. December 2004
; OS: Windows
; Demo: Yes


#DDLOCK_WAIT=1 
#DDCKEY_SRCBLT=8 
Structure DDPIXELFORMAT 
  dwSize.l 
  dwFlags.l 
  dwFourCC.l 
  dwRGBBitCount.l 
  dwRBitMask.l 
  dwGBitMask.l 
  dwBBitMask.l 
  dwRGBAlphaBitMask.l 
EndStructure 

Structure DDCOLORKEY 
  dwColorSpaceLowValue.l 
  dwColorSpaceHighValue.l 
EndStructure 

Structure DDSCAPS2 
  dwCaps.l 
  dwCaps2.l 
  dwCaps3.l 
  dwCaps4.l 
EndStructure 

Structure DDSURFACEDESC2 
  dwSize.l 
  dwFlags.l 
  dwHeight.l 
  dwWidth.l 
  lPitch.l 
  dwBackBufferCount.l 
  dwRefreshRate.l 
  dwAlphaBitDepth.l 
  dwReserved.l 
  lpSurface.l 
  ddckCKDestOverlay.DDCOLORKEY 
  ddckCKDestBlt.DDCOLORKEY 
  ddckCKSrcOverlay.DDCOLORKEY 
  ddckCKSrcBlt.DDCOLORKEY 
  ddpfPixelFormat.DDPIXELFORMAT 
  ddsCaps.DDSCAPS2 
  dwTextureStage.l 
EndStructure 

Structure PB_Sprite 
  Sprite.l 
  Width.w 
  Height.w 
  Depth.w 
  Mode.w 
  FileName.l 
  RealWidth.w 
  RealHeight.w 
  ClipX.w 
  ClipY.w 
EndStructure 

Procedure GetCurrentBuffer() ;gibt die DDrawSurface des Rendering-Buffers zurück. 
  !extrn _PB_Sprite_CurrentBitmap 
  !MOV Eax,[_PB_Sprite_CurrentBitmap] 
  ProcedureReturn 
EndProcedure 

Procedure GetPixelFormat() ;gibt das PixelFormat des Rendering-Buffers zurück 
  !extrn _PB_DirectX_PixelFormat 
  !MOV Eax,[_PB_DirectX_PixelFormat] 
  ProcedureReturn 
EndProcedure 

Procedure _ScreenWidth() ;gibt die Breite des Rendering-Buffers zurück 
  !extrn _PB_Screen_Width 
  !MOV Eax,[_PB_Screen_Width] 
  ProcedureReturn 
EndProcedure 

Procedure _ScreenHeight() ;gibt die Höhe des Rendering-Buffers zurück 
  !extrn _PB_Screen_Height 
  !MOV Eax,[_PB_Screen_Height] 
  ProcedureReturn 
EndProcedure 









Procedure PutRotatedSprite(Sprite,XPos,YPos,Angle.f) 
  
  *Sprite.PB_Sprite=IsSprite(Sprite) 
  
  If *Sprite=0:ProcedureReturn 0:EndIf 
  
  Angle.f=Angle*0.017453; *(ACos(-1)*2)/360 
  
  Cos=Cos(Angle.f)*2048 
  Sin=Sin(Angle.f)*2048 
  NSin=-Sin 
  
  SpriteWidth=*Sprite\Width-1 
  SpriteHeight=*Sprite\Height-1 
  
  StartX=*Sprite\ClipX 
  StartY=*Sprite\ClipY 
  EndX=SpriteWidth+StartX 
  EndY=SpriteHeight+StartY 
  
  SpriteWidth2=(SpriteWidth)/2+StartX 
  SpriteHeight2=(SpriteHeight)/2+StartY 
  
  ScreenWidth=_ScreenWidth()-1 
  ScreenHeight=_ScreenHeight()-1 
  
  *SpriteDDS.IDirectDrawSurface7=*Sprite\Sprite 
  *DestDDS.IDirectDrawSurface7=GetCurrentBuffer() 
  
  SpriteDDSD2.DDSURFACEDESC2 
  DestDDSD2.DDSURFACEDESC2 
  
  SpriteDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  DestDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  
  *SpriteDDS\Lock(0,SpriteDDSD2,#DDLOCK_WAIT,0);schließt den Sprite- 
  *DestDDS\Lock(0,DestDDSD2,#DDLOCK_WAIT,0);und Rendering-Buffer, damit man direkt auf den Speicher zugreifen kann. 
  
  
  SrcPitch=SpriteDDSD2\lPitch 
  DestPitch=DestDDSD2\lPitch 
  
  SrcAddr=SpriteDDSD2\lpSurface 
  DestAddr=DestDDSD2\lpSurface 
  
  PixelFormat=GetPixelFormat() 
  
  x=Sqr(Pow((*Sprite\Width+1)/2,2)+Pow((*Sprite\Height+1)/2,2)) 
  
  If XPos-x>=0 And YPos-x>=0 And XPos+x<=ScreenWidth And YPos+x<=ScreenHeight ;Kann das Bild komplett dargestellt werden ? 
    
    ;======================================================================  
    If PixelFormat=#PB_PixelFormat_8Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX        
          Color=*SrcPtr\l&$FF 
          PokeW(DestAddr+((((x-SpriteWidth2)*Sin)>>11+Yv2))*DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1),Color+Color<<8) ;Zeichnet den Pixel 
          *SrcPtr+1 
        Next 
      Next    
      
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_15Bits Or PixelFormat=#PB_PixelFormat_16Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*2 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l&$FFFF 
          PokeL(DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2)*DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*2,Color+Color<<16) ;Zeichnet den Pixel 
          *SrcPtr+2 
        Next 
      Next    
    EndIf 
    
    
    If PixelFormat=#PB_PixelFormat_24Bits_RGB Or PixelFormat=#PB_PixelFormat_24Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*3 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l 
          Addr=DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2) *DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*3 ;Zeichnet den Pixel 
          PokeW(Addr,Color) 
          PokeL(Addr+2,Color>>16|Color<<8) 
          
          *SrcPtr+3 
        Next 
      Next    
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_32Bits_RGB Or PixelFormat=#PB_PixelFormat_32Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*4 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l 
          Addr=DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2) *DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*4 ;Zeichnet den Pixel 
          PokeL(Addr,Color) 
          PokeL(Addr+4,Color) 
          
          *SrcPtr+4 
        Next 
      Next    
      
    EndIf 
    ;====================================================================== 
    
    
  Else 
    
    
    ;======================================================================    
    If PixelFormat=#PB_PixelFormat_8Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FF 
            PokeW(DestAddr+Yp*DestPitch+Xp,Color+Color<<8) ;Zeichnet den Pixel 
          EndIf 
          *SrcPtr+1 
        Next 
      Next    
      
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_15Bits Or PixelFormat=#PB_PixelFormat_16Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*2 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FFFF 
            PokeL(DestAddr+Yp*DestPitch+Xp*2,Color+Color<<16) ;Zeichnet den Pixel 
          EndIf 
          *SrcPtr+2 
        Next 
      Next    
    EndIf 
    
    
    If PixelFormat=#PB_PixelFormat_24Bits_RGB Or PixelFormat=#PB_PixelFormat_24Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*3 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l 
            Addr=DestAddr+Yp*DestPitch+Xp*3 ;Zeichnet den Pixel 
            PokeW(Addr,Color) 
            PokeL(Addr+2,Color>>16|Color<<8) 
            
          EndIf 
          *SrcPtr+3 
        Next 
      Next    
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_32Bits_RGB Or PixelFormat=#PB_PixelFormat_32Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*4 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l 
            Addr=DestAddr+Yp*DestPitch+Xp*4 ;Zeichnet den Pixel 
            PokeL(Addr,Color) 
            PokeL(Addr+4,Color) 
            
          EndIf 
          *SrcPtr+4 
        Next 
      Next        
    EndIf 
    ;======================================================================    
    
  EndIf 
  
  *SpriteDDS\UnLock(0) ;Öffnet den Sprite-Buffer und den Rendering-Buffer wieder. 
  *DestDDS\UnLock(0) 
  ProcedureReturn -1 
EndProcedure 




Procedure PutRotatedTransSprite(Sprite,XPos,YPos,Angle.f) 
  
  *Sprite.PB_Sprite=IsSprite(Sprite) 
  
  If *Sprite=0:ProcedureReturn 0:EndIf 
  
  Angle.f=Angle*0.017453; *(ACos(-1)*2)/360 
  
  Cos=Cos(Angle.f)*2048 
  Sin=Sin(Angle.f)*2048 
  NSin=-Sin 
  
  SpriteWidth=*Sprite\Width-1 
  SpriteHeight=*Sprite\Height-1 
  
  StartX=*Sprite\ClipX 
  StartY=*Sprite\ClipY 
  EndX=SpriteWidth+StartX 
  EndY=SpriteHeight+StartY 
  
  SpriteWidth2=(SpriteWidth)/2+StartX 
  SpriteHeight2=(SpriteHeight)/2+StartY 
  
  ScreenWidth=_ScreenWidth()-1 
  ScreenHeight=_ScreenHeight()-1 
  
  *SpriteDDS.IDirectDrawSurface7=*Sprite\Sprite 
  *DestDDS.IDirectDrawSurface7=GetCurrentBuffer() 
  
  *SpriteDDS\GetColorKey(#DDCKEY_SRCBLT,ColorKey.DDCOLORKEY);Gibt die transparente Farbe (im passendem PixelFormat) des Sprites zurück 
  TransColor=ColorKey\dwColorSpaceLowValue 
  
  
  SpriteDDSD2.DDSURFACEDESC2 
  DestDDSD2.DDSURFACEDESC2 
  
  SpriteDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  DestDDSD2\dwSize=SizeOf(DDSURFACEDESC2) 
  
  *SpriteDDS\Lock(0,SpriteDDSD2,#DDLOCK_WAIT,0);schließt den Sprite- 
  *DestDDS\Lock(0,DestDDSD2,#DDLOCK_WAIT,0);und Rendering-Buffer, damit man direkt auf den Speicher zugreifen kann. 
  
  
  SrcPitch=SpriteDDSD2\lPitch 
  DestPitch=DestDDSD2\lPitch 
  
  SrcAddr=SpriteDDSD2\lpSurface 
  DestAddr=DestDDSD2\lpSurface 
  
  PixelFormat=GetPixelFormat() 
  
  
  x=Sqr(Pow((*Sprite\Width+1)/2,2)+Pow((*Sprite\Height+1)/2,2)) 
  
  If XPos-x>=0 And YPos-x>=0 And XPos+x<=ScreenWidth And YPos+x<=ScreenHeight ;Kann das Bild komplett dargestellt werden ? 
    
    ;======================================================================    
    
    If PixelFormat=#PB_PixelFormat_8Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l&$FF 
          If Color<>TransColor 
            PokeW(DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2)*DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1),Color+Color<<8) ;Zeichnet den Pixel 
          EndIf 
          
          *SrcPtr+1 
        Next 
      Next    
      
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_15Bits Or PixelFormat=#PB_PixelFormat_16Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*2 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l&$FFFF 
          If Color<>TransColor 
            PokeL(DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2)*DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*2,Color+Color<<16) ;Zeichnet den Pixel 
          EndIf 
          
          *SrcPtr+2 
        Next 
      Next    
    EndIf 
    
    
    If PixelFormat=#PB_PixelFormat_24Bits_RGB Or PixelFormat=#PB_PixelFormat_24Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*3 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l&$FFFFFF 
          
          If Color<>TransColor 
            Addr=DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2) *DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*3 ;Zeichnet den Pixel 
            PokeW(Addr,Color) 
            PokeL(Addr+2,Color>>16|Color<<8) 
          EndIf 
          
          *SrcPtr+3 
        Next 
      Next    
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_32Bits_RGB Or PixelFormat=#PB_PixelFormat_32Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*4 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Color=*SrcPtr\l&$FFFFFF 
          If Color<>TransColor 
            Addr=DestAddr+(((x-SpriteWidth2)*Sin)>>11+Yv2)*DestPitch+(((x-SpriteWidth2)*Cos)>>11+Yv1)*4 ;Zeichnet den Pixel 
            PokeL(Addr,Color) 
            PokeL(Addr+4,Color) 
          EndIf 
          
          *SrcPtr+4 
        Next 
      Next    
      
    EndIf 
    ;======================================================================    
    
    
    
  Else 
    
    ;======================================================================    
    
    If PixelFormat=#PB_PixelFormat_8Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FF 
            If Color<>TransColor 
              PokeW(DestAddr+Yp*DestPitch+Xp,Color+Color<<8) ;Zeichnet den Pixel 
            EndIf 
            
          EndIf 
          *SrcPtr+1 
        Next 
      Next    
      
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_15Bits Or PixelFormat=#PB_PixelFormat_16Bits 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*2 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FFFF 
            If Color<>TransColor 
              PokeL(DestAddr+Yp*DestPitch+Xp*2,Color+Color<<16) ;Zeichnet den Pixel 
            EndIf 
            
          EndIf 
          *SrcPtr+2 
        Next 
      Next    
    EndIf 
    
    
    If PixelFormat=#PB_PixelFormat_24Bits_RGB Or PixelFormat=#PB_PixelFormat_24Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*3 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FFFFFF 
            
            If Color<>TransColor 
              Addr=DestAddr+Yp*DestPitch+Xp*3 ;Zeichnet den Pixel 
              PokeW(Addr,Color) 
              PokeL(Addr+2,Color>>16|Color<<8) 
            EndIf 
            
          EndIf 
          *SrcPtr+3 
        Next 
      Next    
    EndIf 
    
    If PixelFormat=#PB_PixelFormat_32Bits_RGB Or PixelFormat=#PB_PixelFormat_32Bits_BGR 
      
      For y=StartY To EndY 
        *SrcPtr.Long=SrcAddr+y*SrcPitch+StartX*4 ;Berechnet die Startadresse 
        
        Yv1=((y-SpriteHeight2)*NSin)>>11+XPos 
        Yv2=((y-SpriteHeight2)*Cos)>>11+YPos 
        For x=StartX To EndX  
          
          Xp=((x-SpriteWidth2)*Cos)>>11+Yv1 ;Berechnet die Position des Pixels 
          Yp=((x-SpriteWidth2)*Sin)>>11+Yv2 
          
          If Xp>=0 And Xp<ScreenWidth And Yp>=0 And Yp<=ScreenHeight 
            
            Color=*SrcPtr\l&$FFFFFF 
            If Color<>TransColor 
              Addr=DestAddr+Yp*DestPitch+Xp*4 ;Zeichnet den Pixel 
              PokeL(Addr,Color) 
              PokeL(Addr+4,Color) 
            EndIf 
            
          EndIf 
          *SrcPtr+4 
        Next 
      Next    
      
    EndIf 
    ;======================================================================      
    
    
  EndIf 
  
  *SpriteDDS\UnLock(0) ;Öffnet den Sprite-Buffer und den Rendering-Buffer wieder. 
  *DestDDS\UnLock(0) 
  ProcedureReturn -1 
EndProcedure 




;Beispiel: 
InitSprite() 
InitKeyboard() 
InitMouse() 

OpenScreen(800,600,16,"PutRotatedSprite()/PutRotatedTransSprite()") 


;Achtung: 
;Das Sprite sollte im Hauptspeicher erstellt werden, da dort der direkte Speicherzugriff schneller ist. 
;LoadSprite(1,"D:\Purebasic\examples\sources\data\Geebee2.bmp",#PB_Sprite_Memory);Pfad anpassen ! 
LoadSprite(1,"..\examples\sources\data\Geebee2.bmp",#PB_Sprite_Memory);Pfad anpassen ! 


;ClipSprite(1,20,20,100,100) 
TransparentSpriteColor(1,RGB(255,0,255))

MouseLocate(400,300) 

Repeat 
  ExamineKeyboard() 
  Angle+1 
  
  ClearScreen(RGB(128,128,128))
  
  ExamineMouse() 
  
  PutRotatedTransSprite(1,MouseX(),MouseY(),Angle) 
  
  FlipBuffers() 
  
Until KeyboardPushed(#PB_Key_Escape) 

; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = --
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du hättest wohl mal ne Eule werden sollen, wa ? :mrgreen:
Antworten