VO Tools für X#

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

User avatar
wriedmann
Posts: 3673
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

VO Tools für X#

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
wriedmann
Posts: 3673
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

VO Tools für X#

Post by wriedmann »

Hallo Franz,

mit den Hinweisen von Karl-Heinz läuft das jetzt, siehe Anlage.

Wolfgang
HoverButton.zip
(18.21 KiB) Downloaded 33 times
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Karl-Heinz
Posts: 774
Joined: Wed May 17, 2017 8:50 am
Location: Germany

VO Tools für X#

Post 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
User avatar
wriedmann
Posts: 3673
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

VO Tools für X#

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Karl-Heinz
Posts: 774
Joined: Wed May 17, 2017 8:50 am
Location: Germany

VO Tools für X#

Post 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
lagraf
Posts: 422
Joined: Thu Jan 18, 2018 9:03 am

VO Tools für X#

Post 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!
lagraf
Posts: 422
Joined: Thu Jan 18, 2018 9:03 am

VO Tools für X#

Post 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
User avatar
wriedmann
Posts: 3673
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

VO Tools für X#

Post 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
HoverSample.png (3.58 KiB) Viewed 263 times
Gerade beim Drüberfahren ändert sich der Look und die ganze Applikation schaut wesentlich moderner aus.
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Karl-Heinz
Posts: 774
Joined: Wed May 17, 2017 8:50 am
Location: Germany

VO Tools für X#

Post 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
User avatar
wriedmann
Posts: 3673
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

VO Tools für X#

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply