Deutsch
Quelltexte/ Codesnippets

Trackmenu in anderen Fenstern; Bilder vorladen / puffern

 

p.specht

O-Text Jonathan:

Diese Code-Schnipsel kann bestimmt jemand gebrauchen:
 $H Windows.ph
'POINT-Struktur
Struct lpPoint = X&, Y&

Proc TrackMenuExt

    Parameters hWnd&, X&, Y&
    Declare Pnt#
    Dim Pnt#, lpPoint
    Pnt#.X& = X&
    Pnt#.Y& = Y&
    ~ClientToScreen(hWnd&, Addr(Pnt#))
    ~ScreenToClient(%hwnd, Addr(Pnt#))
    TrackMenu Pnt#.X&, Pnt#.Y&
    Dispose Pnt#

EndProc


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 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
12.06.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.338 Betrachtungen

Unbenanntvor 0 min.
Member 862464112.05.2024
RGH26.12.2021
p.specht20.11.2021
E.T.20.11.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie