Scrollbalken in Gadget?

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Scrollbalken in Gadget?

Beitrag von CNESM »

Hi Leute,

ich suche eine Möglichkeit, mir für alle bekannten Gadgets abzufragen, ob ein Scrollbalken vorhanden ist oder nicht. Bei normalen Listobjekten in PB sollte das eigentlich kein Problem sein:

Anzahl der Elemente x Schriftgröße in Pixel = Gesamtgröße
Gesamtgröße < Gadgetgröße = Scrollbalken vorhanden

Schwieriger wird es bei aber bei einem ExplorerTreeGadget(). Gibt es da eine einfache Möglichkeit mittels API bzw. Sendmessage? Mir ist bisher nichts bekannt ....

(Ich hab bisher nur unzufriedene Methode entdeckt, die zwar bei PB eigenen Objekten funktionieren, aber bei fremden Anwendungen wie SAP, Lotus usw. ein merkwürdiges Verhalten hervorrufen.)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

>Anzahl der Elemente x Schriftgröße in Pixel = Gesamtgröße
>Gesamtgröße < Gadgetgröße = Scrollbalken vorhanden

:? ... nix verstanden

Beispiel :

Code: Alles auswählen

If GetWindowLong_(hwnd,#GWL_STYLE) & #WS_HSCROLL
	Debug "Hurra , ein Scrollleiche"
EndIf 
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

edel hat geschrieben:>Anzahl der Elemente x Schriftgröße in Pixel = Gesamtgröße
>Gesamtgröße < Gadgetgröße = Scrollbalken vorhanden

:? ... nix verstanden

Beispiel :

Code: Alles auswählen

If GetWindowLong_(hwnd,#GWL_STYLE) & #WS_HSCROLL
	Debug "Hurra , ein Scrollleiche"
EndIf 
:mrgreen: Ich glaub das Problem ist so einfach, das es schon wieder kompliziert ist ...

Der Befehl liefert mir auf meinen Testsystemen (WinME,WinXp,Win200) stets unterschiedliche Werte, obwohl der Code immer der gleiche ist. Hab mich daher auch ganz schnell von der Funktion verabschiedet und mich auf die etwas "umständliche" Rechenmethode konzentriert. Werd mich aber zu Hause nochmal dransetzen und schauen, was da los ist. Dachte nämlich, das ich einfach den falschen API-Bfehle nutze, aber wenn der Vorschlag nun von einer zweiten Person kommt, schau ich mir das nochmal an.

Läuft die Funktion bei dir korrekt?

Zur Rechenmethode:

Ich ermittle die Anzahl der Einträge eines Listviewgadgets (A)
Ermittel die Schriftgröße und rechne diese in Pixel um (B)
Nun nehme ich (A) mal (B) = (C)

Im zweiten Schritt ermittel ich die Gadgethöhe (D)
und vergleiche Sie mit (C)
Ist (C) größer als (D) hat das Gadget einen Scrollbalken
Ist (C) kleiner als (D) hat das Gadget keinen Scrollbalken
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Sehr merkwürdig ....

Wie schon erwähnt arbeitet der Befehl auf allen System irgendwie anders, teilweise korrekt, teilweise mit falschen Rückgabewerte, teilweise immer der gleiche Wert.

Ich habe nun herausgefunden, das das Problem bei einer fertig kompilierten Exe, sofern dies sofort nachdem Windows-Start erstellt wird, nicht mehr auftritt. Kann mir das zwar nicht erklären (Ich glaube dafür gibt es auch keine Erklärung), aber innerhin kann ich dann meine Rechenmethode verwerfen und das zukünftig einfach im Hinterkopf behalten.

Danke für das Posten des Codes edel, das mich dazu gebracht hat, die Sache nochmal anzugehen :)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Der Befehl liefert mir auf meinen Testsystemen (WinME,WinXp,Win200) stets unterschiedliche Werte, obwohl der Code immer der gleiche ist.
Es scheint bei dir ja jetzt zu gehen aber du weisst schon das die unterschiedlichen Ergebnisse auch auf unterschiedlich eingestellten Scrollbars basieren können.

Zu Rechenmethode:
Ich sehe nicht das du den Fensterrand mit einbeziehst. Das würde das Ergebniss um 2 bzw. 4 Pixel verfälschen.
Windows 10 Pro, 64-Bit / Outtakes | Derek
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Fluid Byte hat geschrieben:
Der Befehl liefert mir auf meinen Testsystemen (WinME,WinXp,Win200) stets unterschiedliche Werte, obwohl der Code immer der gleiche ist.
Es scheint bei dir ja jetzt zu gehen aber du weisst schon das die unterschiedlichen Ergebnisse auch auf unterschiedlich eingestellten Scrollbars basieren können.

Zu Rechenmethode:
Ich sehe nicht das du den Fensterrand mit einbeziehst. Das würde das Ergebniss um 2 bzw. 4 Pixel verfälschen.
Es geht leider nur in Bezug auf fertig gelinkte Exen. Den Rahmen habe ich bei mir schon mit eingezogen, nur in der Beispielrechnung fehlt er. Den Rahmen frage ich für jedes Gadget individuell ab:

Code: Alles auswählen

Lview=ListViewGadget(102,10,10,360,295)
Border=GetWindowLong_(GadgetID(GetDlgCtrlID_(Lview)), #GWL_EXSTYLE) & #WS_EX_CLIENTEDGE 
Und ermittle je nach Ergebnis den systemweit eingestellten Rahmen mittels GetSystemMetrics_.

Die Scrollbars sind alle Windows-Standart, also keine persönlich eingestellten Darstellungen. Zudem sind keine anderen Themes vorhanden, die da irgendwie mit reinfließen könnten. Auch andere API Befehle liefern mir teilweise kurriose Werte zurück. Damsl dachte ich, das ich einfach die falschen API-Befehle genutzt habe, jetzt weiß ich das die Ursache auch woanders liegen kann. Das Ganze hat mich aber dazu bewogen, auf API weitgehend zu verzichten.

Danke für deine Anmerkung Fluid Byte!
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

GadgetID(GetDlgCtrlID_(Lview))
Woher bekommt man solche Schnipsel ?! Lview reicht da voellig aus.

Eventuell solltest du dir mal GetSystemMetrics anschauen.
Antworten