Deutsch
Forum

PNGs mit Alphakanal ohne ProSpeed.dll

 

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.
 
08.05.2010  
 



Hallo Marcus,

Andreas Miethe hat "LayeredWindow mit Alphakanal"  [...]  bereitgestellt -

ich habe das unlieb schlimm verwürgt - aber es zeichnet PNGs:
KompilierenMarkierenSeparieren
Gemerkt/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.)
 
09.05.2010  
 



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

'###############################

1.074 kB
Hochgeladen:09.05.2010
Ladeanzahl236
Herunterladen
15 kB
Hochgeladen:09.05.2010
Ladeanzahl253
Herunterladen
57 kB
Kurzbeschreibung: von http://xprofan.com/t/?7898 (Andreas Miethe)
Hochgeladen:09.05.2010
Ladeanzahl224
Herunterladen
 
09.05.2010  
 




Marcus
Mayer
Erstmal vielen vielen Dank für die schnelle Antwort!
Kanns kaum erwarten, das ganze auszuprobieren.
 
12.05.2010  
 




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
 
23.05.2010  
 




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.
 
23.05.2010  
 



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.
 
27.05.2010  
 




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?
 
27.05.2010  
 



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. ^^
 
28.05.2010  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

10.454 Betrachtungen

Unbenanntvor 0 min.
Sven Bader22.11.2021
Georg Teles20.08.2021
RudiB.16.08.2021
Normann Strübli14.09.2020
Mehr...

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

iF (5x)
Marcus Mayer (4x)


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