transparente ( API ) Controls

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

transparente ( API ) Controls

Beitrag von AUGE_OHR »

moin,

wir haben ja die transparency Funktion mit dem man ein "Fenster" transparent machen kann.
Diese Art von Effekten ist bei Win7 / Aero Style durchaus vorgesehen so das die Kunden nach solchen Effekten fragen.

unter Xbase++ "sollte" als Presentation Parameter

Code: Alles auswählen

{{XBP_PP_BGCLR,XBPSYSCLR_TRANSPARENT}}

   oder nach :create()
:setcolorBG(XBPSYSCLR_TRANSPARENT)
dies bewirken, aber nicht bei allen Controls :(
hierbei handelt es sich um "Listen" mit "Inhalt" der sich "verschieben" kann wie bei einer Listbox oder Browse.
verwendet man das XBPSYSCLR_TRANSPARENT bekommt man meistens "schwarz" oder "weiss", aber nicht den "durch Schein" Effekt.

auch bei activeX, wo es z.T. eine Methode / Property dafür gibt, funktioniert es mit Xbase++ nicht. ( Gegenprobe harbour steht noch aus ...)

Code: Alles auswählen

// wird "schwarz"
  oListView:BackColor := XBPSYSCLR_TRANSPARENT
// dito
  oListView:BackColor := AutomationTranslateColor(XBPSYSCLR_TRANSPARENT,.F.)
// dito
  oListView:BackColor := AutomationTranslateColor(XBPSYSCLR_TRANSPARENT,.T.)
// dito
  oListView:BackColor := 0

// Gegenprobe : alle GRA_CLR > 0 funktionieren 
  oListView:BackColor := GRA_CLR_DARKCYAN

// ebenfalls GraMakeRGBColor(
  oListView:BackColor := GraMakeRGBColor({255,242,229})
also habe ich weiter rum gestöber und bis auf sowas gestossen Bild
weil es auch einen (VB) Source dazu gab hab ich mir das mal genauer angesehen und auf die frage "ownerdraw" gekommen.
Ich meine nun nicht, wie in der Demo, das ich alles per "ownerdraw" machen will sondern die "Override" Methoden sagen mir ja das es solche Methoden gibt.

***

Code: Alles auswählen

#define LVM_FIRST                0x1000
#define LVM_SETBKCOLOR           (LVM_FIRST+1)
#define LVM_SETTEXTCOLOR         (LVM_FIRST+36)
#define LVM_SETTEXTBKCOLOR       (LVM_FIRST+38)

   hList := oListView:getHWND()
// Text Farbe funktioniert
  SendMessageA(hList,LVM_SETTEXTCOLOR,0,AutomationTranslateColor(GRA_CLR_DARKPINK,.F.))

// Hintergrund des Text funktioniert
  SendMessageA(hList,LVM_SETTEXTBKCOLOR,0,AutomationTranslateColor(GRA_CLR_RED   ,.F.))

// Hintergrund des Text "transparent" -> "schwarz"
  SendMessageA(hList,LVM_SETTEXTBKCOLOR,0,AutomationTranslateColor(XBPSYSCLR_TRANSPARENT,.F.))
// dito.
  SendMessageA(hList,LVM_SETTEXTBKCOLOR,0,AutomationTranslateColor(XBPSYSCLR_TRANSPARENT,.T.))
// dito
  SendMessageA(hList,LVM_SETTEXTBKCOLOR,0,XBPSYSCLR_TRANSPARENT)

// Gegenkontrolle alles "so" ok
  SendMessageA(hList,LVM_SETTEXTCOLOR   , 0, GRA_CLR_GREEN  )
  SendMessageA(hList,LVM_SETTEXTBKCOLOR , 0, GRA_CLR_YELLOW )
  SendMessageA(hList,LVM_SETBKCOLOR     , 0, GRA_CLR_CYAN   )
also es klappt im Prinzip nur XBPSYSCLR_TRANSPARENT funktioniert nicht ... :(
und dann fand CLR_NONE, also neue Hoffnung

Code: Alles auswählen

#define CLR_NONE                 0xFFFFFFFF
// so nach VB
  SendMessageA(hList,LVM_SETTEXTBKCOLOR , 0, CLR_NONE )
// nix
  SendMessageA(hList,LVM_SETTEXTBKCOLOR , 0, AutomationTranslateColor(CLR_NONE,.F.))
// nix
  SendMessageA(hList,LVM_SETTEXTBKCOLOR , 0, AutomationTranslateColor(CLR_NONE,.T.))

// dito Backgound
  SendMessageA(hList,LVM_SETBKCOLOR,0,CLR_NONE )
// nix
  SendMessageA(hList,LVM_SETBKCOLOR,0,AutomationTranslateColor(CLR_NONE,.F.))
// nix
  SendMessageA(hList,LVM_SETBKCOLOR,0,AutomationTranslateColor(CLR_NONE,.T.))
aber auch das geht mit Xbase++ nicht :(

also nächste Idee :
wenn ich SendMessageA() verwenden um einen Event ala PostAppEvent() zu veröffentlichen dann ist das ja "manuell".
Die Methode die auf LVM_SETBKCOLOR "reagiert" wird gewöhlich vom OS() System "angesprochen".

Mit dem SubClass.OBJ von Günter Beyes müsste ich doch "abhören" können wenn der LVM_SETBKCOLOR Event "gesendet" wird um ein "paint" einzuleiten ?

reicht nun der "abgefangene" Event aus um meine eigene Methode anzusprechen ?
wie "entferne" ich den Event aus der Windows Queue damit er nicht "weitergeleitet" wird ?

... oder muss ich den (genauen) "Namen" der Methode wissen um sie zu "überschreiben" ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: transparente ( API ) Controls

Beitrag von AUGE_OHR »

moin,

ich habe es mit Xbase++ und Listview aus MsComCtl.OCX und Alaska´s ImageClass versucht, aber es "harkt" irgendwo ...

Nun gibt es ja auch die Codejock Tools und da gibt es auch ein Listview und einen ImageManager
Codejock Listview transparency
Codejock Listview transparency
ListView2.JPG (84.79 KiB) 2634 mal betrachtet
das sieht doch schon ganz nett aus, aber es gibt doch noch etwas "störendes" : Die Hilitebar

doch, doch :FullRowSelect := .T. funktioniert und man "sieht" ihn dann auch, aber leider "weiss" der nichts von "Transparenz"
und "hinterlässt" dann einen "grey" Hintergrund ... als wenn sie markiert wären ...

da nun die beide Listview auf der Win API aufbauen müsste es eigentlich auch mit MsComCtl.OCX funktionieren ...
oder liegt es an Alaska´s ImageClass vs. Codejock ImageManager ... hm ... ein Gegentest wäre wohl nötig ... :-k
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: transparente ( API ) Controls

Beitrag von AUGE_OHR »

hi,

da es mit Codejock ging muss es ja auch mit M$ MsComCtl.OCX funktionieren ...

Code: Alles auswählen

   IF FILE("COLORS.BMP")
      ::oBMP:= XbpBitmap():new():create()
      ::oBMP:loadfile("COLORS.BMP")

      // resize to "fit"
      oBMP := BMP2BMP(::oBMP,{aSize[1]-4, aSize[2]-4 })

      // fill Background Picture
      ::ListView:Picture := oBMP:getIPicture()

      // not Center or Bottum
      ::ListView:PictureAlignment := lvwTopLeft

      // lvwTransparent 0
      // lvwOpaque 1
      ::ListView:TextBackground := lvwTransparent
   ENDIF
gruss by OHR
Jimmy
Antworten