Programmieren mit C++

Borland C++

Oberflächen

Gadgets in TControlBar platzieren

Wie können TGadgets in einer bereits in Tapplication angelegten TControlBar plaziert werden?

Frage

Wenn eine von TApplication abgeleitete Klasse bereits erzeugt und die ControlBar ebenfalls schon angelegt wurde, ist etwas mehr Aufwand nötig. Der nachfolgende Code zeigt, wie es gemacht werden kann.

void  TGrafView::SetupWindow()
{
  TWindowView::SetupWindow();

  TControlBar* cb = ((mpeedApp*)GetApplication())->
                                                  GetControlBar();
  TGadget *za = cb->GadgetWithId( CM_EDITUNDO);

  cb->Insert(*new TButtonGadget(CM_EDITFIND, CM_EDITFIND), 
             After, za);
  cb->Insert(*new TButtonGadget(CM_EDITFINDNEXT, CM_EDITFINDNEXT), 
             After, za);
  cb->Insert(*new TSeparatorGadget(6), After, za);

  cb->LayoutSession();
}

Die Funktion GetControlBar() liefert einen Zeiger auf die vorhandene Controlbar, der schon beim Anlegen der Controlbar initialisiert wurde. Eine Controlbar kann auch alternativ anhand ihrer id ermittelt werden: IDW_TOOLBAR.

Der wesentliche Punkt des Codes ist der Aufruf der Funktion LayoutSession(), die das Gadget letztendlich zum Vorschein bringt.

Die vorgestellte Lösung funktioniert, kann jedoch unter MDI zu Problemen führen. Dies ist darauf zurückzuführen, daß die Buttons jedesmal neu erzeugt und hinzugefügt werden, wenn ein solches Fenster erzeugt wird, was dazu führen kann, daß mehrfach identische Buttons plaziert werden.

Ein Ausweg aus diesem Dilema führt über das Bearbeiten der Nachricht WM_MDIACTIVATE, die in wParam übergibt, ob das Fenster aktiviert oder deaktiviert wird. Mit Hilfe dieser Information können gezielt die jeweils erforderlichen Buttons plaziert und bei der Deaktivierung wieder entfernt werden.

Lösung

Im Gegensatz zu anderen Interface-Objekten für normale Controls wie TButton etc. zerstört die OWL nicht automatisch TGadgets auf einer TControlBar. Dies muß explizit per Hand erledigt werden.

Achtung

Wie kann veranlaßt werden, daß ein Fenster sofort gezeichnet wird?

Frage

Wenn ein Zeiger auf das Fenster vorhanden ist, gibt es zwei Möglichkeiten:

WinPtr->UpdateWindow();
WinPtr->Invalidate();

Der erste Aufruf führt zum unmittelbaren Neuzeichnen des Fensters, während Invalidate() nur die Anforderung zum Zeichnen akkumuliert, wobei die Ausgabe aber erst beim nächsten Idle-Zeitpunkt erfolgt. Dies liegt daran, daß die Nachricht WM_PAINT einen niedrigen Status hat und Inva-lidierungen nicht sofort eine WM_PAINT-Nachricht auslö-sen. UpdateWindow() hingegen löst sofort eine WM_PAINT und damit auch das Neuzeichnen des Fensters aus, sofern es ungültige Bereiche gibt.

Lösung





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-05-20 02:12:03 von textarchiv.alojado.de