Forum | | | | - 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
|
| | | 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? |
| | | | |
| | | | - Seite 2 - |
| | Nico Madysa | Bei 6000*3000 Pixeln sicherlich |
| | | | |
| | | Liegt der Wertebereich unterhalb eines Longs oder Floats? |
| | | | |
| | 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 ▲ |
| |
|
AntwortenThemenoptionen | 1.127 Betrachtungen |
ThemeninformationenDieses Thema hat 6 Teilnehmer: |