Breite von Scrollbars ändern (evtl. per SetSystemMetric ???)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Breite von Scrollbars ändern (evtl. per SetSystemMetric ???)

Beitrag von PureLust »

Hallo zusammen, ...

ich versuche, für eine TouchScreen-Anwendung die vertikalen Scrollbars von z.B. einem ListIconGadget oder einem ComboBoxGadget zu verbreitern, damit die Anwender diese besser auf dem Touchscreen treffen und auch verschieben können.

Meine Forensuche hat leider nur eine Möglichkeit für das ScrollBarGadget selber zu Tage gebracht (Link), nicht jedoch für die Scrollbars anderer Gadgets.

Per GetSystemMetric_() kann man ja z.B. die generelle (systemweite) Breite von vertikalen Scrollbars auslesen.
Ist es denn ggfl. auch irgendwie möglich, diese SystemMetrics zu setzen, oder eben für die o.g. Gadgets die Breite des vertikalen Scrollers zu verändern?

Wäre toll wenn mir da jemand einen Tip geben könnte.

ThanX und Gruß, PL.
Zuletzt geändert von PureLust am 13.08.2006 18:46, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Hallöchen nochmal, ...

hätte denn niemand eine Idee, wie man vielleicht die SystemMetrics verändern könnte? :cry:

Oder weiss jemand, ob man sowas vielleicht über ein eigenes Windows-Theme (halt mit breiten Scrollbalken) machen könnte und wie man ein solches Themes verändern bzw. komplett eigene erstellen könnte?
Gibt es da evtl. Windows Themes-Editoren für?

ThanX, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

da du ScrollAreaGadget() noch nich erwähnt hast, mach ich das hiermit mal, aber ich denke das wird dich eh nich weiter bringen - kennst du ja bestimmt auch schon. :cry:

könntest du nicht die daten vom touchscreen einfach benutzten um die maus zu setzten und maus-clicks simulieren?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Zu einem Get....() gibt es oft auch eine Set...()
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

#NULL hat geschrieben:da du ScrollAreaGadget() noch nich erwähnt hast, mach ich das hiermit mal,...
Hmmm .... was genau meinst Du, könnte mir denn ein ScrollAreaGadget bringen?
#NULL hat geschrieben:könntest du nicht die daten vom touchscreen einfach benutzten um die maus zu setzten und maus-clicks simulieren?
Latürnich. Die Treibersoftware eines Touchscreens setzt natürlich die Touches direkt in Mausmoves und Klicks um ... das ist also nicht das Problem.

Das Problem das es im Grunde zu lösen gilt, sind die dicken Finger der Bediener !!!
Ein Touchscreen (und natürlich auch die menschlichen Finger) sind nunmal leider nicht so präzise wie eine 1200 DPI Maus - daher ist es über einen Touchscreen recht schwierig kleinere Dinge (oder eben schmale Dinge wie einen Scrollbalken) punktgenau zu treffen.

Ich suche also irgend eine generelle (oder auch Gadget spezifische) Möglichkeit die Breite der Scrollbalken zu erhöhen, damit man diese besser treffen kann.

(Fast) Alles andere (Zeilenhöhe von ListIconGadgets, ButtonGröße, etc.) sind natürlich bereits auf die besonderen Bedürfnisse einer TouchScreen-Anwendung angepasst.

Das einzig wirklich große Problem was ich habe und was die Bedienung doch recht erschwert, sind die zu schmalen Scrollbalken.

So zur Info: Das System läuft auf einem IP54 zertifizierten 17" Industrie-TFT bei einer Auflösung von 1280 x 1024 Punkten und verwendet einen kapazitiven IntelliTouch.

Bei der verwendeten Auflösung (die auch nicht verringert werden kann/darf) sind die Scrollbalken mit den blossen Fingern halt nur sehr schwer zu treffen.

Vielleicht noch jemand 'ne Idee, wie man das lösen könnte? :roll:
Zuletzt geändert von PureLust am 13.08.2006 18:40, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Dr. Shrek hat geschrieben:Zu einem Get....() gibt es oft auch eine Set...()
Falls Du auf "GestSystemMetrics()" ansprichst ... das wäre natürlich zu einfach und zu schön um wahr zu sein !!!
Leider gibt es dazu (laut MSDN) aber kein passendes "SetSystemMetrics()" (oder ich hab' es nicht gefunden). :(

Auch bei SystemParametersInfo() hab ich keine passenden Einstellungsmöglichkieten gefunden.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

vielleicht geht sowas mit SetWindowLong_()

?
http://www.codeproject.com/useritems/skinscrollbar.asp
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

vorsicht , geht systemweit und sieht scheisse aus :D .

Code: Alles auswählen

  ncm.NONCLIENTMETRICS\cbSize = SizeOf(NONCLIENTMETRICS) 
  SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,0,@ncm,0)
  ncm\iScrollWidth  = 30
  ncm\iScrollHeight = 30
  SystemParametersInfo_(#SPI_SETNONCLIENTMETRICS,0,@ncm,0)
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

That's it !!!

Beitrag von PureLust »

@#Null:

SetWindowLong_() und auch der Link hat mich leider nicht wirklich weiter gebracht - aber dennoch vielen Danke für den Versuch. :D

@edel :

WOW !!! Das war genau, was ich gesucht hatte !!!
Vielen, vielen Dank !!! :allright: :allright: :allright: :allright: :allright:

Die systemweite Veränderung ist ja wie gesagt kein Problem, da es sich ja ohnehin um ein reines Touchscreen-System handelt und die Anwendung die einzige ist und noch dazu im FullScreen arbeitet.
Damit ich's am Ende des Programms aber dennoch wieder auf die ursprünglichen Werte zurückstellen kann, hab ich mir das ganze noch in zwei kleine Prozeduren gepackt.

Für den, den's interessiert wie sowas dann aussieht (nur mal ein kleines Testbeispiel):

Code: Alles auswählen

Procedure SetSystemScrollBarSize(Width,Height)
	Shared OrigScrollBarWidth, OrigScrollBarHeight
	Protected ncm.NONCLIENTMETRICS\cbSize = SizeOf(NONCLIENTMETRICS)
	SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,0,@ncm,0) 
	If OrigScrollBarWidth  < 1 : OrigScrollBarWidth  = ncm\iScrollWidth  : EndIf
	If OrigScrollBarHeight < 1 : OrigScrollBarHeight = ncm\iScrollHeight : EndIf
	If Width  > 0 : ncm\iScrollWidth  = Width  : EndIf
	If Height > 0 : ncm\iScrollHeight = Height : EndIf
	SystemParametersInfo_(#SPI_SETNONCLIENTMETRICS,0,@ncm,0)
EndProcedure

Procedure RestoreSystemScrollBarSize()
	Shared OrigScrollBarWidth, OrigScrollBarHeight
	Protected ncm.NONCLIENTMETRICS\cbSize = SizeOf(NONCLIENTMETRICS)
	SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS,0,@ncm,0) 
	If OrigScrollBarWidth  > 1 : ncm\iScrollWidth  = OrigScrollBarWidth  : EndIf
	If OrigScrollBarHeight > 1 : ncm\iScrollHeight = OrigScrollBarHeight : EndIf
	SystemParametersInfo_(#SPI_SETNONCLIENTMETRICS,0,@ncm,0)
EndProcedure

If OpenWindow(0,0,0,400,300,"BIG Scrollbars",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
	SetSystemScrollBarSize(30,30)
	ExamineDesktops()
	LoadFont(0,"Arial",18)
	
	If CreateGadgetList(WindowID(0))
		ListIconGadget(1, 2, 2, WindowWidth(0)-4, WindowHeight(0)-46, "Testspalte", WindowWidth(0)*2)
		ComboBoxGadget(2, 2, WindowHeight(0)-40, WindowWidth(0)-4, DesktopHeight(0))
	EndIf
	SetGadgetFont(1,FontID(0))
	SetGadgetFont(2,FontID(0))
	For Counter = 1 To 100
		If Counter < 20 : AddGadgetItem(1, -1,"Dies ist Testeintrag "+Str(Counter)) : EndIf
		AddGadgetItem(2, -1,"Eintrag "+Str(Counter))
	Next Counter
	SetGadgetState(2, 53)
	Repeat 
	  Event = WaitWindowEvent()
	Until Event = #PB_Event_CloseWindow
	CloseWindow(0)
	RestoreSystemScrollBarSize()
EndIf
Einziger kleiner Schönheitsfehler: Die Systray-Icons bleiben bis zum nächsten Neustart verhundst - aber damit kann man wohl leben. ;)

Also nochmals tausend Dank an Alle für die Hilfe - hätte ich aus eigener Kraft wohl keine Lösung für gefunden.

Biiiiiiiig ThanXXX !!! :allright:
PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten