Aufbau und Besonderheiten der 
GUI Layout Lib (GLL).


Bei der GLL wird die Oberfläche in  horizontale und vertikale Gruppen aufgeteilt. In diesen Gruppen können weitere Gruppen oder Controls stehen. Diese erscheinen, je nachdem ob es sich bei der Elterngruppe um eine horizontale oder vertikale Gruppe handelt, neben oder untereinander. Der rote Rahmen steht für die Gruppe. Die schwarzen Rahmen stehen für Controls, die mit dem Befehl AddChild() eingebunden werden, oder andere Gruppen.


HGroup

In dieser Gruppe stehen alle weiteren Objekte, 
seien es Controls (Childs) oder Gruppen, nebeneinander.

VGroup 

In VGroups stehen 
alle untereinander.



Hier ein typischer Aufbau eines Layouts:
Gestartet wird in diesem Fall mit einer VGroup(), da alle 
Objekte untereinander stehen sollen.
Mit AddChild() wird das ListCtrl eingefügt. Unter dem 
ListControl wird ein  Abstand mit AddSpace(10) eingefügt.

Darauf folgt eine horizontale Gruppe mittels HGroup().  In dieser Gruppe wird mit AddSpace(0) oder SetAlign(RIGHT) bewirkt, dass die Buttons (OK & Abbrechen) rechtsbündig ausgerichtet werden. Um einen Abstand zwischen OK und Abbrechen zu erreichen, können Sie ein AddSpace(10) einfügen. Die Gruppen werden mit dem Befehl EndGroup() oder dem Makro End abgeschlossen. Das war alles!

(Was jetzt noch fehlt finden Sie hier.)

Der Layoutaufbau sieht also wie folgt aus:

CDialogLayout::OnInitDialog();
VGroup();
    AddChild(IDC_LISTE);
    AddSpace(10);
    HGroup();
        SetAlign(RIGHT); // oder AddSpace(0);
        AddChild(IDOK,NORESIZE);
        AddSpace(10);
        AddChild(IDCANCEL,NORESIZE);
        End;
    End;


 

Befehle:

Fett (Bold) geschriebene Parameter müssen angegeben werden.
Bei normal geschrieben gibt es einen Default-Wert.
Als Elterngruppe wird die Gruppe bezeichnet, in die eingefügt wird.

Beispiel:
Gruppe1
    Control1
    Control2
    Gruppe2
         Control3
         Control4

Für Control 1 und 2 und Gruppe 2 ist Gruppe 1 die Elterngruppe.
Für Control 3 und 4 ist Gruppe 2 die Elterngruppe.


VGroup / HGroup

LPCRECT Zeiger auf RECT o. CRect (Border).
LPCTSTR  Name der Gruppe.

Fügt eine neue horizontale oder vertikale Gruppe ein. Rückgabewert: true/false


AddVGrpCtrl / AddHGrpCtrl

ID  ID des GroupBox-Controls 
Type  IS_A_GROUP_WINDOW (Default), IS_A_TABCONTROL 
lFlags  USE_INIT_WIDTH/USE_INIT_HEIGHT 
(Bei IS_A_TABCONTROL)
(Default ist 0)

Fügt eine neue horizontale oder vertikale Gruppe ein.

Rückgabewert: true/false


AddVGrpTitleCtrl / AddHGrpTitleCtrl

ID  ID des GroupBox-Controls 
titelID  ID des Controls, dass anstatt des Titeltextes stehen soll 

Wie AddXGrpCtrl, nur steht hier anstelle des Titeltextes eine Control.
z. B. eine CheckBox (siehe Demo-> Dialog 3 CGroupStatic-Demo).

Rückgabewert: true/false


AddLFVGroup/ AddLFHGroup

Lazy fetching-Group
LPCRECT Zeiger auf RECT o. CRect (Border).

Wie AddVisibleXGroup , nur muss diese leer bleiben. Die Gruppe wird als unsichtbar
deklariert und beim Öffnen wird die Message WM_OPEN_LAZY_FETCHING_GROUP
verschickt, wenn sich noch keine Elemente in der Gruppe befinden (darum muss
sie leer bleiben).

Beispiel:
ON_REGISTERED_MESSAGE(WM_OPEN_LAZY_FETCHING_GROUP, OnShowValidate)
...
LRESULT
CTest16::OnShowValidate(WPARAM wpara, LPARAM /*lpara*/)
{
   CLayoutGroupObj *pGroup = reinterpret_cast<CLayoutGroupObj *>(wpara);
   if(pGroup)
      {
      ASSERT(pGroup == pLFGroup);
      if(InitLFGroup(pGroup))  // Wichtig!
         {
         /************************************************************************
         * Hier könnten Controls auch erst erstellt und mit Daten gefüttert werden
         ************************************************************************/

         AddChild(IDC_BUTTON2);
         AddLine();
         EndLFGroup(); // Wichtig!
         }
     }
   return 1;
}

Rückgabewert: CLayoutGroupObj * (Zeiger auf diese Gruppe)


AddVisibleVGroup / AddVisibleHGroup

Visible  Sichtbar (true/false) (Default ist true
LPCRECT Zeiger auf RECT o. CRect (Border).
bReCalc (Default ist true) Setzt die prozentuale Ausdehnung beim Neuberechnen auf 0. In TabControls sollte der Wert auf false gesetzte werden.

Fügt eine wegfaltbare horizontale oder vertikale Gruppe ein.
z. B. für Gruppen in TabControls.

Rückgabewert: CLayoutGroupObj * (Zeiger auf diese Gruppe)
wird für ShowVisibleGroup() benötigt;


AddChild

ID / Wnd ID oder Zeiger auf das Control 
Mode  GREEDY (Default), FIX_VERT, FIX_HORI, NORESIZE
NORESIZE_CALCWIDTH (NORESIZE_CW) 
Percent  Prozentuale Ausdehnung (Default ist 0) 
lFlags NO_ERASE (Default = 0)
Damit sie richtig refresht werden, wird bei
folgenden Controls ein RWD_ERASE angegeben:
ListBox, SysTabControl32, SysTreeView32, 
SysListView32, msctls_progress32.
Wird dieses Control 'gesubclassed', macht das nicht 
immer Sinn. So flackert das Treectrl trotz MemDC
weiterhin. Um dieses zu verhindern, kann in 
lFlags NO_ERASE angegeben werden.
NO_REDRAW führt nach dem Setzen der Größe
kein RedrawWindow() aus. 

Fügt ein Control in die Gruppe ein. GREEDY bedeutet, dass sich das Control horizontal und vertikal ausdehnt. Bei FIX_VERT ist die Höhe fest und nur die Breite vergrößert sich. FIX_HORI ist wie FIX_VERT, nur dass hier die Breite fest ist. NORESIZE
Steht für keine Ausdehnung (Feste Größe).
Geben Sie NORESIZE_CALCWIDTH (bzw NORESIZE_CW) an, wird vorher der Control-Text ausgelesen und die Größe anhand der Textbreite + X berechnet. X steht für 5 oder einen Abstand, den Sie über SetCalcExtra() setzen können. Handelt es sich bei dem Control um eine CheckBox oder einen Radio-Button wird noch einmal 20 für das Symbol draufgeschlagen.

Rückgabewert: true/false


AddSplitter

lFirstPercent  Prozentangabe für die erste Gruppe (5-95) (Default ist 50).
Die Größe der zweiten Gruppe berechnet sich anhand
der ersten Prozentangabe. Zwei = 100 - lFirstPercent. 
bRealTimeLayout  true/false (Default ist true
Name Wird hier ein Name angegeben, dann wird die letzte Position
des Splitters gespeichert, und beim erneuten Aufruf wiederhergestellt.
Dazu muss auch dem Dialog ein Name gegeben werden.
Fügt einen Gruppen- (Ver-)Teiler ein. Ähnlich dem Splitter im Explorerfenster.
Wichtig: Splitter dürfen nicht mit anderen prozentualausdehnenden Gruppen/Controls in einer Gruppe stehen. Also auch nicht mit anderen Splittern!

 
Beispiel:
Falsch Richtig
VGroup();
   AddChild(...);
    AddSplitter();
    AddChild(...);
    AddChild(xxx,xxx,20);
    EndGroup();
VGroup();
   VGroup();
       AddChild(...);
       AddSplitter();
       AddChild(...);
       EndGroup();
    AddChild(xxx,xxx,20);
    EndGroup();

Rückgabewert: true/false
VisibleGroups funktionieren nicht mit Splittern


AddSpace

Space  Angabe des Füllers in Pixel. 0 = GREEDY 
InitalSpace Initalspace wenn Space 0 ist.

Space wirkt sich je nach Elterngruppe aus.
So bewirkt AddSpace(20) in einer Horizontalgruppe eine Breite von 20 Pixel. Ist die Elterngruppe eine VGroup, so würde hier eine Höhe von 20 Pixel in Anspruch genommen. Diese Zwischenräume dehnen sich, außer bei einem Wert von 0, nicht weiter aus. Wird aber als Space ein Wert von 0 angegeben, wird der größtmögliche Platz beansprucht (angefangen bei dem Wert 0). Mehrere AddSpace(0) in einer Gruppe sind möglich.

Rückgabewert: true/false


AddSpreader

xSpace  Initialbreite. Default = 1
ySpace  Initialhöhe. Default = 1
mode GREEDY (Default), FIX_VERT, FIX_HORI, NORESIZE 

Spreader dehnen sich wie Controls aus.
Rückgabewert: true/false


AddSpreaderLike

ID / Wnd ID oder Zeiger auf das Control 
mode GREEDY (Default), FIX_VERT, FIX_HORI, NORESIZE 
Fügt einen Spreader in der Größe von dem angegebenen 
Control ein.
Rückgabewert: true/false

 


AddLine

lFlags LINE_FULL_WIDTH / LINE_FULL_HEIGHT/CENTER_TEXT/LEFT_TEXT/RIGHT_TEXT
szString Text
LINE_FULL_XXX Sorgt dafür, dass die Linie die volle Breite/Höhe des Fensters einnimmt.

Fügt in einer Vertikalgruppe eine horizontale Linie ein (über die komplette Breite der Gruppe). In einer HGroup wäre es eine vertikale Linie in der Höhe der Gruppe.

szString wird nur in vertikalen Gruppen berücksichtigt.

Rückgabewert: true/false

 


EndGroup() / End

Parameter: Keine
Schließt eine Gruppe ab.
Rückgabewert: void


SetAlign

Ausrichtung LEFT,CENTER, RIGHT, CENTERGROUPV,CENTERGROUPH
LEFT Default
CENTER Setzt Gruppen/Controls in einer HGroup vertikal zentriert.
In einer VGroup horizontal zentriert.
RIGHT/BOTTOM Plaziert Gruppen/Controls Rechts- bzw. Linksbündig.
VCENTER Zentriert die Elemente in einer HGruppe vertikal
HCENTER Zentriert die Elemente in einer VGruppe horizontal
VRIGHT Setzt die Elemente in einer VGruppe rechtsbündig.
VLEFT Gibt es nicht (Standard)
HTOP Gibt es nicht (Standard)
HBOTTOM Setzt die Elemente in einer HGruppe an den unteren Rand der Gruppe.

 

Rückgabewert: void




SetGrpProperty (Gibt es ab Version 2 nicht mehr!)

...

AKGetWindowWidth()

CWnd * Zeiger auf das (Parent-)Fenster (z. B. Dialog)
ID ID des Controls

Wird nur CWnd angegeben, wird die Breite dieses Fensters ermittelt.

Wird zusätzlich eine ID übergebe, wird die Breite des Controls ermittelt.
Rückgabewert: int (Breite)


AKGetWindowHeight()

CWnd * Zeiger auf das (Parent-)Fenster (z. B. Dialog)
ID ID des Controls

Wird nur CWnd angegeben, wird die Höhe dieses Fensters ermittelt.

Wird zusätzlich eine ID übergebe, wird die Höhe des Controls ermittelt.
Rückgabewert: int (Höhe)


AKSetWindowWidth()

CWnd * Zeiger auf das Controls
m_lWidth  Breite des Controls
oder
CWnd * Zeiger auf das (Parent-)Fenster (z. B. Dialog)
ID ID des Controls
m_lWidth  Breite des Controls

Wird nur CWnd angegeben, wird die Breite dieses Fensters gesetzt.

Wird zusätzlich eine ID übergebe, wird die Breite des Controls gesetzt.
Rückgabewert: void


AKSetWindowHeight()

CWnd * Zeiger auf das Controls
m_lHeight  Höhe des Fensters
oder
CWnd * Zeiger auf das (Parent-)Fenster (z. B. Dialog)
ID ID des Controls
m_lHeight  Höhe des Controls

Wird nur CWnd angegeben, wird die Höhe dieses Fensters gesetzt.

Wird zusätzlich eine ID übergebe, wird die Höhe des Controls gesetzt.
Rückgabewert: void


AKSetWindowSize()

CWnd * Zeiger auf das (Parent-)Fenster (z. B. Dialog)
ID1 ID des SouceControls
ID2 ID des DestControls
oder
CWnd * Zeiger auf das Source-Control
CWnd * Zeiger auf das Destination-Control

Weißt dem Ziel-Control die gleiche Größe wie dem Quell-Control zu.

Rückgabewert: void


AKIsThemeActive()

Es wird ermittelt, ob für die Applikationen Themen aktiv sind und liefert
in diesem Fall true zurück. Unter Systemen unter XP (Win2k etc.) wird
false zurückgegeben.

Diese Routine wird auch beim Anlegen von CLayoutGroup aufgerufen.
Liefert sie true zurück, wird z. B. dem StaturBar mehr Platz eingeräumt.

 


RegLoadSetSize()

CWnd * Zeiger auf das Fenster (z. B. Dialog)
LPCTSTR Name des Fensters. Dieser wird benötigt um die Daten zu finden.

Lädt die Fensterkoordinaten.
Rückgabewert: void


RegWriteSize()

CWnd * Zeiger auf das Fenster (z. B. Dialog)
LPCTSTR Name des Fensters. Dieser wird benötigt um die Daten zu sichern.

Speichert die Fensterkoordinaten.
Rückgabewert: void


SetDlgName()

LPCTSTR Name des Fensters. Dieser wird benötigt um die Daten zu sichern.

Setzt den Fensternamen, falls dieser nicht schon im Constructor angegeben wurde.
Rückgabewert: void


FindGroup()

hWnd Handel des Controls der Gruppe.
LPCTSTR Name der Gruppe.

Es muss hWnd oder der Name der Gruppe angegeben werden.
Aufruf: m_LayoutGroup.FindGroup();

Rückgabewert: CLayoutGroupObj *


ShowVisibleGroup

 

Grp Zeiger auf CLayoutGroupObj
bShow Macht Gruppe Grp sichtbar oder unsichtbar (true/false)
bResfresh Wird true übergeben wird das Fenster refresht (Default ist false).
Beispiel:
   ShowVisibleGroup(grp1,false);
   ShowVisibleGroup(grp2,true);
   ShowVisibleGroup(grp5,false,true); // Nach dem letzten Aufruf refreshen.
bShrink Schrumpft das Fenster wieder zusammen (Default ist false).
Nur in CDialogLayout.

Rückgabewert: void
Siehe auch VisibleGroups funktionieren nicht mit Splittern


CDialogLayout Constructor

nID Resourcen ID des Dialogs
CWnd* Zeiger auf das Parent-Fenster
strName Name des Dialogs. Wird benötigt, um Position und Größe zu speichern
und beim erneuten Aufruf wiederherzustellen.
bGripper Größerzieh-Icon unten rechts.
lSpread (Default ist GREEDY|LOAD_POS_AND_SIZE,
wenn der Dialog einen Namen hat, sonst GREEDY) 
GREEDY  =  Ausdehnung in alle Richtungen
FIX_HORI  = Feste Breite.
FIX_VERT  = Feste Höhe.
NORESIZE  = Feste Breite und Höhe.
LOAD_POS = Letzte Position wiederherstellen.
LOAD_SIZE = Letzte Größe wiederherstellen.
LOAD_POS_AND_SIZE = Letzte Position und Größe wiederherstellen.
INCLUDE_MENUHEIGHT = Sollte ein Dialog ein Menü haben, fließt hiermit Höhe des Menüs in die Minimalgröße des Dialogs mit ein.

CPropertySheetLayout Constructor

nIDCaption
oder pszCaption
Resourcen ID/Name des Dialogs
CWnd* Zeiger auf das Parent-Fenster
iSelectPage Startseite
strName Name des Dialogs. Wird benötigt um Position
und Größe zu speichern.
bGripper Größerzieh-Icon unten rechts.
lSpread (Default ist GREEDY|LOAD_POS_AND_SIZE,
wenn der Dialog einen Namen hat, sonst GREEDY) 
GREEDY  =  Ausdehnung in alle Richtungen
FIX_HORI  = Feste Breite.
FIX_VERT  = Feste Höhe.
NORESIZE  = Feste Breite und Höhe.
LOAD_POS = Letzte Position wiederherstellen.
LOAD_SIZE = Letzte Größe wiederherstellen.
LOAD_POS_AND_SIZE = Letzte Position und 
Größe wiederherstellen.

Sollte ein Propsheet Modeless sein und mehr Platz benötigen, sendet er eine Message an sein Parent-Fenster. In diesem übergeordneten Fenster müssen/können Sie darauf reagieren. Beispiel anhand von CDialogLayout:

BEGIN_MESSAGE_MAP(CDialogLayout, CDialog)
  //{{AFX_MSG_MAP(CDialogLayout)
    ON_WM_SIZE()
    ON_WM_GETMINMAXINFO()
  //}}AFX_MSG_MAP
    ON_REGISTERED_MESSAGE(WM_PROPPAGE_SIZED_SHEET, OnPageResize)
END_MESSAGE_MAP()


LRESULT CDialogLayout::OnPageResize(WPARAM , LPARAM lp)
{
    if(lp)
        {
        CWnd *pWnd = (CWnd*)lp; // der Sheet!
        if(pWnd->IsKindOf(RUNTIME_CLASS(CPropertySheetLayout)))
            {
            CLayoutGroupObj *pGroup =
       
                m_LayoutGroup.FindGroup(pWnd->GetSafeHwnd());
            if(pGroup)
                {
                pGroup->rcMinSize.right = AKGetWindowWidth(pWnd);
                pGroup->rcMinSize.bottom = AKGetWindowHeight(pWnd);

                pGroup->bVisible = false; // Trick 17 ;-)
                m_LayoutGroup.sShowVisibleGroup(pGroup,true,true);
                }
            }
        }
    SetSize();
    return TRUE; // Wichtig!
}

/*****************************************************/

void CDialogLayout::SetSize()
{
    int iCaption = 0;

    if(GetStyle() & WS_CAPTION)
        iCaption = GetSystemMetrics(SM_CYCAPTION);

    //Neuberechnung des Dialogs einleiten
    m_LayoutGroup.m_RootGroup.bVisible = false; // Trick 17 ;-)
    m_LayoutGroup.sShowVisibleGroup(
        &m_LayoutGroup.m_RootGroup,true,true);

    // Minimale Breite ermitteln   
    m_DlgSize.x = m_LayoutGroup.m_RootGroup.rcMinSize.Width()
        + (GetSystemMetrics(SM_CYDLGFRAME)*2)
        + m_LayoutGroup.m_RootGroup.rcBorder.left
        + m_LayoutGroup.m_RootGroup.rcBorder.right;

    // Minimale Höhe ermitteln
    // iStatusBarHeight ist die gespeicherte Höhe des gleichen.
    // rcBorder.bottom wird nicht berücksichtigt da er
    // GetSystemMetrics(SM_CYDLGFRAME) + iStatusBarHeight groß ist
    // und damit (siehe unten) schon in die Größe einfließt.

    m_DlgSize.y = m_LayoutGroup.m_RootGroup.rcMinSize.Height()
        + iCaption
        + (GetSystemMetrics(SM_CYDLGFRAME)*2)
        + m_LayoutGroup.m_RootGroup.rcBorder.top
        + iStatusBarHeight;

    // Nur vergrößern, wenn auch nötig!
    int w,h;
    w = max(m_DlgSize.x, AKGetWindowWidth(this));
    h = max(m_DlgSize.y, AKGetWindowHeight(this));
       
    SetWindowPos(NULL,0,0, w, h, SWP_NOMOVE);
}

Bei Modeless-ProbSheets wird automatisch 
WS_EX_CONTROLPARENT gesetzt!


CPropertyPageLayout Constructor

nIDTemplate oder
lpszTemplateName
Resourcen ID/Name des Dialogs
nIDCaption ID für den Namen, der für die Beschriftung des Reiters verwendet wird. 
Ist nIDCaption = 0, wird der Name des CPropertyPageLayout-Dialogs genutzt.

CFormViewLayout Constructor

nID Resourcen ID/Name des FormViews
strName Name des Formviews. Wird benötigt um Position von Splittern zu speichern.

CFormViewBox

Die CFormViewBox ist ein Control, in das ein von CView abgeleitetes View  eingehängt werden kann.

Funktionen:

BOOL SetView(CRuntimeClass *pViewClass, CDocument* pDoc/*=NULL*/);

Besonderheiten:

Im Debug-Modus zickt die MFC etwas rum und meldet 2 Asserts, wenn das View per Maus aktiviert wird. Um dieses zu umgehen, sollten Sie die OnMouseActivate()-Funktion verändern. Die MFC 'mag' es wohl nicht, wenn das View kein Child von MainFrame ist, und meldet bei SetActiveView() einen Fehler.

int CTestView1::OnMouseActivate(CWnd* pDesktopWnd, 
                                                          UINT nHitTest, UINT message)
{
    int nResult = CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);

     if (nResult == MA_NOACTIVATE 
        || nResult == MA_NOACTIVATEANDEAT)
        return nResult;   // frame does not want to activate

#ifdef _DEBUG
       return nResult;
#else
      return CFormView::OnMouseActivate(pDesktopWnd, nHitTest, message);
#endif
}

 


Makros:

AddBottomGroup

x ID Für Ok-Botton
y ID Für Abbruch-Button
Erzeugt:

   
AddSpace(2);
    AddLine(LINE_FULL_WIDTH);
    AddSpace(2);

   
HGroup();
        SetAlign(RIGHT);
        AddChild(x,NORESIZE); 
        AddSpace(10);
        AddChild(y,NORESIZE);
        EndGroup();

Wie wird es gemacht?

Projekt 'umbauen'

1. Im Menü Projekt -> Einstellungen wählen.
In der Karteikarte Linker im Feld Objekt-/Bibliothek-Module
den Pfad der Lib eintragen.
z. B. für die Release-Version
../GUILayoutLib/lib/GUILayoutLib.lib 
und für die Debug-Verion
../GUILayoutLib/lib/GUILayoutLibD.lib
2. In der Header-Datei stdafx.h den Pfad zum GLL-Headerfile
eintragen. z. B.
#include "../GUILayoutLib/LayoutGroup.h"
3. Kompilieren - fertig

Dialoge 'umbauen'.

1.  Im Headerfile die Class von dem Layout-Pendant ableiten.
Aus CDialog wird CDialogLayout usw.
#include "LayoutGroup.h" einfügen
2. In der Quellcodedatei alle Aufrufe in den Layout-Pendant
umwandeln. BEGIN_MESSAGE_MAP() nicht vergessen!
3. Über den Klassenassistenten OnInitDialog() oder OnInitialUpdate()
hinzufügen.
4. Das Layout erstellen. Jeweils hinter dem OnInitDialog()
oder OnInitialUpdate()-Aufruf.

Mögliche Fehler:

-SetAlign() funktioniert nicht.
 Beispiel:
    Sie haben in einem TabControl zwei VisibleGroups 
    untergebracht und schalten per TabControl die Gruppen ein  
    oder aus. Die erste Gruppe ist beispielsweise größer als die 
    zweite und Sie haben mit USE_INIT_HEIGHT verhindert,
    dass sich das Layout dauernd anpasst. Nun lässt sich Ihre 
    zweite Gruppe nicht über SetAlign(CENTER) horizontal 
    zentrieren. Und das hat folgenden Grund:
    Gruppen nehmen immer nur soviel Platz ein, wie die 
    Controls/Gruppen in ihrem Innern benötigen. 

-Fehlermeldung: Group is empty
    Sie haben in ihrem Layout eine Gruppe die keine Childs hat. 
   Also keine weiteren Gruppen oder Controls in ihrem Innern.
   Entfernen sie diese Gruppe. Diese Gruppe ist leicht zu finden. 
   Sie sieht so aus:
    XGroup();        // X steht für V oder H
        End;

-Fehlermeldung : Statusbar creation failed
    Hier ist ein Windowsinterner Fehler aufgetreten. 
    Nicht genügend Speicher????

-VisibleGroups funktionieren nicht mit Splittern
    Haben Sie einen Splitter, bei der einer der Gruppen als unsichtbare Gruppe    
    beginnt, wird die Dialog-Größe falsche berechnet.
    Beispiel:

    CDialogLayout::OnInitDialog();
    ...
    m_PreViewGroup = AddVisibleHGroup(false);
        AddChild(&m_Liste);
        AddChild(IDC_CLOSE,NORESIZE);
        End;
    AddSplitter(50);
    AddChild(&m_PropList);

    rufen Sie vor dem Verlassen von OnInitDialog() die Funktion ShowVisibleGroup
    auf:  ShowVisibleGroup(m_PreViewGroup,false,true);

 
-Splitter funktionieren nicht richtig?

   Beispiel:
Falsch Richtig
VGroup();
    AddChild(IDC_BUTTON1);
    AddSplitter();
    AddChild(IDC_BUTTON2);
    AddChild(IDC_BUTTON3);
    AddSplitter();
    AddChild(IDC_BUTTON4);
    End;
VGroup();
    VGroup();
        AddChild(IDC_BUTTON1);
        AddSplitter();
        AddChild(IDC_BUTTON2);
        End;
    AddChild(IDC_BUTTON3);
    AddSplitter();
    AddChild(IDC_BUTTON4);
    End;

Welche Lib für was?

VC6
Debug-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLibD.lib
Release-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLib.lib
Debug-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibDU.lib
Release-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibU.lib
Release-Version (MFC in statischer Bibliothek) = GUILayoutLibStatic.lib

VC7 (VC++.NET 2000) NICHT MEHR UNTERSTÜTZT

-
VC7.1 (VC++.NET 2003)

Debug-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLibDV71.lib
Release-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLibV71.lib
Debug-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibDV71U.lib
Release-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibV71U.lib
Release-Version (MFC in statischer Bibliothek) = GUILayoutLibStaticV71.lib

VC8 (VC++.NET 2005)
Debug-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLibDV8.lib
Release-Version (MFC in gemeinsam genutzter DLL) = GUILayoutLibV8.lib
Debug-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibDV8U.lib
Release-Version Unicode (MFC in gemeinsam genutzter DLL) = GUILayoutLibV8U.lib
 

WindowsCE
Die Dateien: *D.lib: Debug
*Arm*.lib: für den Prozessor ARM (Compaq, alle Pocket PC 2002)
*Mips*.lib: für den Prozessor MIPS (Casio vor Pocket PC 2002, andere)
*sh3*.lib: für den Prozessor SH3
*x86*.lib: für den Prozessor x86 (ja, es gibt CE Maschinen mit einem x86)
*x86em*.lib: für den Emulator auf dem PC



Tricks:

Wie mache ich das:
VGroup()
    AddChild(IDC_STEREO,NORSIZE);
    VGroup(CRect(10,0,0,0));
         AddChild(IDC_SURROUND,NORSIZE);
         AddChild(IDC_HIFI,NORSIZE);
         End;
     End;