Moderator: Moderatoren


habe ich versucht, aber MLE oder SLE haben immer "weiss" als Hintergrund.brandelh hat geschrieben:man kann den Hintergrund eines Fensters und damit controls auf transparent setzen ...
Wahrscheinlich sind aber die "sichtbaren Teile" im Vordergrund.
::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpDialog:taskList := .T.
::XbpDialog:title := "Neues Formular"
::XbpDialog:drawingArea:ColorBG := -255
::XbpDialog:drawingArea:clipChildren := .T.
::XbpDialog:drawingArea:clipParent := .T.
::XbpDialog:drawingArea:clipSiblings := .F.
leider geht es nur auf das Handle eines "Fenster" (XbpDialog) und nicht auf das Handle von XbParts.brandelh hat geschrieben:TOM hatte mal beschrieben, wie man bei Fenstern die Deckung senkt, das sollte auch bei XbParts gehen.

AUGE_OHR hat geschrieben:habe ich versucht, aber MLE oder SLE haben immer "weiss" als Hintergrund.brandelh hat geschrieben:man kann den Hintergrund eines Fensters und damit controls auf transparent setzen ...
Wahrscheinlich sind aber die "sichtbaren Teile" im Vordergrund.

leider "klappt" das nicht bei "allen" XbParts.Ist die Systemfarbe "transparent" (XBPSYSCLR_TRANSPARENT) als Hintergrundfarbe definiert, verwendet GraBackground() Grafikinformationen aus dem Ausgabebereich des Parent-Objekts des Xbase Parts zum Zeichnen des Hintergrunds.




Das könnte auch die Ursache dafür sein, dass z.B. Checkboxen auf schwarzem Hintergrund erscheinen, wenn man sie auf die neuen Tabpages legt und mit dem SkinFramework von Codejock arbeitet.

YUP ... klar ...Tom hat geschrieben:In einigen Fällen wird offenbar die Farbdarstellung des Parent-Objekts falsch ermittelt, was ja geschehen muss, damit Transparenz funktioniert...


#define TRANSPARENT 1 // wirkt sich nur auf Textdarstellung aus!
#define NULL_BRUSH 5 // Hintergrund des Controls
#define WM_CTLCOLOREDIT 0x133
#define WM_CTLCOLORSTATIC 0x138
CLASS XbpDialogEx FROM XbpDialog
EXPORTED:
// überladene Methoden
METHOD init
METHOD create
METHOD configure
METHOD close
METHOD destroy
// Erweiterung
METHOD DAWndProc
ENDCLASS
// -------------------------------------------------
METHOD XbpDialogEx:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
local rc
::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
rc := _Subclass( ::drawingArea:getHWND(), {|a,b,c,d|::DAWndProc(a,b,c,d)} )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:configure( oParent, oOwner, aPos, aSize, aPP, lVisible )
local rc
rc := _Unsubclass( ::drawingArea:getHWND() )
::XbpDialog:configure( oParent, oOwner, aPos, aSize, aPP, lVisible )
rc := _Subclass( ::drawingArea:getHWND(), {|a,b,c,d|::DAWndProc(a,b,c,d)} )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:close()
::destroy()
RETURN self
// ------------------------------------------------------
METHOD XbpDialogEx:destroy()
local rc
rc := _UnSubclass( ::drawingArea:getHWND() )
::XbpDialog:destroy()
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:DAWndProc( hwnd, msg, wparam, lparam )
local rc
local aChildlist
local oEdit
local i := 0
if msg == WM_CTLCOLOREDIT .or. msg == WM_CTLCOLORSTATIC
// readonly Sle/Mle werden wie Static behandelt
// lparam ist hwnd des Controls, wParam ist hDC
// Xbp-Objekt aus handle ermitteln
aChildlist := ::drawingArea:childlist()
i := ascan( aChildList, {|o|o:getHWND() == lparam .and. ;
( o:isDerivedFrom( XbpSle() ) .or. o:isDerivedFrom( XbpMle() ) ) } )
if i > 0
oEdit := aChildlist[ i ]
nColorBG := oEdit:setColorBG()
if nColorBG == -47 // XBPSYSCLR_TRANSPARENT wird durch -47 XBPSYSCLR_ENTRYFIELD ersetzt...
/* hier geht es um dreierlei Farben:
die Hintergrundfarbe des Textes (wird ignoriert da background mode TRANSPARENT)
die Vordergrundfarbe des Textes (wie :setColorFG())
die Grundfarbe des Controls (wird durch NULL_BRUSH ersetzt, d.h. Transparenz)
*/
rc := DllCall( "gdi32.dll", DLL_STDCALL, "SetBkMode", wparam, TRANSPARENT )
rc := DllCall( "gdi32.dll", DLL_STDCALL, "SetTextColor", wParam, AutomationTranslateColor( oEdit:setColorFG(), .F. ) )
return DllCall( "gdi32.dll", DLL_STDCALL, "GetStockObject", NULL_BRUSH )
endif
endif
endif
// Defaultbehandlung aller anderen Messages.
RETURN _CallPrevWindowProc( hwnd, msg, wparam, lparam )
WowGünter Beyes hat geschrieben:mit der Wahl der richtigen Konstante ist es wohl nicht getan; intern ist Code vonnöten, der auf das Flag XBPSYSCLR_TRANSPARENT reagiert.

#include "Appevent.ch"
#include "DLL.ch"
#include "GRA.ch"
#define TRANSPARENT 1 // wirkt sich nur auf Textdarstellung aus!
#define NULL_BRUSH 5 // Hintergrund des Controls
#define WM_CTLCOLOREDIT 0x133
#define WM_CTLCOLORSTATIC 0x138
// für das benötigte subclass.obj
#pragma library("user32.lib")
PROCEDURE APPSYS
RETURN
PROCEDURE MAIN
LOCAL lExit := .F.
LOCAL nEvent, oXbp, mp1, mp2
LOCAL aSize := {600,600}
LOCAL aPos := CenterPos( aSize, AppDeskTop():currentsize() )
LOCAL oAppNero
LOCAL oDraw
LOCAL oFile
LOCAL oInfo
LOCAL oBitmap
LOCAL nBGClr
oBitmap := XbpBitmap():New():Create()
oBitmap:load(,4000)
nBGClr := oBitmap:getDefaultBgColor()
oBitmap:transparentClr := nBGClr
oAppNero := XbpDialogEx():New(AppDeskTop(),,aPos,aSize)
oAppNero:title := "Xbase++ NeroCOM"
oAppNero:titleBar := .F.
oAppNero:Icon := 1
oAppNero:drawingarea:bitmap := BMP2BMP(oBitmap,aSize)
oAppNero:close := {|| lExit := .T. }
oAppNero:Create()
oDraw := oAppNero:drawingArea
oFile := XbpSLE():new(oDraw, , { 10,272}, {296, 24} )
oFile:bufferLength := 80
oFile:tabStop := .T.
oFile:visible := .T.
oFile:create()
oInfo := XbpMLE():new(oDraw, , { 12, 32}, {576,220} )
oInfo:horizScroll := .F.
oInfo:vertScroll := .T.
oInfo:tabStop := .T.
oInfo:create()
oFile:setdata("hallo du da")
oInfo:setdata("hello world"+chr(13)+chr(10)+"this is a transparent MLE")
nEvent := xbe_None
DO WHILE !lExit
nEvent := AppEvent ( @mp1, @mp2, @oXbp )
DO CASE
CASE nEvent == xbe_None
EXIT
CASE nEvent == xbeP_Quit
EXIT
CASE nEvent == xbeP_Keyboard .and. mp1 == xbeK_ALT_F4
EXIT
OTHERWISE
oXbp:HandleEvent ( nEvent, mp1, mp2 )
ENDCASE
ENDDO
RETURN
STATIC FUNCTION CenterPos( aSize, aRefSize )
RETURN { INT( ( aRefSize[ 1 ] - aSize[ 1 ] ) / 2 ),;
INT( ( aRefSize[ 2 ] - aSize[ 2 ] ) / 2 ) }
FUNCTION BMP2BMP( oBMP, aXbpSize )
LOCAL oHuge
LOCAL oTiny
LOCAL oPS
LOCAL oRet
LOCAL nBits
LOCAL nPlanes
IF aXbpSize[ 2 ] > 0
oHuge := oBMP
nBits := oBMP:bits
nPlanes := oBMP:planes
//Create a small bitmap to fit in our XbpStatic
oTiny := XBPBITMAP() :New() :Create()
oTiny:Make( aXbpSize[ 1 ], aXbpSize[ 2 ], nPlanes, nBits )
oPS := XBPPRESSPACE() :new()
oTiny:presSpace( oPS )
//Copie and resize the huge bitmap to the small bitmap
oHuge:Draw( oPS, { 0, 0, aXbpSize[ 1 ], aXbpSize[ 2 ] },,, GRA_BLT_BBO_IGNORE )
oRet := oTiny
ELSE
oRet := oBMP
ENDIF
RETURN oRet
CLASS XbpDialogEx FROM XbpDialog
EXPORTED:
// überladene Methoden
METHOD init
METHOD create
METHOD configure
METHOD close
METHOD destroy
// Erweiterung
METHOD DAWndProc
ENDCLASS
// -------------------------------------------------
METHOD XbpDialogEx:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
local rc
::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
rc := _Subclass( ::drawingArea:getHWND(), {|a,b,c,d|::DAWndProc(a,b,c,d)} )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:configure( oParent, oOwner, aPos, aSize, aPP, lVisible )
local rc
rc := _Unsubclass( ::drawingArea:getHWND() )
::XbpDialog:configure( oParent, oOwner, aPos, aSize, aPP, lVisible )
rc := _Subclass( ::drawingArea:getHWND(), {|a,b,c,d|::DAWndProc(a,b,c,d)} )
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:close()
::destroy()
RETURN self
// ------------------------------------------------------
METHOD XbpDialogEx:destroy()
local rc
rc := _UnSubclass( ::drawingArea:getHWND() )
::XbpDialog:destroy()
RETURN self
// -------------------------------------------------
METHOD XbpDialogEx:DAWndProc( hwnd, msg, wparam, lparam )
LOCAL rc
LOCAL aChildlist
LOCAL oEdit
LOCAL i := 0
LOCAL nColorBG
if msg == WM_CTLCOLOREDIT .or. msg == WM_CTLCOLORSTATIC
// readonly Sle/Mle werden wie Static behandelt
// lparam ist hwnd des Controls, wParam ist hDC
// Xbp-Objekt aus handle ermitteln
aChildlist := ::drawingArea:childlist()
i := ascan( aChildList, {|o|o:getHWND() == lparam .and. ;
( o:isDerivedFrom( XbpSle() ) .or. o:isDerivedFrom( XbpMle() ) ) } )
if i > 0
oEdit := aChildlist[ i ]
nColorBG := oEdit:setColorBG()
// XBPSYSCLR_TRANSPARENT wird durch -47 XBPSYSCLR_ENTRYFIELD ersetzt...
if nColorBG == -47
/* hier geht es um dreierlei Farben:
die Hintergrundfarbe des Textes (wird ignoriert da background mode TRANSPARENT)
die Vordergrundfarbe des Textes (wie :setColorFG())
die Grundfarbe des Controls (wird durch NULL_BRUSH ersetzt, d.h. Transparenz)
*/
rc := DllCall( "gdi32.dll", DLL_STDCALL, "SetBkMode", wparam, TRANSPARENT )
rc := DllCall( "gdi32.dll", DLL_STDCALL, "SetTextColor", wParam,;
AutomationTranslateColor( oEdit:setColorFG(), .F. ) )
return DllCall( "gdi32.dll", DLL_STDCALL, "GetStockObject", NULL_BRUSH )
endif
endif
endif
// Defaultbehandlung aller anderen Messages.
RETURN _CallPrevWindowProc( hwnd, msg, wparam, lparam )



nicht ganz ... da ist das SLE immer noch "schwarz" ...Günter Beyes hat geschrieben:...sorry, ich meine :drawingArea:clipChildren. Wenn ich das TRUE setze, sehe ich durch SLE und MLE hindurch z.B. den Desktop.



... also doch wieder die Manifest DateiGünter Beyes hat geschrieben:den Black-hole-Effekt beim SLE kann ich nur bestätigen. Er tritt auf, sobald eine Manifestdatei oder -ressource vorhanden ist, auch wenn man die Theme-Darstellung abschaltet. Na ja, Versuch macht kluch![]()
auch mit den chinesischen Schriftzeichen habe ich ja da meine Probleme ...
ja das mit dem scrollen habe ich auch beim ersten Demo beobachtet und es mit oMLE:invalidateRect() versucht ... naja "schön" ist es nichtGünter Beyes hat geschrieben:Der zweite Ansatz zeigt keine echte Transparenz, sondern hier wird einfach ein Screenshot des Dialog-Hintergrunds im Fensterrahmen von MLE und SLE als Bitmap eingesetzt. Leider aber auch nicht anwendungstauglich, weil der MLE-Hintergrund bei jedem Tastendruck und jedem Scrollen flackert.




//
// now construct a Region and call its API function
//
*
* does not work with DWM
*
* hRgn := CreateEllipticRgn(nLeftRect,nTopRect,nRightRect,nBottomRect)
* SetWindowRgn(hHwnd,hRgn,.t.)



hm ... muss ich probieren ...Martin Altmann hat geschrieben:hat das nicht - wie Günter schon schrieb - was mit :drawingArea:clipChildren zu tun? Darf nicht true sein, wenn ich das richtig verstanden habe.

ja da "eingebaut" ?3-D window transition animations, Windows Flip and Windows Flip3D

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast