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. |
![]() In dieser Gruppe stehen alle weiteren Objekte, |
|
In VGroups stehen |
![]() |
![]() |
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(); |
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
|
![]() |
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
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;
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 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: |
|
Rückgabewert: true/false
VisibleGroups funktionieren nicht mit Splittern
Space | Angabe des Füllers in Pixel. 0 = GREEDY |
InitalSpace | Initalspace wenn Space 0 ist. |
Space wirkt sich je nach Elterngruppe aus. Rückgabewert: true/false |
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
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 |
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. |
Parameter: Keine
Schließt eine Gruppe ab.
Rückgabewert: void
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!)
...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)
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)
CWnd * | Zeiger auf das Controls |
m_lWidth | Breite des Controls |
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
CWnd * | Zeiger auf das Controls |
m_lHeight | Höhe des Fensters |
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
CWnd * | Zeiger auf das (Parent-)Fenster (z. B. Dialog) |
ID1 | ID des SouceControls |
ID2 | ID des DestControls |
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
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.
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
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
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
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 *
|
![]() |
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
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. |
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. |
nID | Resourcen ID/Name des FormViews |
strName | Name des Formviews. Wird benötigt um Position von Splittern zu speichern. |
![]() |
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 |
Makros:
|
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. |
-SetAlign() funktioniert nicht. -Fehlermeldung: Group is empty -Fehlermeldung : Statusbar creation failed -VisibleGroups
funktionieren nicht mit Splittern
CDialogLayout::OnInitDialog(); |
-Splitter funktionieren nicht richtig? |
Beispiel: |
|
VC8 (VC++.NET 2005) WindowsCE
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
Die Dateien: *D.lib: Debug
*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
![]() |
VGroup() AddChild(IDC_STEREO,NORSIZE); VGroup(CRect(10,0,0,0)); AddChild(IDC_SURROUND,NORSIZE); AddChild(IDC_HIFI,NORSIZE); End; End; |