| |
|
|
Marcus Mayer | allô allerseits!
je hätte là la fois ne Frage: Ist es possible, avec bordeigenen Mitteln (sprich seulement avec GDIPlus o.ä.) PNG avec canal alpha im Client-Bereich des XProfan-Fensters trop zeichnen, sans qui ProSpeed.dll trop verwenden? (sous Win7)
Habe seiner Zeit avec Profan 6 trop programmieren begonnen et était aussi jusqu'à Version 7.5 droite appliqué dabei. Allerdings habe je ensuite une droite longtemps récréation gemacht et quelques Neuerungen verschlafen. là je programmiertechnisch wohl assez eingerostet suis, werde je aus so mancher Geschichte comment z.B den Layered Windows pas entier malain. |
|
|
| |
|
|
|
| allô Marcus,
Andreas Miethe hat "LayeredWindow avec Alphakanal" [...] bereitgestellt -
j'ai cela unlieb grave verwürgt - mais es zeichnet PNGs: KompilierenMarqueSéparationGemerkt/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
###############################
s'il te plaît daraus une "brauchbaren" Code faire, hätte je ebenso volontiers.
la ligne KompilierenMarqueSéparation bestimmt Ausgabe-DC.
(PNG-Bild s'il te plaît aus Andreas seinem paquet magasin.) |
|
|
| |
|
|
|
| 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='./../../references-fonction/xprofan/endproc/'>EndProc
'###############################
|
|
|
| |
|
|
|
Marcus Mayer | Erstmal vielen vielen Dank pour qui schnelle Antwort! Kanns à peine erwarten, cela ganze auszuprobieren. |
|
|
| |
|
|
|
Marcus Mayer | alors nochmals vielen Dank pour qui tolle Antwort. je versteh zwar pas im Detail, comment cela ganze funktioniert, konnte mir mais une Include-Dossier bricoler, um avec einem schönen Einzeiler beliebig PNGs trop zeichnen. oui c'est ca quoi je voulais Sollte cela ganze dans späteren Projekten Anwendung trouver, nenne je qui edlen Code-Spender naturellement |
|
|
| |
|
|
|
|
alors nochmals vielen Dank pour qui tolle Antwort. je versteh zwar pas im Detail, comment cela ganze funktioniert, konnte mir mais une Include-Dossier bricoler, um avec einem schönen Einzeiler beliebig PNGs trop zeichnen. oui c'est ca quoi je voulais
Gerne geschehen!
Sollte cela ganze dans späteren Projekten Anwendung trouver, nenne je qui edlen Code-Spender naturellement
Poste doch qui dabei herausgekommene Include chez den Comprend [...] - avons wiederum alle quelque chose en - hätte je z.B. aussi volontiers. |
|
|
| |
|
|
|
| Marcus Mayer, Beitrag=57235, Zeitpunkt=27.05.2010
Mach je doch glatt.^ ^ Bevor je qui Include cependant officiel zur Disposition lieu, serait je vous ici volontiers nochmal vorab zur Durchsicht posten. je peux aussi encore volontiers une kleinen Beispiel-Code hinzufügen, si gewünscht. Wird mais wohl pas nötig son
Ah, je comprends quoi Du meinst - cependant aussi cet Besprechung zur Entstehung qui Include sollte vlt. besser im Include-Fil zur Disposition stehen - bof pour ist es oui qui Include-Fil. ^ ^ c'est aussi légitime z.B. Comprend- ou bien Programme ou bien ... -Threads comme Ideengrundlage seulement avec einer Skizze trop posten, um y seulement trop entwickeln ou bien autre à qui Entwicklung teilhaben trop laisser.
Hinweis: tu peux jederzeit Votre Sujets/ Posts/ Fichiers/ Comprend/ Programme... etc. jederzeit Travailler et effacer - hierzu simple sur cela Beitragsdatum klicken.
Wir könnten si Du vouloir qui Include aussi abtrennen trop einem neuen Fil chez den Comprend. |
|
|
| |
|
|
|
Marcus Mayer | Okay, ensuite faire wirs so suis ici dans qui Community oui encore pas espace trop longtemps et kenne qui Gepflogenheiten daher encore pas so.
ensuite wirds wohl aussi Zeit, den Fil ici comme erledigt trop taggen, richtig? |
|
|
| |
|
|
|
| oui c'est ca, je mach cela la fois avant. ^ ^
Nachtrag: eh bien J'ai eu Votre Include herausgeteilt - synchron hattest Du cet aussi chez den Comprend angelegt. Habe den herausgeteilten Fil simple wieder entfernt. ^ ^ |
|
|
| |
|
|