Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Sehr gern. Ich selbst nutzen nur Windows. Wenn es Irgendwann fertig ist kann sich gern jemand daran machen. Ich nutze eine Handvoll Windoes-APIs, wenn es auf anderen Plattformen Pendants dazu gibt bin ich für alles offen.
So,
ich hab noch einige Fehler bereinigt, brauche jetzt aber Hilfe bei 2 Dingen.
1. Wenn das Ribbon zu groß für das Fenster ist möchte ich das abschneiden. Da bin ich immer noch nicht schlüssig, wie ich das bewerkstelligen soll. Mir schwebt ein Ausblenden am Rand und links und rechts ein Button zum Scrollen vor...
2. Die Integration in den Eventstrom macht mir Probleme. Kann ich das Ergebnis von EventGagdet(), EventType() etc. beeinflussen? Ich weiß nicht, wie ich das integrieren kann (mal abgesehen von der Sache mit den Konstanten). Idealerweise soll das Ribbon ja was bei EventGadget() ausspucken und das Item bei EventData() oder, vielleicht noch besser, die Nummer des Items als EventMenu() zurückliefern.
PostEvent() erlaubt die Angabe des Objekts (idR. dein Ribbon-Gadget), des Eventtyps und der Daten. Diese können dann mit den jeweiligen PB-Event-Funktionen in der Hauptschleife oder per BindEvent-Callback ausgelesen werden. Alle weiteren Informationen können dann per EventData übergeben werden (bspw. über einen Pointer auf eine Struktur).
Verstehe ich das richtig, dass der Code in meinem Modul mit PostEvent() ein Event auslöst, das dafür sorgt, dass WaitWindowEvent() verlassen wird und EventGadget(), EventType() etc. bestückt sind (so wie ich das in PostEvent() angebe)?
Muss ich nicht erst das WaitWindowEvent() verlassen, damit ich das PostEvent() senden kann? Oder löse ich das mit BindEvent() ans Gadget?
Du sendest mit PostEvent genau das was du willst, an das Fenster das du willst (oder musst).
Ausser dem Window kannst du alle anderen Parameter frei wählen und mit EventGadget, EventType() und EventData() innerhalb deiner
"BindGadgetEvent" - @Procedure() abfragen. So braucht der User nichts weiter zu tun und alles was kein direktes eingreifen seitens des Users erfordert, wird von dir ausgeführt.
Dann kannst du innerhalb deiner EventProcedure() immer noch ein PostEvent senden, falls es gebraucht wird (z.B. bei Linksklick)
Ich brauch nochmal einen Schubs. PostEvent klappt prinzipiell, aber da es keine Funktionen, mit denen man eigene Events/EventTypes... sicher registrieren kann (beim nächsten Aufruf vom nächsten Modul entsprehend erhöht), in PureBasic gibt würde ich gern die vorhandenen nutzen (z.B. #PB_EventType_LeftClick). Jetzt habe ich ein wenig rumexperimentiert (z.B. PostEvent(#PB_Event_Gadget,ribbons()\window,ribbons()\handle,#PB_EventType_LeftClick,ribbonid)), aber wie kann ich unterscheiden, ob das Event regulär ausgelöst wurde (User hat geklickt) oder von mir (das Event, das in die Hauptschleife zurückgegeben werden soll)? In EventData() soll die ID des Steuerelements im Ribbon stehen. Oder bin ich da auf dem Holzweg und MUSS eigene Events/EventTypes... definieren?
Ich hab die Zip im ersten Beitrag aktualisiert. Das Modul fügt sich jetzt nahtlos in die Eventverarbeitung ein. Dazu wird ein Event "#PB_Event_Ribbon" erzeugt und als EventType #PB_EventType_LeftClick, #PB_EventType_RightClick, #PB_EventType_MouseEnter (Hovern gestartet) oder #PB_EventType_MouseLeave (Hovern beendet) zurückgegeben. EventGadget() liefert die ID des Items zurück. Das Beispiel wurde auch aktualisiert und vereinfacht.
aber da es keine Funktionen, mit denen man eigene Events/EventTypes... sicher registrieren kann (beim nächsten Aufruf vom nächsten Modul entsprehend erhöht),
Genau das macht mein Code, einfach mal angucken und probieren
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Ja, den kenne ich schon, aber das übernehmen sicher nicht alle so. Die Idee ist ganz gut, aber es wäre besser, wenn das PureBasic gleich selbst bereitstellen würde, siehe mein Beitrag im englischen Forum.