Toolbar verschiebbar
-
Hallo, ich hätte mal wieder eine Frage:
Ich habe es geschafft, eine Toolbar, zu erstellen (und dabei die comctl32.lib einzubinden
). Aber die Toolbar klammert sich stur direkt unter die Menüleiste am oberen Fensterrand. Was kann ich tun, damit die Toolbar z. B. am linken Rand erscheint oder frei verschiebbar ist?
-
Mit WinAPI Mitteln ist das mühsam.
Schau Dir mal das Rebar Control an!
http://windowssdk.msdn.microsoft.com/en-us/library/ms652245.aspxDie MFC bringt das von zu Hause aus mit... ebenso andere GUI Bibliotheken.
-
Naja, mit MFC ist wohl alles einfacher.
Ich gehöre aber zu den Typen, die es nicht immer nur einfach haben wollen
, deshalb nutze ich die WinAPI. Wäre schön, wenn jemand ein kleines Tut über verschiebbare Toolbars kennt (hab mal eines gesehen, finde es aber nicht wieder).[EDIT]: Bei mir wird die MSDN-Site immer falsch angezeigt. Das Fenster ist zur Hälfte nach oben aus dem Browser-Bildschirm herausgerutscht, die untere Hälfte des Bildschirms ist grau. Die Menüleisten vom Browser (Mozilla) werden aber noch richtig angezeigt. Ich kann auch das Control für den senkrechten Scrollbalken nicht erreichen und den Scrollbalken nicht ganz nach oben schieben, weil mein Mauszeiger halt immer nur im Bildschirm funktioniert.
Was läuft da falsch?
-
Am einfachsten geht das, wenn du für die Toolbar ein eigenes kleines Fenster als Child-Fenster deines Hauptprogrammes erstellst, rahmenlos und in gleicher Farbe wie der normale Background der Fenster, damit ist es für den Benutzer nicht als eigenständiges Fenster zu erkennen. Dann kannst du eine Toolbar für dieses neue kleine Fenster erstellen, welches du dann so groß wie die Toolbar machst und es somit dann platzieren kannst wo du willst.
Mit dieser Methode kannst du eine Toolbar an jeder Stelle auf dem Desktop, sogar unabhängig deines Fensters, platzieren.
-
Ok, danke, Ynnus. Werde ich mal versuchen. Allerdings muß ich dann vermutlich für das Fentser ne eigene CALLBACK schreiben, die die WM_COMMAND mit den Actioncodes der Toolbar an das Hauptfenster weiterschickt- oder gehts auch einfacher?
Ich glaube, das REBAR-CONTROL macht es so ähnlich, aber da bin ich noch nicht ganz durchgestiegen... Kennt einer ein Tutorial dazu?
-
Elektronix schrieb:
Ok, danke, Ynnus. Werde ich mal versuchen. Allerdings muß ich dann vermutlich für das Fentser ne eigene CALLBACK schreiben, die die WM_COMMAND mit den Actioncodes der Toolbar an das Hauptfenster weiterschickt- oder gehts auch einfacher?
Ich glaube, das REBAR-CONTROL macht es so ähnlich, aber da bin ich noch nicht ganz durchgestiegen... Kennt einer ein Tutorial dazu?
Nein, du brauchst keine eigene Callback für die Toolbar.

Dadurch, dass die Toolbar auf einem Fenster ist, welches das Childwindow deines Hauptfensters ist, werden alle Messages an das Hauptfenster weitergeleitet.
(EDIT: Denkfehler meinerseits. Die Toolbar ist dann das Child des Fensters und leitet an dieses die Messages weiter. Das andere Fenster braucht trotzdem eine Callback-Prozedur. Da hab ich aber die gleiche des Hauptfensters verwendet, wie unten erwähnt)Der idCommand-Teil der TBBUTTON-Structur des Buttons ist der, welcher in der Callback-Prozedur dann mittels LOWORD(wParam) in der WM_COMMAND-Message erscheint. Verständlicher ausgedrückt, dein Hauptfenster bekommt beim Drücken eines Toolbar-Buttons eine WM_COMMAND Message wobei der LOWORD()-Part von wParam gleich dem Command-Index des Buttons ist. Damit kannst du ihn dann identifizieren, also die ganz normale übliche Methode ohne weitere Callback-Funktion.
EDIT: Ich sehe gerade, ich hab das durch meine Klassen-Konstruktion anders gelöst... Kann sein, dass ich mich da oben mit dem Child-Parent-Zeugs geirrt habe, aber ich hab trotzdem nur eine Callback-Prozedur für das alles. Ich hab einfach bei der Fenstererstellung die Callback-Prozedur des Hauptfensters mitgenutzt.
-
Ach so geht das. Gut, das werde ich mal probieren. Auf die Idee, zwei Fenstern die gleiche Callback zuzuweisen, bin ich noch gar nicht gekommen.

Danke viemals.Übrigens, ich habe da einen Artikel "Toolbar-Test" , Datum 28. Mai 2005 von einem Autor namens Stefan Hof aka Ynnus. Ist das von Dir?
Finde ich nämlich sehr übersichtlich kommentiert.

-
Elektronix schrieb:
Übrigens, ich habe da einen Artikel "Toolbar-Test" , Datum 28. Mai 2005 von einem Autor namens Stefan Hof aka Ynnus. Ist das von Dir?
Finde ich nämlich sehr übersichtlich kommentiert.

Ähm, ja, das ist von mir. Danke, finde ich gut, da mal Feedback zu erhalten, dass es jemand gebrauchen konnte.

Ich hab mich damals selbst grad mit Toolbars beschäftigt und dann eine Art Tutorial für Nachkömmlinge für die FAQ aufgeschrieben. Dazu hab ich dann auch einen Beispielcode zum Downloaden erstellt.Das hier ist übrigens das Tutorial, für alle, die nicht wissen, um was es geht: http://www.c-plusplus.net/forum/viewtopic-var-t-is-111101.html
Auf die Idee, zwei Fenstern die gleiche Callback zuzuweisen, bin ich noch gar nicht gekommen.
Ich mach das schon seit längerem so. Weiß garnicht mehr woher ich das habe, ob man das eigentlich so einfach machen "darf".
Aber bisher ist damit noch nie was passiert, keinerlei Fehler und alle Messages kommen korrekt an (und die unterschiedlichen Fenster werden auch im hwnd-Parameter des Callbacks richtig angegeben). Also keine Probleme damit und spart viel Zeit, für jedes Child-Fenster eine eigene Callback zu erstellen.
-
Ynnus schrieb:
spart viel Zeit, für jedes Child-Fenster eine eigene Callback zu erstellen.
Huh?!
Was hast du denn für Childs ...Also normalerweise haben die ne DefWindowProc 
-
CodeFinder schrieb:
Ynnus schrieb:
spart viel Zeit, für jedes Child-Fenster eine eigene Callback zu erstellen.
Huh?!
Was hast du denn für Childs ...Also normalerweise haben die ne DefWindowProc 
Ja, ich meinte damit, dass man nicht für jedes Fenster eine eigene Callback-Funktion erstellen muss, weil man den Childfenstern den Callback des Parentfensters zuweisen kann. Mit Childs meine ich keine Button und Listen, da werden die Messages ja größtenteils mit der DefWindowProc verarbeitet. Aber jetzt wenn man sich ein Zusatzfenster als Container für eine Toolbar oder eine Gruppe von Buttons erstellt, hätte man dem Fenster auch eine eigene Callback-Funktion geben können. Ist aber natürlich mehr Aufwand und wieso sollte man nicht die andere Callback-Funktion gemeinsam nutzen?
Allerdings gibt es trotzdem einige Situationen wo ich Child-Fenster einsetze, die dann aber eine eigene Callback-Funktion erhalten.
-
Das sind dann auch Parent-Window bzw. auch Toplevel-Window genannt
.Aber verstehe was du meinst
.