WTL Window Resizing

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.

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.