| |
|
|
Marcus Mayer | Hallo allerseits!
Ich hätte da mal ne Frage: Ist es möglich, mit bordeigenen Mitteln (sprich nur mit GDIPlus o.ä.) PNGs mit Alphakanal im Client-Bereich des XProfan-Fensters zu zeichnen, ohne die ProSpeed.dll zu verwenden? (Unter Win7)
Habe seiner Zeit mit Profan 6 zu programmieren begonnen und war auch bis Version 7.5 recht fleißig dabei. Allerdings habe ich dann eine recht lange Pause gemacht und einige Neuerungen verschlafen. Da ich programmiertechnisch wohl ziemlich eingerostet bin, werde ich aus so mancher Geschichte wie z.B den Layered Windows nicht ganz schlau. |
|
|
| |
|
|
|
| Hallo Marcus,
Andreas Miethe hat "LayeredWindow mit Alphakanal" [...] bereitgestellt -
ich habe das unlieb schlimm verwürgt - aber es zeichnet PNGs: KompilierenMarkierenSeparierenGemerkt/Separiert von http://xprofan.com/t/?7898 (Andreas Miethe)
###############################
Layered-Window mit PNG
und GDIPlus
###############################
If Val($winver) < 5
Messagebox("Die Windows-Version wird nicht unterstützt","Sorry",0)
End
Endif
###############################
Imports
###############################
Var GdiPlus& = ImportDll("GDIPlus.dll","")
###############################
###############################
Header-Dateien
$H windows.ph
$H Messages.ph
###############################
###############################
Strukturen
###############################
Struct GdiplusStartupInput = GdiplusVersion&,DebugEventCallback&,SuppressBackgroundThread&,SuppressExternalCodecs&
Struct Size = cx&,cy&
Struct Point = x&,y&
Struct Blendfunction = a#(4)
###############################
Var WW& = 280 Bildbreite
Var WH& = 280 Bildhöhe
###############################
cls
~SetClassLong(%hwnd,~GCL_STYLE,(~GetClassLong(%hwnd,~GCL_STYLE)- ~CS_HREDRAW - ~CS_VREDRAW))
SetStyle %Hwnd,1, GetStyle(%hwnd,1) | $80000 erweiterten Window-Stil setzen
Var GdiplusToken& = InitGDIPlus() GDIPlus initialisieren
Var IObject& = GdipLoadImage("BackPic.png") PNG mit Alphakanal laden
Var bm& = ~CreateBitmap(ww&,wh&,1,32,0) 32-Bit Bitmap anlegen
Var DC& = ~CreateCompatibleDC(0) DC-anlegen
~SelectObject(DC&,bm&) Bitmap ins DC
Var Graphics& = 0
GdipCreateFromHdc(%hDC,Addr(Graphics&)) Zeichnungs-Object anlegen
GdipSetSmoothingMode(Graphics&,2) weicher zeichnen
GdipDrawImageRectI(Graphics&,IObject&,0,0,ww&,wh&) Bild zeichnen
GdipDrawImageRectI(Graphics&,IObject&,50,50,ww&,wh&) Bild zeichnen
GdipDeleteGraphics(Graphics&) Zeichnugs-Object freigeben
GdipDisposeImage(IObject&) Bitmap feigeben
ExitGDIPlus(gdiplusToken&) GDIPlus beenden
waitinput
end
Parameter für UpdateLayeredWindow vorbereiten
Var Size# = New(Size)
Var Point# = New(Point)
Var Blendmode# = New(Blendfunction)
Clear Blendmode#,Point#,Size#
Size#.cx& = ww&
Size#.cy& = wh&
Byte Blendmode#,2 = 255
Byte Blendmode#,3 = 1
External("User32.dll","UpdateLayeredWindow",%hwnd, 0, 0, Size#,DC&,Point#,0,Blendmode#, 0)
UpdateLayeredWindow() übernimmt das Zeichnen/Neuzeichen des Fensters !
Die benötigten Daten zum Zeichnen holt sich die Funktion direkt vom DC !
Das geht extrem schnell, da Windows keinen weiteren Speicher reservieren muss.
Hautpschleife
#############
Var Ende& = 0
Whilenot Ende&
Waitinput
If %MousePressed = 1
Sendmessage(%hwnd,$0112,$0F012,0)
ElseIf %MousePressed = 2
OnEnd()
Endif
EndWhile
Ende-Procedur
###############################
Proc OnEnd
Dispose Size#,Point#,Blendmode#
~DeleteDC(DC&)
~DeleteObject(bm&)
Ende& = 1
EndProc
###############################
###############################
GDIPLUS
###############################
Proc InitGDIPlus
Declare gdiplusToken&
Var gdpsi# = New(GdiplusStartupInput)
gdpsi#.GdiplusVersion& = 1
gdpsi#.DebugEventCallback& = 0
gdpsi#.SuppressBackgroundThread& = 0
gdpsi#.SuppressExternalCodecs& = 0
GdiplusStartup(ADDR(gdiplusToken&),gdpsi#,0)
Dispose gdpsi#
Return gdiplusToken&
EndProc
Proc ExitGDIPlus
Parameters gdiplusToken&
GdiplusShutdown(gdiplusToken&)
FreeDLL GDIPlus&
Endproc
Proc S2WSString to WideString
Parameters S$
Declare w$
w$ = Space$((Len(s$)*2)+1)
~MultiByteToWideChar(~CP_ACP, 0, ADDR(s$), -1, ADDR(w$), Len(w$)+1)
Return w$
EndProc
Proc GDIPLoadImage
Parameters Image$
Declare result&,FileW$,Bitmap&
result& = 0
FileW$ = S2WS(Image$)
GdipCreateBitmapFromFile(ADDR(FileW$),ADDR(Bitmap&))
if Bitmap&
result& = Bitmap&
Endif
return result&
EndProc
###############################
Bitte daraus einen "brauchbaren" Code machen, hätte ich ebenso gerne.
Zeile KompilierenMarkierenSeparieren bestimmt Ausgabe-DC.
(PNG-Bild bitte aus Andreas seinem Paket laden.) |
|
|
| |
|
|
|
| Etwas saubereres Beispiel:
Download
KompilierenMarkierenSeparieren'Gemerkt/Separiert von https://xprofan.com/t/?7898 (Andreas Miethe)
'
'###############################
' Layered-Window mit PNG
' und GDIPlus
'###############################
If Val($winver) < 5
Messagebox("Die Windows-Version wird nicht unterstützt","Sorry",0)
End
Endif
'###############################
'Imports
'###############################
Var GdiPlus& = ImportDll("GDIPlus.dll","")
'###############################
'###############################
'Header-Dateien
$H windows.ph
$H Messages.ph
'###############################
'###############################
'Strukturen
'###############################
Struct GdiplusStartupInput = GdiplusVersion&,DebugEventCallback&,SuppressBackgroundThread&,SuppressExternalCodecs&
Struct Size = cx&,cy&
Struct Point = x&,y&
Struct Blendfunction = a#(4)
'###############################
Var WW& = 280' Bildbreite
Var WH& = 280' Bildhöhe
'###############################
cls
Var GdiplusToken& = InitGDIPlus()' GDIPlus initialisieren
Var IObject& = GdipLoadImage("BackPic.png")' PNG mit Alphakanal laden
Var bm& = ~CreateBitmap(ww&,wh&,1,32,0)' 32-Bit Bitmap anlegen
Var DC& = ~CreateCompatibleDC(0)' DC-anlegen
~SelectObject(DC&,bm&)' Bitmap ins DC
Var Graphics& = 0
GdipCreateFromHdc(%hDC2,Addr(Graphics&))' Zeichnungs-Object anlegen
GdipSetSmoothingMode(Graphics&,2)' weicher zeichnen
whileLoop 50
GdipDrawImageRectI(Graphics&,IObject&,rnd(width(%hWnd)-ww&),rnd(height(%hWnd)-wh&),ww&,wh&)' Bild zeichnen
wend
repaint 1
GdipDeleteGraphics(Graphics&)' Zeichnugs-Object freigeben
GdipDisposeImage(IObject&)' Bitmap feigeben
ExitGDIPlus(gdiplusToken&)' GDIPlus beenden
waitinput
OnEnd()
end
'Ende-Procedur
'###############################
Proc OnEnd
~DeleteDC(DC&)
~DeleteObject(bm&)
EndProc
'###############################
'###############################
'GDIPLUS
'###############################
Proc InitGDIPlus
Declare gdiplusToken&
Var gdpsi# = New(GdiplusStartupInput)
gdpsi#.GdiplusVersion& = 1
gdpsi#.DebugEventCallback& = 0
gdpsi#.SuppressBackgroundThread& = 0
gdpsi#.SuppressExternalCodecs& = 0
GdiplusStartup(ADDR(gdiplusToken&),gdpsi#,0)
Dispose gdpsi#
Return gdiplusToken&
EndProc
Proc ExitGDIPlus
Parameters gdiplusToken&
GdiplusShutdown(gdiplusToken&)
FreeDLL GDIPlus&
Endproc
Proc S2WS'String to WideString
Parameters S$
Declare w$
w$ = Space$((Len(s$)*2)+1)
~MultiByteToWideChar(~CP_ACP, 0, ADDR(s$), -1, ADDR(w$), Len(w$)+1)
Return w$
EndProc
Proc GDIPLoadImage
Parameters Image$
Declare result&,FileW$,Bitmap&
result& = 0
FileW$ = S2WS(Image$)
GdipCreateBitmapFromFile(ADDR(FileW$),ADDR(Bitmap&))
if Bitmap&
result& = Bitmap&
Endif
return result&
ef='./../../anleitungen-fonction/xprofan/endproc/'>EndProc
'###############################
|
|
|
| |
|
|
|
Marcus Mayer | Erstmal vielen vielen Dank für die schnelle Antwort! Kanns kaum erwarten, das ganze auszuprobieren. |
|
|
| |
|
|
|
Marcus Mayer | Also nochmals vielen Dank für die tolle Antwort. Ich versteh zwar nicht im Detail, wie das ganze funktioniert, konnte mir aber eine Include-Datei basteln, um mit einem schönen Einzeiler beliebig PNGs zu zeichnen. Genau was ich wollte Sollte das ganze in späteren Projekten Anwendung finden, nenne ich die edlen Code-Spender natürlich |
|
|
| |
|
|
|
|
Also nochmals vielen Dank für die tolle Antwort. Ich versteh zwar nicht im Detail, wie das ganze funktioniert, konnte mir aber eine Include-Datei basteln, um mit einem schönen Einzeiler beliebig PNGs zu zeichnen. Genau was ich wollte
Gerne geschehen!
Sollte das ganze in späteren Projekten Anwendung finden, nenne ich die edlen Code-Spender natürlich
Poste doch die dabei herausgekommene Include bei den Includes [...] - haben wiederum alle etwas davon - hätte ich z.B. auch gerne. |
|
|
| |
|
|
|
| Marcus Mayer, Beitrag=57235, Zeitpunkt=27.05.2010
Mach ich doch glatt.^^ Bevor ich die Include jedoch offiziell zur Verfügung stelle, würde ich sie hier gerne nochmal vorab zur Durchsicht posten. Ich kann auch noch gerne einen kleinen Beispiel-Code hinzufügen, falls gewünscht. Wird aber wohl nicht nötig sein
Ah, ich verstehe was Du meinst - jedoch auch diese Besprechung zur Entstehung der Include sollte vlt. besser im Include-Thread zur Verfügung stehen - naja dafür ist es ja der Include-Thread. ^^ Es ist auch legitim z.B. Includes- oder Programme oder ... -Threads als Ideengrundlage nur mit einer Skizze zu posten, um darin erst zu entwickeln oder andere an der Entwicklung teilhaben zu lassen.
Hinweis: Du kannst jederzeit Deine Themen/ Beiträge/ Dateien/ Includes/ Programme... etc. jederzeit bearbeiten und auch löschen - hierzu einfach auf das Beitragsdatum klicken.
Wir könnten wenn Du möchtest die Include auch abtrennen zu einem neuen Thread bei den Includes. |
|
|
| |
|
|
|
Marcus Mayer | Okay, dann machen wirs so Bin hier in der Community ja noch nicht all zu lange und kenne die Gepflogenheiten daher noch nicht so.
Dann wirds wohl auch Zeit, den Thread hier als erledigt zu taggen, richtig? |
|
|
| |
|
|
|
| Genau, ich mach das mal vor. ^^
Nachtrag: Nun hatte ich Deine Include herausgeteilt - synchron hattest Du diese auch bei den Includes angelegt. Habe den herausgeteilten Thread einfach wieder entfernt. ^^ |
|
|
| |
|
|