| |
|
|
p.specht
| O-Text Jonathan:
Diese Code-Schnipsel kann bestimmt jemand gebrauchen:
Ist ne einfache Routine, mit der man auf einem anderen Fenster als dem Hauptfenster ein TrackMenu erstellen kann. MenuItem() funktioniert damit wie gehabt.
Wenn man in einem Programm viele Bilder zeichnet und diese nicht immer wieder von der Festplatte geladen werden sollten, man aber auch keine Lust hat, jedes Bild am Anfang ausdrücklich zu laden, kann man diese Routinen nehmen:
'Zum Puffern von Bildern
Declare BufferedImageFiles$'Liste der bereits gepufferten Bilder, getrennt durch "|"
Declare hBufferedImages&[]'Handles der gepufferten Bilder
SubProc Create.hPicBuffered
Parameters Typ&, S$
Declare NewImg&
If @Len(BufferedImageFiles$) = 0
BufferedImageFiles$ = "|"
EndIf
If Typ& = -1
IfNot @InStr("|" + @Upper$(S$) + "|", @Upper$(BufferedImageFiles$))
BufferedImageFiles$ = BufferedImageFiles$ + S$ + "|"
hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))] = @Create("hPic", -1, S$)
EndIf
NewImg& = @Create("hPicCopy", hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))])
Else
NewImg& = @Create("hPic", Typ&, S$)
EndIf
Return NewImg&
EndProc
SubProc Create.hSizedPicBuffered
Parameters Typ&, S$, X&, Y&, N&
Declare NewImg&, XN&, YN&, Faktor1!, Faktor2!
If @Len(BufferedImageFiles$) = 0
BufferedImageFiles$ = "|"
EndIf
If Typ& = -1
IfNot @InStr("|" + @Upper$(S$) + "|", @Upper$(BufferedImageFiles$))
BufferedImageFiles$ = BufferedImageFiles$ + S$ + "|"
hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))] = @Create("hPic", -1, S$)
EndIf
If N& = 1
Faktor1! = X& / @Width(hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))])
Faktor2! = Y& / @Height(hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))])
If Faktor1! < Faktor2!
XN& = X&
YN& = @Height(hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))]) * Faktor1!
Else
XN& = @Width(hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))]) * Faktor2!
YN& = Y&
EndIf
Else
XN& = X&
YN& = Y&
EndIf
NewImg& = @Create("hNewPic", XN&, YN&, 0)
StartPaint NewImg&
DrawSizedPic hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))], 0, 0 - XN&, YN&; 0
EndPaint
Else
NewImg& = @Create("hSizedPic", Typ&, S$, X&, Y&, N&)
EndIf
Return NewImg&
EndProc
Proc DrawSizedPicBuffered
Parameters S$, X&, Y&, DX&, DY&, N&
If @Len(BufferedImageFiles$) = 0
BufferedImageFiles$ = "|"
EndIf
IfNot @InStr("|" + @Upper$(S$) + "|", @Upper$(BufferedImageFiles$))
BufferedImageFiles$ = BufferedImageFiles$ + S$ + "|"
hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))] = @Create("hPic", -1, S$)
EndIf
DrawSizedPic hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))], X&, Y& - DX&, DY&; N&
EndProc
Proc DrawPicBuffered
Parameters S$, X&, Y&, N&
If @Len(BufferedImageFiles$) = 0
BufferedImageFiles$ = "|"
EndIf
IfNot @InStr("|" + @Upper$(S$) + "|", @Upper$(BufferedImageFiles$))
BufferedImageFiles$ = BufferedImageFiles$ + S$ + "|"
hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))] = @Create("hPic", -1, S$)
EndIf
DrawPic hBufferedImages&[@InStr('|' + @Upper$(S$) + '|', @Upper$(BufferedImageFiles$))], X&, Y&; N&
EndProc
Proc DeleteImageBuffer
WhileLoop 0, @SizeOf(hBufferedImages&[]) - 1
If hBufferedImages&[&loop]
DeleteObject hBufferedImages&[&loop]
EndIf
EndWhile
EndProc
Die Procs ersetzen Create("hPic"), Create("hSizedPic"), DrawPic und DrawSizedPic in ihrer Form zum Laden von Bildern von der Festplatte. Wird ein Bild zum ersten Mal geladen, laden diese Routinen das Bild in den RAM und behalten dort eine Kopie davon. Wird das Bild erneut geladen, wird die Kopie im RAM benutzt und es nicht nochmal von der Festplatte geladen. Am Ende sollte man DeleteImageBuffer nicht vergessen, damit die ganzen Handles der Kopien wieder freigegeben werden.
Gruß Jonathan |
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 12.06.2021 ▲ |
|
|
|