CWindow-basierte Klassen der WTL können relativ einfach resizable gemacht werden. So wirds gemacht:
1. Die benötigten Klassen sind in <atlframe.h>, also diese Header irgendwo includen.
2. Zusätzlich das gewünschte Fenster von CDialogResize ableiten:
class CMyDialog: public CDialogImpl<CMyDialog>,
public CDialogResize<CMyDialog>
{
3. Die Resize-Map der Klasse hinzufügen:
BEGIN_DLGRESIZE_MAP(CMyDialog)
[...]
END_DLGRESIZE_MAP()
4. Die Resize-Map ist dann auf folgende Weise für alle Controls, die resized oder bewegt werden, zu füllen:
BEGIN_DLGRESIZE_MAP(CMyDialog)
DLGRESIZE_CONTROL(IDC_EDIT_NAME, {flags})
DLGRESIZE_CONTROL(IDC_BUTTON_START, {flags})
BEGIN_DLGRESIZE_GROUP()
DLGRESIZE_CONTROL(IDC_COMBO_ITEMS, {flags})
[...]
END_DLGRESIZE_GROUP()
END_DLGRESIZE_MAP()
Es können Untergruppen spezifiziert werden, die die beinhalteten Controls zusammenfassen.
5. Folgende flags sind erlaubt, die auch per oder-Verknüpfung kombiniert werden können:
- DLSZ_SIZE_X Das Control wird in X-Richtung vergrößert oder verkleinert.
- DLSZ_SIZE_Y Das Control wird in Y-Richtung vergrößert oder verkleinert.
- DLSZ_MOVE_X Das Control wird in X-Richtung bewegt.
- DLSZ_MOVE_Y Das Control wird in Y-Richtung bewegt.
- DLSZ_REPAINT Bei Änderungen wird das Control neu gezeichnet, in dem Invalidate() aufgerufen wird.
6. In OnInitDialog() muß folgende Funktion aufgerufen werden:
DlgResize_Init(bool bAddGripper = true, bool bUseMinTrackSize = true, DWORD dwForceStyle = WS_CLIPCHILDREN);
Die Parameter haben folgende Bedeutung:
- bAddGripper: wenn true, wird ein Gripper-Symbol an der rechte untere Ecke gezeichnet
- bUseMinTrackSize: stellt beim ersten Resize-Aufruf fest, welche die kleinste Größe des Dialogs bzw. Fensters ist
- dwForceStyle: setzt den angegebenen Style für das Fenster. Hinweis: WS_CLIPCHILDREN funktioniert mit Gruppierungs-Rahmen nicht
7. In die Message-Map der Klasse muß folgende Zeile am Ende eingefügt werden, damit die Resize-Klasse mit den nötigen Windows-Messages versorgt werden:
CHAIN_MSG_MAP(CDialogResize<CMyDialog>)
8. Der Dialog oder das Fenster muß den Style WS_THICKFRAME erhalten, sodaß der Benutzer dann auch die Größe des Fensters verändern kann. Im Visual Studio stellt man im Resource-Editor dazu das Property “Border” auf “Resizing”. Bei Bedarf kann man auch noch “Minimize Box” und “Maximize Box” einschalten, um die entsprechenden Buttons in der Titelleiste zu bekommen.