ich hatte ja das Bild geposted
- Button_Pushlike.JPG (36.35 KiB) 4404 mal betrachtet
und gefragt was für Buttons es in der untersten Reihe wären ? wer hat eine Idee ?
ich hab nun mein native DXE_Button in der 1st Version fertig und wollte die letzten "Abstimmung" mit XbpImageButton() vornehmen.
Frage : benutzt jemand XBP_DRAWSTATE_DISABLED ?
... und was ist der Unterschied zu XBP_DRAWSTATE_GRAYED ?
nun steht das, bei XbpImagebutton(), im Zusammenhang mit den Bitmaps ( Icon geht wohl nicht ? )
Code: Alles auswählen
VAR Image
VAR HotImage // das "fehlt" ... auch wegen der Reihenfolge in einer Imagelist
VAR SelectedImage
VAR DisabledImage
tja ... wer das geschrieben hat ( Alaska ) muss sich fragen lassen ob er "keine Plan" von visual Style hat oder was da soll ...
wieso ? weil es, für einen Pushbutton, 5 visual Style Parts gibt und zwar in einer von Windows definierten Reihenfolge
Code: Alles auswählen
#define PBS_NORMAL 1 // 0x00000001
#define PBS_HOT 2 // 0x00000002
#define PBS_PRESSED 3 // 0x00000003
#define PBS_DISABLED 4 // 0x00000004
#define PBS_DEFAULTED 5 // 0x00000005
#define PBS_STYLUSHOT 6 // nur für Tablet PC
der 2nd "Fehler" ist die nicht Verwendung einer Imagelist ... denn da gibt es einen Zusammenhang mit den 5 Style Parts
auch liefert mir GraBackground() IMHO keinen "hover" Effect ... es ist ja auch keine iVar dafür vorhanden.
bei Ownerdraw liefert mir aInfo[XBP_DRAWINFO_STATE] für einen XbpPushbutton
Code: Alles auswählen
XBP_DRAWSTATE_SELECTED Objekt ist gegenwärtig ausgewählt (gedrückt)
XBP_DRAWSTATE_DISABLED Objekt ist gegenwärtig deaktiviert
XBP_DRAWSTATE_FOCUS Objekt hat gegenwärtig den Eingabefokus
XBP_DRAWSTATE_DEFAULTITEM Objekt ist Standard-Dialogelement des Formulars
zurück wobei es folgenden Konstanten in Xbp.CH gibt
Code: Alles auswählen
#define XBP_DRAWSTATE_NORMAL 0
#define XBP_DRAWSTATE_SELECTED 1
#define XBP_DRAWSTATE_GRAYED 2
#define XBP_DRAWSTATE_DISABLED 4
#define XBP_DRAWSTATE_CHECKED 8
#define XBP_DRAWSTATE_FOCUS 16
#define XBP_DRAWSTATE_DEFAULTITEM 32
#define XBP_DRAWSTATE_COMBOBOXEDIT 4096
#define XBP_DRAWSTATE_HEADER 24576
wenn ich jedoch die Windows API benutze
erhalte ich Werte für folgenden Konstanten
Code: Alles auswählen
#define ODS_SELECTED 0x0001
#define ODS_GRAYED 0x0002
#define ODS_DISABLED 0x0004
#define ODS_CHECKED 0x0008
#define ODS_FOCUS 0x0010
#define ODS_DEFAULT 0x0020
#define ODS_COMBOBOXEDIT 0x1000
#define ODS_HOTLIGHT 0x0040
#define ODS_INACTIVE 0x0080
#define ODS_NOACCEL 0x0100
#define ODS_NOFOCUSRECT 0x0200
es gibt also unter Xbase++ gar keine Konstante für "hover" (HOT) ... hm ...
und dann gibt es noch die Frage wie Xbase++ ein "pressed" definiert ...
da es ein XBP_DRAWSTATE_SELECTED = ODS_SELECTED = 1 gibt ging ich davon aus das es das es der Zustand von "pressed" wäre.
es machte mich jedoch stutzig das ich den Punkt nie erreichte und hab dann ein Logbuch aktiviert
Logfile :
-----------
nSelect 0
BST_UNCHECKED
nSelect 16
nSelect 17 -> "pressed"
nSelect 16
BST_FOCUS
nSelect 16
BST_FOCUS
nSelect 16
BST_FOCUS
nSelect 0
BST_UNCHECKED
----------
ein "pressed" ist also ODS_SELECTED + ODS_FOCUS also nOR()/BOr() und nicht nur nAND()/BAnd() -> XBP_DRAWSTATE_SELECTED
! Note : wenn jemand also sein eigenes Ownerdraw Modul mit den DXE_Buttons verwenden will muss also auf den Unterschied achten.
kommen wir nun zu den Ivar und Methoden von XbpImagebutton()
alles was "PROTECT" ist passiert intern also uninteressant für den User also sehen wir uns nur diese an
Code: Alles auswählen
ASSIGN METHOD SetImage() VAR Image
ASSIGN METHOD SetTextAlign() VAR TextAlign
ASSIGN METHOD SetImageAlign() VAR ImageAlign
ASSIGN METHOD SetCaptionLayout() VAR CaptionLayout
bei Layout hatte ich den Thread ja angefangen.
o:CaptionLayout ergibt sich um Grunde durch o:TextAlign wobei es nur 5 (Sinnvolle ?) Positionen gibt
Code: Alles auswählen
XBPALIGN_HCENTER+XBPALIGN_VCENTER // default
XBP_LAYOUT_TEXTLEFT
XBP_LAYOUT_TEXTTOP
XBP_LAYOUT_TEXTBOTTOM
XBP_LAYOUT_TEXTRIGHT
statt dessen gibt es bei den DXE_Buttons die iVar o:LayoutType
Code: Alles auswählen
XBPSTATIC_TYPE_TEXT
XBPSTATIC_TYPE_ICON
XBPSTATIC_TYPE_BITMAP
XBPSTATIC_TYPE_TEXT + XBPSTATIC_TYPE_ICON
XBPSTATIC_TYPE_TEXT + XBPSTATIC_TYPE_BITMAP
zu SetImage()
--------------
hierfür habe ich 2 Methoden
es gibt allerdings einen entscheiden Unterschied : jedes Image wird in die Imagelist aufgenommen und zwar in der Reihenfolge der PBS_* Konstanten !
! Note : wenn die IVARs für die Images schon vor o:Create() belegt wurden wird mit SetIcon() / SetBitmap() KEIN "ersetzen" vorgenommen sondern angehängt. das es jedoch nur 5 Styles gibt wird alles > 5 ignoriert ( Ausnahme 6 bei Tablet PC )
was also der Autor von XbpImageButton() im Design nicht beachtet hat ist das sich auch der visual Style des Image von einem Pushbutton unabhängig vom OS() Theme eine Veränderung ermöglicht. dies ist auch logisch weil es ja einen 3State (rot,gelb,grün) Button gibt
ich werde ein Demo fertig machen und es in die Wissensbasis stellen.
p.s. die Button sind übrigens DXE_CheckBox()