Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Alphablend() / BLENDFUNCTION Structure

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Do, 17. Aug 2017 19:06

hi

bei der API Function Alphablend()
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

gibt es die BLENDFUNCTION Structure
https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Code: Alles auswählen

typedef struct _BLENDFUNCTION {
  BYTE BlendOp;
  BYTE BlendFlags;
  BYTE SourceConstantAlpha;
  BYTE AlphaFormat;
} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
leider funktioniert die API Function "so" nicht wenn ich die Structure mit Xbase++ Werten füttere

Frage : wer weiss "wieso" :?:
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Sa, 19. Aug 2017 21:02

hier erst mal ein Demo was Alphablend() macht
AlphaBlend_127.jpg
AlphaBlend_127.jpg (78.91 KiB) 541 mal betrachtet
BLEND.zip
need DXE and ot4xb
(36.76 KiB) 5-mal heruntergeladen
hier nun ein weiterer Tip :
#define Konstanten sind meisten numerisch wie auch der Alpha Wert ( 0 - 255 )
wie ihr sehen könnt sind die BLENDFUNCTION Structure Member vom Type BYTE ... was kann das für Xbase++ User bedeuten :idea:
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von brandelh » Di, 22. Aug 2017 0:04

leider funktioniert die API Function "so" nicht wenn ich die Structure mit Xbase++ Werten füttere
es gibt keine Xbase++ Werte ... Xbase ++ nutz LONG (32 bit, 4 Byte) für alle Werte die keine Kommastellen benötigen:

x := 1
x := int(...)

und einen festgelegten Fließkommatyp (64 bit), falls Nachkommastellen nötig werden.

In der OT4XB Struktur meine ich mich zu entsinnen, dass Pablo das über eine Klasse regelt und die Konvertierung durchführt.
Dein Beispiel sieht mir aber eher nach C/C++ Quellcode aus. Ich selbst kann mich aber nicht erinnern Strukturen verwendet zu haben.
Ich nutze direkte ot4xb Funktionsaufrufe denen der Datentyp und der Wert übergeben wird, z.B. bei HBPrintPDF() zu QuickPDF.

Mit BAB habe ich sowas gemacht ... ich meine für RM_Chart, dort wird das definiert und normal geladen, intern ist es dann was es soll.

Unter Clipper wurde es so gemacht, dass man *256 / 256 die Bytes von unten nach oben verschoben hat.
Aber das ist lange her und die Reihenfolge im Speicher ist auch tricky ...

Warum BlendFunktion nicht macht was du willst, kann ich aber nicht beurteilen.
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Di, 22. Aug 2017 14:47

brandelh hat geschrieben:
Di, 22. Aug 2017 0:04
leider funktioniert die API Function "so" nicht wenn ich die Structure mit Xbase++ Werten füttere
es gibt keine Xbase++ Werte ... Xbase ++ nutz LONG (32 bit, 4 Byte) für alle Werte die keine Kommastellen benötigen:
JA JA JA =D>
brandelh hat geschrieben:In der OT4XB Struktur meine ich mich zu entsinnen, dass Pablo das über eine Klasse regelt und die Konvertierung durchführt.
in diesem Fall scheinbar nicht ...
kann Pablos Newsforum seit 1 Woche nicht erreichen
brandelh hat geschrieben:Mit BAB habe ich sowas gemacht ... ich meine für RM_Chart, dort wird das definiert und normal geladen, intern ist es dann was es soll.
OK ... bei 4 x 1 BYTE
brandelh hat geschrieben:Unter Clipper wurde es so gemacht, dass man *256 / 256 die Bytes von unten nach oben verschoben hat.
Aber das ist lange her und die Reihenfolge im Speicher ist auch tricky ...
das wusste ich noch nicht :shock:
brandelh hat geschrieben:Warum BlendFunktion nicht macht was du willst, kann ich aber nicht beurteilen.
Das Demo funktioniert ... das re-paint ist nicht sauber aber man kann erkennen was es macht.
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von brandelh » Mi, 23. Aug 2017 7:21

Hier ist die von Pablo verbesserte BAP2.ZIP, es gibt dort eine Funktion, welche bei Rückgabewerten von DLLs BYTE Werte extrahiert, aber das ist wohl nicht was du brauchst.
Ich finde hier keine Beispiele mit byte, aber byte und bit Schiebereien unter DOS habe ich damals benötigt, nur weiß ich nicht mehr warum ;-)
BAP2.zip
(14.03 KiB) 7-mal heruntergeladen
In der Erläuterung wird aber z.B. auf BIN2U() verwiesen und da viel mir ein .... die BIN Funktionen sind für den Zweck gedacht.

Bin2u() leider nur 32 bit zahl zu binär string und zurück, keine direkten byte Zugriffe

Bei der OT4XB Struktur aus dem Beispiel:

Code: Alles auswählen

BEGIN STRUCTURE <ClassName>   [EXTENDING <SuperClass> ]
    MEMBER BOOL <memberName>
    MEMBER BYTE <memberName>
    MEMBER WORD <memberName>
    MEMBER DWORD <memberName>
    MEMBER DWORD64 <memberName>
    MEMBER DOUBLE <memberName>
    MEMBER FLOAT <memberName>
    MEMBER BINSTR <memberName> SIZE <nSize>
    MEMBER SZSTR <memberName>  SIZE <nSize>
    MEMBER DYNSZ <memberName>
    MEMBER LPXBASE <memberName>
    MEMBER @ <memberClass> <memberName>
END STRUCTURE
sieht Pablo aber eindeutig die direkte Verwendung von Byte vor.
Ich kann nicht glauben dass das nicht funktionieren sollte, da er das so schon ewig drin hat.

Ich selbst nutze aber solche Strukturen nicht.
Gruß
Hubert

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von mikehoffmann » Mi, 23. Aug 2017 17:01

Ich hab's auch mal probiert, der Einfachheit halber ohne double buffering. Die gesamte client area wird für die Darstellung genutzt.
Alpha.png
Alpha.png (148.71 KiB) 432 mal betrachtet
Flutscht wie eine Eins. Painten auch ohne Probleme. Nachfolgend der komplette code des Programms.

--- snip ---
#include "CockpitGuiLibs.ch"
#include "CrackAndDispatch.ch"
#include "Windows.ch"

FUNCTION Main
UserTask(AlphaBlendWindow())
Application():Run()
RETURN NIL


CLASS AlphaBlendWindow FROM UserTaskWindow,CrackAndDispatch

EXPORTED:

VAR trackBar
VAR image
VAR cxSource
VAR cySource
VAR cx,cy

METHOD OnCreate
METHOD OnSize
METHOD OnPaint
METHOD OnNotify

ENDCLASS


METHOD AlphaBlendWindow:OnCreate

LOCAL bitmap

* Create the trackbar
::trackBar := TrackBarControl():Create(,(TBS_BOTTOM|TBS_AUTOTICKS|TBS_TOOLTIPS|WS_CHILD|WS_VISIBLE),10,10,100,100,self)

* Set its range
::trackBar:SetRange(.F.,0,255)

* Set ticks in increments of 10
::trackBar:TicFreq := 10

* Load the image
IF (::image := LoadImage(,"JellyFish.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)) == NIL
SysError("Cannot load bitmap.")
ENDIF

* Get its size and take it down
bitmap := BITMAPSTRUCT():New()
::image:GetObject(,@bitmap)
::cxSource = bitmap:bmWidth
::cySource = bitmap:bmHeight

RETURN 0


METHOD AlphaBlendWindow:OnSize(_,cx,cy)

* Reposition the trackbar
::trackBar:Move(100,cy-50,cx-200,30,TRUE)

* take down the client area size
::cx := cx
::cy := cy

RETURN 0


METHOD AlphaBlendWindow:OnPaint

LOCAL ps,dc,dcMem,bf

* Begin painting
dc := ::BeginPaint(@ps)

* Create a device context for the bitmap
dcMem := dc:CreateCompatibleDC()

* Put it in
dcMem:SelectObject(::image)

* Prepare the blending parameters
bf := BLENDFUNCTION():New()
bf:BlendOp := AC_SRC_OVER
bf:SourceConstantAlpha := ::trackBar:sliderPos && The blending level is taken from the track bar

* Go blending
dc:AlphaBlend( 0, 0, ::cx, ::cy, dcMem, 0, 0, ::cxSource, ::cySource, bf)

* Discard the memory device context
dcMem:Delete()

* We're done painting
::EndPaint(ps)

RETURN 0


METHOD AlphaBlendWindow:OnNotify
::InvalidateRect(,.T.)
RETURN 0

--- snap ---

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von brandelh » Mi, 23. Aug 2017 21:47

#define Konstanten sind meisten numerisch wie auch der Alpha Wert ( 0 - 255 )
wie ihr sehen könnt sind die BLENDFUNCTION Structure Member vom Type BYTE ... was kann das für Xbase++ User bedeuten :idea:
ich meine man macht das so :

Benötigt Strukur mit 4 Byte, also eine Speicherkette von 4 Byte: 1. Byte soll 17, 2. Byte 25, 3. Byte 12 und 4. Byte 125 sein:

cMyStruktur := chr(17)+chr(25)+chr(12)+chr(125) // Erklärung was das ist ist sicher nützlich ;-)

Bei der VERWENDUNG, muss man aber auf den Inhalt zugreifen, also PER REFERENZ übergeben

MyApiFunction( @cMyStruktur )

Meine alten Beispiele habe ich nicht mehr gefunden, RM_Chart war es nicht.
Wo ich das benötigt habe weiß ich auch nicht mehr ist alles so lange her
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Mi, 23. Aug 2017 23:07

hi mike,
mikehoffmann hat geschrieben:
Mi, 23. Aug 2017 17:01

Code: Alles auswählen

   * Prepare the blending parameters
   bf := BLENDFUNCTION():New()
   bf:BlendOp := AC_SRC_OVER
   bf:SourceConstantAlpha := ::trackBar:sliderPos  && The blending level is taken from the track bar

   * Go blending
   dc:AlphaBlend( 0, 0, ::cx, ::cy, dcMem, 0, 0, ::cxSource, ::cySource, bf)
Danke für den Code.

Code: Alles auswählen

]bf:SourceConstantAlpha := ::trackBar:sliderPos && The blending level is taken from the track bar
kann man bei Cockpit direkt den Trackbar "Wert" (LONG ?) für die Structure verwenden ?
genau da hatte ich ja die Probleme mit ot4xb ( Pablo ist wieder Online )

wie sieht den bei dir die BLENDFUNCTION aus ? wie kommst du von LONG auf BYTE ?
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Mi, 23. Aug 2017 23:13

brandelh hat geschrieben:
Mi, 23. Aug 2017 21:47
cMyStruktur := chr(17)+chr(25)+chr(12)+chr(125) // Erklärung was das ist ist sicher nützlich ;-)
fast ... =D>

da ich nicht wusste wie es funktioniert ging die suche los und ich wurde fündig in der Alaska Newsgroup
Simon Burford
16. November 2005
archived.generic
FLOAT
und die Lösung am 19. November 2005 von Simon

Code: Alles auswählen

   // this Structure work
   //
   cBlend := Chr(AC_SRC_OVER) +;
             Chr(0)           +;
             Chr(nAlpha)      +;
             IF(lAlpha,Chr(AC_SRC_ALPHA),Chr(0))
   nBlend := Bin2L(cBlend)
es fehlt also noch das Bin2L(cMyStruktur)
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13900
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von brandelh » Do, 24. Aug 2017 3:43

Ich meine, dass die Übergabe per Referenz auf den String genau das Gleiche bewirkt !

Aber wie gesagt, das ist ewig her.
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Do, 24. Aug 2017 7:03

brandelh hat geschrieben:
Do, 24. Aug 2017 3:43
Ich meine, dass die Übergabe per Referenz auf den String genau das Gleiche bewirkt !
ich habe es ausprobiert

Code: Alles auswählen

nRet := @Msimg32:AlphaBlend(;
         pDC, aRect[1], aRect[2], aSize[1], aSize[2],;
         hMemDC, 0, 0, aSize[1], aSize[2], @cblend )
WOW ... es funktioniert tatsächlich mit dem String per Referenz =D>
brandelh hat geschrieben:Aber wie gesagt, das ist ewig her.
aber die grauen Zellen arbeiten noch gut :badgrin: DANKE

---
Nachtrag :
muss mich leider korrigieren ... hatte es an der falschen (inaktiv) Stelle geändert und dachte ... :roll:
hatte es eben gesehen und an der aktiven Stelle ausprobiert und da ging es ohne Bin2L() dann doch nicht ... schade :(

trotzdem mein Dank an dich das du das ganze in die richtige Richtung gebracht hast.
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von mikehoffmann » Do, 24. Aug 2017 16:01

--- snip ---
kann man bei Cockpit direkt den Trackbar "Wert" (LONG ?) für die Structure verwenden ?
--- snap ---

Ja.

--- snip ---
genau da hatte ich ja die Probleme mit ot4xb ( Pablo ist wieder Online )
--- snap ---

Glaube ich nicht.

--- snip ---
wie sieht den bei dir die BLENDFUNCTION aus ?
--- snap ---

So:
STRUCTURE BLENDFUNCTION
BYTE BlendOp
BYTE BlendFlags
BYTE SourceConstantAlpha
BYTE AlphaFormat
ENDSTRUCTURE

--- snip ---
wie kommst du von LONG auf BYTE ?
--- snap ---

Gottvertrauen und eine Fehlermeldung, wenn es nicht geht.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10724
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von AUGE_OHR » Do, 24. Aug 2017 23:04

mikehoffmann hat geschrieben:
Do, 24. Aug 2017 16:01
--- snip ---
genau da hatte ich ja die Probleme mit ot4xb ( Pablo ist wieder Online )
--- snap ---

Glaube ich nicht.
:?: :?: :?:

so geht es nun mit ot4xb

Code: Alles auswählen

// 
//
oBlend    := BLENDFUNCTION():New()
oBlend:BlendOp             := AC_SRC_OVER
oBlend:BlendFlags          := 0
oBlend:SourceConstantAlpha := nAlpha
oBlend:AlphaFormat         := IF(lAlpha,AC_SRC_ALPHA,0)

nRet := @Msimg32:AlphaBlend(;
         pDC, aRect[1], aRect[2], aSize[1], aSize[2],;
         hMemDC,     0,        0, aSize[1], aSize[2], PeekDWord(oBlend) )
gruss by OHR
Jimmy

Benutzeravatar
mikehoffmann
UDF-Programmierer
UDF-Programmierer
Beiträge: 60
Registriert: Mo, 21. Sep 2015 16:22

Re: Alphablend() / BLENDFUNCTION Structure

Beitrag von mikehoffmann » Fr, 25. Aug 2017 8:16

Also, wie ich annahm, kein Problem mit der Struktur. Interessant, dass die einzelnen API-Funktionsparameter bei ot4xb nicht typenspezifisch umgesetzt werden. Das Pinseln funktioniert nun korrekt?

Antworten