Page 2 of 5
VO Tools für X#
Posted: Fri Jan 10, 2020 3:31 pm
by wriedmann
Hallo Karl-Heinz,
diesen Code
Code: Select all
rMask := dword(_cast, lpBI.bmiColors[1])
gMask := dword(_cast, lpBI.bmiColors[2])
bMask := dword(_cast, lpBI.bmiColors[3])
würde ich ganz einfach so schreiben:
Code: Select all
rMask := lpBI.bmiColors.rgbBlue
gMask := lpBI.bmiColors.rgbGreen
bMask := lpBI.bmiColors.rgbRed
Red und Blue scheinen mir aber vertauscht zu sein.
Wolfgang
VO Tools für X#
Posted: Fri Jan 10, 2020 3:41 pm
by wriedmann
Hallo Franz,
mit den Hinweisen von Karl-Heinz läuft das jetzt, siehe Anlage.
Wolfgang
VO Tools für X#
Posted: Fri Jan 10, 2020 3:46 pm
by Karl-Heinz
Hallo Wolfgang,
Franz kann das mit der ColorToGrayScale() ja mal teste. Ansonsten funktioniert das Zeichnen per ODDrawItem() einwandfrei. Aber wie schon erwähnt: Ist die App themed werden die Buttons halt nur im W2k look gezeichnet ... Wäre die App themed könnte man das ganze dann per Customdraw und dem CallBack
METHOD CustomDraw ( lParam ) CLASS HoverButton // VO Callback NM_CUSTOMDRAW Messages
machen - wenn sich denn einer das antun will
Gruß
Karl-Heinz
VO Tools für X#
Posted: Fri Jan 10, 2020 4:00 pm
by wriedmann
Hallo Karl-Heinz,
ich denke, spätestens mit den neuen WinForms-basierten GUI-Klassen wird das eh alles hinfällig.
Ich habe mich von ownerdraw weitgehend ferngehalten - da waren die unzähligen aus der Zeit gefallenen Delphi-Applikationen mit ihren Buttons eine Lehre....
Wolfgang
VO Tools für X#
Posted: Sat Jan 11, 2020 5:22 pm
by Karl-Heinz
Hallo Wolfgang,
1, Ich habe mir Deinen HoverButtonLib code angesehen und bemerkt, dass die OnDrawItem() weiterhin existiert. Diese Methode wird nicht mehr benötigt wenn der Code der ODDrawItem() von:
Code: Select all
method ODDrawItem( oEvent as Event ) as int
local lpDis as _WINDRAWITEMSTRUCT
local oControl as object
~"ONLYEARLY+"
if oEvent:uMsg == WM_DRAWITEM
lpDis := ptr(_cast,oEvent:lParam)
if lpDis.CtlType == ODT_BUTTON
oControl := GetObjectByHandle(lpDis.hwndItem)
if oControl <> NULL_OBJECT .and. IsInstanceOf(oControl, #HOVERBUTTON)// .and. IsMethod(oControl,#OnDrawItem)
Send(oControl, #OnDrawItem, lpDis)
endif
endif
endif
~"ONLYEARLY-"
return 0L
in:
Code: Select all
METHOD ODDrawItem( oEvent AS Event ) AS VOID
LOCAL lpDis AS _WINDRAWITEMSTRUCT
lpDis := PTR(_CAST,oEvent:lParam)
SELF:__Draw(lpDis)
RETURN
geändert wird. Es ist nicht notwendig, dass in der ODDrawItem() das control geprüft, und erst über den Umweg OnDrawItem() dann SELF:__Draw(lpDis) aufgerufen wird. Da zudem ein ODDrawitem() Rückgabewert ignoriert wird macht ein INT als Rückgabe wenig Sinn. Dies ist der VO code ( dispatch.prg ) der ODDrawItem() aufruft:
Code: Select all
FUNCTION __Dispatch_DrawItem(oEvent AS @@event, oWindow AS OBJECT) AS LONGINT PASCAL
LOCAL struDrawItem AS _winDRAWITEMSTRUCT
LOCAL oControl AS OBJECT
struDrawItem := PTR(_CAST, oEvent:lParam)
oControl := GetObjectByHandle(struDrawItem.hwnditem)
IF oControl != NULL_OBJECT .AND. IsMethod(oControl, #ODDrawItem)
Send(oControl, #ODDrawItem, oEvent)
oWindow:EventReturnValue := 1L
RETURN 1L
ENDIF
IF IsInstanceOf(oWindow, #Window)
oWindow:Default(oEvent)
ENDIF
RETURN 0L
2. Um die psz warnings los zu werden habe ich zudem alle PSZ() in String2Psz() geändert
Gruß
Karl-Heinz
VO Tools für X#
Posted: Mon Jan 13, 2020 6:06 am
by lagraf
Hallo Wolfgang und Karl-Heinz,
danke für die Umstellung der HooverButton Lib! Ich werde demnächst zum ersten Programm kommen, wo ich die Buttons einsetze, dann probiere ich alles aus.
PS: Ich verwende die unveränderte Version und die Buttons auch auf DataWindows!
VO Tools für X#
Posted: Mon Jan 13, 2020 6:10 am
by lagraf
Noch ein paar Fragen zum ReportPro:
- Wie hoch sind die Kosten dafür?
- Welche Version wird für X# eingesetzt und wie wird die angefordert?
- Für VO verwende ich 2.17, ersetzt die X# Version diese und geht auch für VO oder muß ich beide installiert lassen
VO Tools für X#
Posted: Mon Jan 13, 2020 6:13 am
by wriedmann
Hallo Franz,
ich weiß nicht, wie Du den HoverButton einsetzt - aber wie der Karl-Heniz geschrieben hatte, verwendet der noch den alten Look mit Windows 2000 Charme, und nicht den moderneren Look seit XP bzw. neuer.
Vergleiche das mal:
- HoverSample.png (3.58 KiB) Viewed 490 times
Gerade beim Drüberfahren ändert sich der Look und die ganze Applikation schaut wesentlich moderner aus.
Wolfgang
VO Tools für X#
Posted: Mon Jan 13, 2020 6:18 am
by Karl-Heinz
Jungs,
Mir ist noch aufgefallen, dass in der X# version nie ein Focus rectangle gezeichnet wird. Daher müsste im Constructor dieser seltsame cast ersetzt werden.
Code: Select all
//SELF:lShowFocus := LOGIC(_CAST,_and(GetWindowLong(SELF:hWnd,GWL_STYLE), WS_TABSTOP)) // aktuelle stand
SELF:lShowFocus := _and( GetWindowLong(SELF:hWnd,GWL_STYLE) , WS_TABSTOP ) == WS_TABSTOP
Allerdings wäre es sinnvoller SELF:lShowFocus immer auf TRUE zu setzen. Warum der Autor das Zeichnen eines focus rectangle vom Style WS_TABSTOP abhängig macht ist nicht nachvollziehbar. Anhand dem Inhalt der Struktur weiss man immer wann ein focus rectangle gezeichnet werden muss und wann nicht. Wenn bei einem Button tatsächlich kein focus rectangle erwünscht ist, könnte man dies immer noch mit dem assign ShowFocus steuern.
In der __Draw() Methode sähe die Änderung so aus:
Code: Select all
lDrawFocusRectangle := _AND ( lpDis.itemState , ODS_FOCUS ) == ODS_FOCUS .AND. _AND ( lpDis.itemState , ODS_NOFOCUSRECT ) != ODS_NOFOCUSRECT
// IF SELF:lShowFocus .and. GetFocus() == SELF:hWnd // aktuelle stand
// stattdessen
IF lDrawFocusRectangle
// oder
// IF lDrawFocusRectangle .and. SELF:lShowFocus
SetTextColor(lpDis.hDC, 0x00000000)
SetBkColor(lpDis.hDC, 0x00FFFFFF)
InflateRect(@lpDis.rcItem,-3,-3)
DrawFocusRect(lpDis.hDC,@lpDis.rcItem)
ENDIF
// ENDIF
Gruß
Karl-Heinz
VO Tools für X#
Posted: Mon Jan 13, 2020 6:27 am
by wriedmann
Hallo Franz,
was ReportPro betrifft: ich bin mir nicht sicher, ob es da eine FoX-Subscription braucht oder ob Du die auch so durch Zuschicken eines Kaufnachweises an
info@xsharp.eu bekommst.
Auf jeden Fall bleibt ReportPro für VO parallel bestehen - denn Du kannst schwer eine X#-Version bei VO einbinden und umgekehrt.
Meines Wissens nach gibt es auch eine neuere Version von ReportPro für VO, aber die bekommst Du nur mit einer FoX-Subscription.
Schließlich muss die Arbeit ja auch irgendwie bezahlt werden - auch das Entwicklungsteam muss schließlich von was leben.
Wolfgang