Programmieren mit C++

Code-Beispiele & Lösungen

Allgemeine visuelle Objektklassen

Dekorierte Dialograhmen

Die Klasse TDecDialogFrame ist von TDecoratedFrame abgeleitet und vereinfacht das Verwenden eines Dialogs als Hauptfenster einer Anwendung. Dazu wird der Dialog mit dem Stil „Child“ versehen und in der InitMainWindows-Methode der Applikation erzeugt. Anschließend erfolgt das Erzeugen eines TDecDialogFrame-Objekts mit dem Dialog als Client. Der Rahmen wird sich dann automatisch in der Größe so anpassen, daß er auf den Dialog paßt, einschließlich aller Dekorationen. Zusätzlich wird der Dialog auf der Mitte des Bildschirms plaziert.

TDecDialogFrame(
     TWindow* parent, 
     const char far* title,
     TWindow* clientWnd, 
     BOOL trackMenuSelection = FALSE,
     TModule* module = 0);

Der Konstruktor erzeugt eine Instanz der Klasse und setzt im Gegensatz zu TDecoratedFrame das Flag wfShrinkToClient.

Interna der Klasse TDecDialogFrame

Neben dem Konstruktor werden auch der Destruktor sowie die Methode SetupWindow überschrieben.

Die SetupWindow-Methode ermittelt die Größe aller Dekorationen wie z. B. Gadgets. Die jeweilige Größe und Plazierung wird den bisher ermittelten Größen und Offsets hinzugefügt, so daß nach Durchlaufen aller Childs des Dialogfensters die tatsächlich benötigte Größe des Frames feststeht. Arbeitspferd der Methode ist _AddToSize(), die in Abhängigkeit von der Ausrichtung den vorhandenen Wert inkrementiert.

void __AddToSize(TWindow* toAdd, void* pSize)
{
  PRECONDITION(toAdd->IsWindow());
  TGadgetWindow* p = TYPESAFE_DOWNCAST(toAdd, TGadgetWindow);

  if(p) 
  {
    if(p->GetDirection()==TGadgetWindow::Horizontal)  
    {
      (*((TSize*)pSize)) += TSize(0, p->Attr.H);
    }
    if(p->GetDirection()==TGadgetWindow::Vertical)  
    {
      (*((TSize*)pSize)) += TSize(p->Attr.W,0);
    }
  }
}

SetupWindow() ermittelt zunächst die Größe des Dialogs, indem für jedes Element _AddToSize aufgerufen wird.

void TDecDialogFrame::SetupWindow ()
{
  TDecoratedFrame::SetupWindow();
  typedef TSmartPointer PTSize;
  typedef TSmartPointer PTRect;
  PTSize sizeOffset = new TSize(0, 0);
  ForEach(__AddToSize, sizeOffset);

Nachdem die erforderliche Fenstergröße bekannt ist, kann die Fenstergröße neu gesetzt festgelegt werden.

  PTRect winRect = new TRect;
  CHECK(IsWindow());
  GetWindowRect(winRect);

  ((TRect*)winRect)->right  += ((TSize*)sizeOffset)->cx;
  ((TRect*)winRect)->bottom += ((TSize*)sizeOffset)->cy;

Erst nach dem Ändern der Fenstergröße erfolgt das Plazieren des Fensters auf die Bildschirmmitte.

  uint16 sw = GetSystemMetrics(SM_CXSCREEN);
  uint16 sh = GetSystemMetrics(SM_CYSCREEN);
  uint16 w = ((TRect*)winRect)->Width();
  uint16 h = ((TRect*)winRect)->Height();
  uint16 x = ((sw/2)-(w/2));
  uint16 y = ((sh/2)-(h/2));

Größenänderung und Plazierung des Fensters werden anschließend durch den API-Aufruf MoveWindow mit den zuvor bestimmten Parametern veranlaßt.

  MoveWindow(x, y, w, h);
}

Der nachfolgende Codeausschnitt zeigt, wie ein TDecDialog-Frame in eine Anwendung eingebettet wird. Die Methode InitMainWindow erzeugt zunächst einen Frame und weist diesem anschließend Icon, Menü und Accelerator-Tabelle zu.

void FlybyApp::InitMainWindow ()
{
  TEnhancedDialog* myDialog;
  Client = myDialog = new TEnhancedDialog(0, "IDD_TEST");

  TDecDialogFrame *frame = new TDecDialogFrame(0, GetName(), 
                                               Client, TRUE);

  frame->SetIcon(this, IDI_SDIAPPLICATION);
  frame->AssignMenu(SDI_MENU);
  frame->Attr.AccelTable = SDI_MENU;

Zusätzlich wird der Dialog mit einer Statuszeile versehen, die für Ausgaben aller Art verwendet werden kann, was aber i. a. nicht zur Standardausstattung eines Dialogfensters gehört und erst durch Einsatz der Klasse TDecDialogFrame komfortabel handhabbar wird.

  TStatusBar *sb = new TStatusBar(frame, 
                                  TGadget::Recessed,
                                  TStatusBar::CapsLock
                                  TStatusBar::NumLock
                                  TStatusBar::ScrollLock
                                  TStatusBar::Overtype);
  frame->Insert(*sb, TDecoratedFrame::Bottom);

Auch das Einsetzen einer Controlbar ist möglich.

  TControlBar* cb = new TControlBar(frame);
  cb->Insert(*(new TButtonGadget(CM_EXIT, CM_EXIT)));
  frame->Insert(*cb, TDecoratedFrame::Top);

Abschließend wird das Fenster zum Hauptfenster erklärt.

  MainWindow = frame;

  EnableCtl3d(TRUE);
}

Konstruktor





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 01:36:10 von textarchiv.alojado.de