Seite 1 von 1

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

Verfasst: 11.08.2006 21:27
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.

Verfasst: 13.08.2006 17:54
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.

Verfasst: 13.08.2006 18:00
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?

Verfasst: 13.08.2006 18:15
von DrShrek
Zu einem Get....() gibt es oft auch eine Set...()

Verfasst: 13.08.2006 18:31
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:

Verfasst: 13.08.2006 18:35
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.

Verfasst: 13.08.2006 19:53
von #NULL
vielleicht geht sowas mit SetWindowLong_()

?
http://www.codeproject.com/useritems/skinscrollbar.asp

Verfasst: 13.08.2006 20:02
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)

That's it !!!

Verfasst: 14.08.2006 03:35
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.