Deutsch
Forum

Mehrere Memory-Bitmaps ?

 
- Seite 1 -



Christian
Eichler
Wie immer hab ich ein Problem : Wie kann ich mehrere (!) Memory-Bitmaps in Profan² 6.6 erstellen ? Mit MCLS kann mal ja eins erstellen, aber nicht mehrere ...
Allerdings möchte ich die Bilder dann nicht auf der Festplatte zwischenspeichern (nur dass keiner auf die Idee kommt, mir zu sagen ich soll mir SaveBmp und LoadBmp arbeiten )

Meine 1. Idee : WinAPI : Befehl (meiner Meinung nach der richtige) gefunden, Eingebaut, Fehler.

Der Quellcode :

Als Fehlermeldung kommt da dann, das das Bild test.bmp nicht gespeichert werden konnte .
Wie bekomm ich dass zum laufen, dass ich in Profan (ggf. über die WinAPI) mehrere Memory-Bitmaps erstelle und darauf auch zugreifen kann ?

mfg euer immer komische Frangen stellender Christian !
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
20.07.2007  
 



 
- Seite 1 -



Christian
Eichler
640*480 war nicht möglich, aber Screenshot ist trotzdem dabei

Die feine Linie, die du warscheinlich ohne Brille garnet siehst soll den Graph darstellen


5 kB
Hochgeladen:20.07.2007
Ladeanzahl104
Herunterladen
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
20.07.2007  
 



Liegt der Wertebereich unterhalb eines Longs oder Floats?
 
20.07.2007  
 



 
- Seite 2 -



Nico
Madysa
Bei 6000*3000 Pixeln sicherlich
 
Nico Madysa
20.07.2007  
 



Liegt der Wertebereich unterhalb eines Longs oder Floats?
 
20.07.2007  
 




Christian
Eichler
Der Wertebereich von was ?

Auf dem Bild natürlich im Long ...
Bei der Definitions und Wertemenge des Graphen in Float ...
Wobei ich sagen muss, dass ich die Floatwerte erst umrechne und dann direkt aufs Papier zeichne, also nicht speichere ! Ich speicher eigentlich gar keine Werte, wären sowieso zu viele !

Hilft dir das weiter ?
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
21.07.2007  
 




Andreas
Miethe


Hallo Chistian,

zu Deinem Code :
StartPaint leitet die Ausgabe auf ein anderes Fenster oder Control um, nicht auf ein DC, kann also nicht funktionieren.

Wenn Du mit API arbeiten willst dann musst Du das auch mit API-Zeichenfunktionen machen, mit den Profan-Zeichenfunktionen kannst Du dann nichts anfangen.

Hier ein Beispiel, dass ein Speicherbitmap anlegt, eine Linie und eine Kurve darauf zeichnet, und das Ganze dann im Profanfenster anzeigt.
Auf diese Art kannst Du dann auch mehrere Speicherbitmaps anlegen und anzeigen.
Def @CreateCompatibleBitmap(3) !gdi32.dll,CreateCompatibleBitmap
Def @CreateCompatibleDC(1) !gdi32.dll,CreateCompatibleDC
Def @SelectObject(2) !gdi32.dll,SelectObject
Def @ReleaseDC(2) !user32.dll,ReleaseDC
Def @DeleteDC(1) !gdi32.dll,DeleteDC
Def @BitBlt(9) !gdi32.dll,BitBlt
Def @PolyLineTo(3) !gdi32.dll,PolylineTo
Def @PolyBezierTo(3) !gdi32.dll,PolyBezierTo
Def @LineTo(3) !gdi32.dll,LineTo
Def @MoveToEx(4) !gdi32.dll,MoveToEx
Def @CreatePen(3) !gdi32.dll,CreatePen
Def @FloodFill(4) !gdi32.dll,FloodFill
Def @GetDC(1) !user32.dll,GetDC
Def @ReleaseDC(2) !user32.dll,ReleaseDC
Def @DeleteObject(1) !gdi32.dll,DeleteObject
SetTrueColor 1
CLS
Declare dc&,test&,pen&,Points#
Let dc&    = @CreateCompatibleDC(%hdc) DeviceContext erzeugen
Let test&  = @CreateCompatibleBitmap(%HDC,640,480)hBitmap erzeugen
Let pen&   = @CreatePen(0,1,RGB(0,0,255))Pen zum zeichnen erzeugen
@SelectObject(dc&,test&)hBitmap in DeviceContext
@SelectObject(dc&,pen&)Pen in DeviceContext
@FloodFill(dc&,0,0,RGB(255,255,255))hBitmap weiss füllen
@MoveToEx(dc&,0,0,0) zum Startpunkt
@LineTo(dc&,Width(%hwnd),Height(%hwnd))Linie zeichen
Struktur mit Punkten anlegen ( in diesem Fall 3 Punkte )
Dim Points#,24
1. Punkt
Long Points#,0 = 0  X
Long Points#,4 = 0  Y
2. Punkt
Long Points#,8 = Width(%hwnd)/2
Long Points#,12 = Height(%hwnd)*2
2. Punkt
Long Points#,16 = Width(%hwnd)
Long Points#,20 = 0
@MoveToEx(dc&,0,0,0)zum Startpunkt
@PolyBezierTo(dc&,Points#,3)Bezier-Kurve aus Punkt-Struktur
@BitBlt(%hdc,0,0,640,480,dc&,0,0,$CC0020)hBitmap auf CLS-Fenster anzeigen
@BitBlt(%hdc2,0,0,640,480,dc&,0,0,$CC0020)Hbitmap auch zum Sicherungs-DC
Speicher aufräumen
Dispose Points#
@DeleteObject(test&)
@DeleteObject(pen&)
@DeleteDC(dc&)

While 1

EndWhile

 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.07.2007  
 




Christian
Eichler
Okay, danke...
Dann kann ich an dieser Stelle ja gleich Fragen, was es mit diesen DCs auf sich hat:

Was hat es mit diesen DCs auf sich ? Was ist das und warum benötigt man sowas ?
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
21.07.2007  
 




Andreas
Miethe


Hallo Christian,

Ein DC oder Devicecontext ist grob gesagt eine Struktur die grafische Objekte und deren Attribute beinhaltet.
Grafische Objekte sind Bitmap,Brush,Font,Pen und Region.
Jedes Fenster und Control aber auch ein Drucker hat ein DC auf das mit API-Funktionen gezeichnet werden kann.

CreateCompatibleDC() legt ein DC im Speicher an, diesem DC kann dann mit SelectObject() eines der o.g. grafischen Objekte zugewiesen werden.

Ich hoffe ich habe das ausreichend erklärt.
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.07.2007  
 




Christian
Eichler
Öhm... ja das sollte langen, danke !
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
21.07.2007  
 




Christian
Eichler
@ Andreas : Dein Code war irgendwie sehr unübersichtlich, ich hab den mal so umgeschrieben, wie ich ihn brauchen kann :
Def @CreateCompatibleBitmap(3) !gdi32.dll,CreateCompatibleBitmap
Def @CreateCompatibleDC(1) !gdi32.dll,CreateCompatibleDC
Def @SelectObject(2) !gdi32.dll,SelectObject
Def @DeleteDC(1) !gdi32.dll,DeleteDC
Def @BitBlt(9) !gdi32.dll,BitBlt
Def @LineTo(3) !gdi32.dll,LineTo
Def @CreatePen(3) !gdi32.dll,CreatePen
Def @FloodFill(4) !gdi32.dll,FloodFill
Def @DeleteObject(1) !gdi32.dll,DeleteObject
Def @MoveToEx(4) !gdi32.dll,MoveToEx
Def @GetPixelA(3) !gdi32.dll,GetPixel

Proc Strich

    Parameters DCHandle&, StrichX1&, StrichY1&, StrichX2&, StrichY2&, StrichFarbe&
    Declare Stift&
    Let Stift&=@CreatePen(0,1,StrichFarbe&)
    @SelectObject(DCHandle&,Stift&)
    @MoveToEx(DCHandle&,StrichX1&,StrichY1&,0)
    @LineTo(DCHandle&,StrichX2&,StrichY2&)
    @DeleteObject(Stift&)

EndProc

Proc SpeicherBitmap

    Parameters XBreite&, YBreite&
    Declare DC&, hBitMap&
    Let DC&=@CreateCompatibleDC(%hdc)
    Let hBitMap&=@CreateCompatibleBitmap(%hdc,XBreite&,YBreite&)
    @SelectObject(DC&,hBitMap&)
    @FloodFill(DC&,0,0,RGB(255,255,255))
    return DC&

EndProc

Proc LadeSpeicherBitmapX

    Parameters DCHandle&
    @BitBlt(%hdc,0,0,640,480,DCHandle&,0,0,$CC0020)
    @BitBlt(%hdc2,0,0,640,480,DCHandle&,0,0,$CC0020)

EndProc

Proc LadeSpeicherBitmap

    Parameters DCHandle&, XBreite&, YBreite&
    Declare m%, n%

    While m% < XBreite&

        Inc m%

        While n% < YBreite&

            Inc n%

            IfNot @GetPixelA(DCHandle&,m%,n%)=@RGB(255,255,255)

                @BitBlt(%hdc,m%,n%,1,1,DCHandle&,m%,n%,$CC0020)
                @BitBlt(%hdc2,m%,n%,1,1,DCHandle&,m%,n%,$CC0020)

            EndIf

        EndWhile

        Let n%=0

    EndWhile

EndProc

Proc ZerstohreSpeicherBitmap

    Parameters DCHandle&
    @DeleteDC(DCHandle&)

EndProc

SetTrueColor 1
CLS @RGB(150,150,150)
Declare SBit1&
SpeicherBitmap 640,480
Let SBit1&=@&(0)
Strich SBit1&,0,0,100,50,@RGB(0,0,255)
Strich SBit1&,100,50,200,100,@RGB(0,255,0)
Strich SBit1&,200,100,300,150,@RGB(255,0,0)
Strich SBit1&,300,150,400,200,@RGB(0,0,255)
Strich SBit1&,400,200,500,250,@RGB(0,255,0)
Strich SBit1&,500,250,600,300,@RGB(255,0,0)
LadeSpeicherBitmap SBit1&,640,480
WaitInput
ZerstohreSpeicherBitmap SBit1&

Nur wie ich eine einzelne Farbe durchsichtig bekomme, da bin ich mir noch nicht 100%-ig sicher. Im Beispiel oben ist zwar eine Lösung, aber die ist doch sehr langsam !
Und für den letzten Parameter in BitBlt hab ich auch nichts passendes gefunden !

mfg Christian

PS: Ich hab sogar selber noch eine API-Funktion mit reingemurkst !!!
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
21.07.2007  
 




Andreas
Miethe


Hallo Christian

ich habe Dein Beispiel mal angepasst.
Es ist jetzt eine neue Procedur drin namens Drawtransparent

Sieht wild aus, ist aber hoffentlich ausreichend kommentiert.

Im Grunde macht die Procedur Dein Speicherbitmap einfach nur durchsichtig und zeichnet es auf %HDC.

Das geht allerdings wesentlich schneller als Deine Procedur, da alles auf einmal angezeigt wird.
Def @CreateCompatibleBitmap(3) !gdi32.dll,CreateCompatibleBitmap
Def @CreateCompatibleDC(1) !gdi32.dll,CreateCompatibleDC
Def @SelectObject(2) !gdi32.dll,SelectObject
Def @DeleteDC(1) !gdi32.dll,DeleteDC
Def @BitBlt(9) !gdi32.dll,BitBlt
Def @LineTo(3) !gdi32.dll,LineTo
Def @CreatePen(3) !gdi32.dll,CreatePen
Def @FloodFill(4) !gdi32.dll,FloodFill
Def @DeleteObject(1) !gdi32.dll,DeleteObject
Def @MoveToEx(4) !gdi32.dll,MoveToEx
Def @GetPixelA(3) !gdi32.dll,GetPixel
Def GetCurrentObject(2) ! gdi32,GetCurrentObject
Def SetBkColor(2) ! gdi32,SetBkColor
Def CreateBitmap(5) ! gdi32,CreateBitmap
DEF SetMapMode(2) ! GDI32,SetMapMode
DEF GetMapMode(1) ! GDI32,GetMapMode

Proc Strich

    Parameters DCHandle&, StrichX1&, StrichY1&, StrichX2&, StrichY2&, StrichFarbe&
    Declare Stift&
    Let Stift&=@CreatePen(0,1,StrichFarbe&)
    @SelectObject(DCHandle&,Stift&)
    @MoveToEx(DCHandle&,StrichX1&,StrichY1&,0)
    @LineTo(DCHandle&,StrichX2&,StrichY2&)
    @DeleteObject(Stift&)

EndProc

Proc SpeicherBitmap

    Parameters XBreite&, YBreite&
    Declare DC&, hBitMap&
    Let DC&=@CreateCompatibleDC(%hdc)
    Let hBitMap&=@CreateCompatibleBitmap(%hdc,XBreite&,YBreite&)
    @SelectObject(DC&,hBitMap&)
    @FloodFill(DC&,0,0,RGB(255,255,255))
    return DC&

EndProc

Proc LadeSpeicherBitmapX

    Parameters DCHandle&
    @BitBlt(%hdc,0,0,640,480,DCHandle&,0,0,$CC0020)
    @BitBlt(%hdc2,0,0,640,480,DCHandle&,0,0,$CC0020)

EndProc

Proc LadeSpeicherBitmap

    Parameters DCHandle&, XBreite&, YBreite&
    Declare m%, n%

    While m% < XBreite&

        Inc m%

        While n% < YBreite&

            Inc n%

            IfNot @GetPixelA(DCHandle&,m%,n%)=@RGB(255,255,255)

                @BitBlt(%hdc,m%,n%,1,1,DCHandle&,m%,n%,$CC0020)
                @BitBlt(%hdc2,m%,n%,1,1,DCHandle&,m%,n%,$CC0020)

            EndIf

        EndWhile

        Let n%=0

    EndWhile

EndProc

Proc ZerstohreSpeicherBitmap

    Parameters DCHandle&
    @DeleteDC(DCHandle&)

EndProc

NEU !

Proc DrawTransparent

    Parameters inDC&,w&,h&,transcolor&
    Declare hhBitmap&,BitmapHandle&
    Declare HdcTemp&,HdcBack&,HdcObject&,HdcMem&,hdcSave&
    Declare BmpAndBack&,BmpAndObject&,BmpAndMem&,BmpSave&
    Declare BmpBackOld&,BmpObjectOld&,BmpMemOld&,BmpSaveOld&
    Declare CColor&
    temporaerDC anlegen
    Let HdcTemp& = CreateCompatibleDC(%hdc)
    Let hhBitMap&=@CreateCompatibleBitmap(%hdc,w&,h&)
    SelectObject(HdcTemp&,hhBitMap&)
    BitBlt(HdcTemp&,0,0,w&,h&,inDC&,0,0,$0CC0020)
    ein paar Speicher-DCs anlegen
    Let HdcBack&   = CreateCompatibleDC(%hdc)
    Let HdcObject& = CreateCompatibleDC(%hdc)
    Let HdcMem&    = CreateCompatibleDC(%hdc)
    Let HdcSave&   = CreateCompatibleDC(%hdc)
    Bitmaps anlegen
    monochrom DC
    Let BmPAndBack&   = CreateBitmap(w&,h&,1,1,0)
    Let BmPAndObject& = CreateBitmap(w&,h&,1,1,0)
    farbe
    Let BmPAndMem&    = CreateCompatibleBitmap(%hdc,w&,h&)
    Let BmPSave&      = CreateCompatibleBitmap(%hdc,w&,h&)
    SetMapMode(HdcTemp&,GetMapMode(%hdc))
    jedes Speicher-DC muss ein Bitmap selektieren zum Speichern der Daten
    Let BmpBackOld&   = SelectObject(HdcBack&,BmPAndBack&)
    Let BmpObjectOld& = SelectObject(HdcObject&,BmpAndObject&)
    Let BmpMemOld&    = SelectObject(HdcMem&,BmpAndMem&)
    Let BmpSaveOld&   = SelectObject(HdcSave&,BmpSave&)
    Bitmaps sichern weil es ueberschrieben wird
    BitBlt (HdcSave&,0,0,w&,h&,HdcTemp&,0,0,$0CC0020)
    Transparenz-Farbe fuer temporaerDC setzen
    Let CColor& = SetBkColor(HdcTemp&,TransColor&)
    Eine Object-Maske anlegen fuer das Bitmaps anlegen
    Von QuellBitmap in Monochrom-Bitmap
    BitBlt(HdcObject&,0,0,w&,h&,HdcTemp&,0,0,$0CC0020)
    Hintergrundfarbe fuer temoraerDC ist weiss
    SetBkColor(HdcTemp&,rgb(255,255,255))
    Object-Maske invertieren
    BitBlt(HdcBack&,0,0,w&,h&,HdcObject&,0,0,$0330008)
    HDC-Hintergrund ins MemoryDC kopieren
    BitBlt(HdcMem&,0,0,w&,h&,%hdc,0,0,$0CC0020)
    Bereich maskieren in dem das Bitmaps erscheint
    BitBlt(HdcMem&,0,0,w&,h&,HdcObject&,0,0,$08800C6)
    transparenten Bereich maskieren
    BitBlt(HdcTemp&,0,0,w&,h&,HdcBack&,0,0,$08800C6)
    XOR Bitmap mit Hintergrund HDC
    BitBlt(HdcMem&,0,0,w&,h&,HdcTemp&,0,0,$0EE0086)
    transparentes Bitmap in HDC kopieren
    BitBlt(%hdc,0,0,w&,h&,HdcMem&,0,0,$0CC0020)
    und ins Speicher-HDC kopieren
    BitBlt(%hdc2,0,0,w&,h&,HdcMem&,0,0,$0CC0020)
    Speicher-Bitmaps freigeben
    DeleteObject(SelectObject(HdcBack&,BmpBackOld&))
    DeleteObject(SelectObject(HdcObject&,BmpObjectOld&))
    DeleteObject(SelectObject(HdcMem&,BmpMemOld&))
    DeleteObject(SelectObject(HdcSave&,BmpSaveOld&))
    DeleteObject(SelectObject(HdcTemp&,hhBitmap&))
    Speicher-Dcs freigeben
    DeleteDC(HdcMem&)
    DeleteDC(HdcBack&)
    DeleteDC(HdcObject&)
    DeleteDC(HdcSave&)
    DeleteDC(HdcTemp&)

EndProc

SetTrueColor 1
CLS @RGB(150,150,150)
Declare SBit1&,haDC&
LoadBmp $syspath+\setup.bmp,0,0;0  Hintergrundbild zum Testn ( Pfad anpassen !! )
SpeicherBitmap 640,480
Let SBit1&=@&(0)
Strich SBit1&,0,0,100,50,@RGB(0,0,255)
Strich SBit1&,100,50,200,100,@RGB(0,255,0)
Strich SBit1&,200,100,300,150,@RGB(255,0,0)
Strich SBit1&,300,150,400,200,@RGB(0,0,255)
Strich SBit1&,400,200,500,250,@RGB(0,255,0)
Strich SBit1&,500,250,600,300,@RGB(255,0,0)
DrawTransparent SBit1&,640,480,RGB(255,255,255)
WaitInput
ZerstohreSpeicherBitmap SBit1&
 
Gruss
Andreas
________ ________ ________ ________ _
Profan 3.3 - XProfanX2
Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit
ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher
Homepage :  [...] 
21.07.2007  
 




Christian
Eichler
Danke, ich hatte das Problem, dass meine Prozedur recht langsam war ...
Ich hab aber halt nichts besseres gefunden ...

Danke für die Hilfe mit der WinAPI !

mfg Christian
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
21.07.2007  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.127 Betrachtungen

Unbenanntvor 0 min.
H.Brill18.09.2023
Walter11.04.2023
Ernst18.04.2014
iF08.05.2013
Mehr...

Themeninformationen



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