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);
}
|