OWL Dialoge

Willemers Informatik-Ecke

Minimalcode zum Erzeugen einer Dialogbox

Die Dialogbox wird im Workshop definiert und habe die ID IDD_ABOUT. Sie kann aufgerufen werden durch

void TMyApp::CmAbout() {
  TDialog(GetMainWindow(), IDD_ABOUT).Execute();
}

Dabei ist CmAbout die Funktion, die dem WM_COMMAND hinterlegt wird. Ist die Klasse, die diese Nachricht bearbeitet eine von TWindow abgeleitete, kann statt GetMainWindow() auch this verwendet werden.

Dialog zum Öffnen und Sichern einer Datei

static TFileOpenDialog::TData OpenData(OFN_FILEMUSTEXIST,
                  "All Files (*.*)|*.*|Text Files (*.txt)|*.txt|CD-Inhalt (*.cd)|*.cd",
                   0, "", "*");
TFileOpenDialog *OpenDialog;

    OpenDialog = new TFileOpenDialog(this, OpenData, 0, "Datei lesen");
    if (OpenDialog->Execute()==IDOK) { 
        // Datei wurde ausgewählt
        // Dateiname mit Pfad befindet sich in OpenData.FileName
    } 

Hält man die Variable OpenData global, merkt sich diese die zuletzt bearbeitete Datei und Position.

Analog gibt es auch einen Dialog zum Sichern der Datei.

TFileSaveDialog::TData SaveData;
TFileSaveDialog SaveDialog(this, SaveData, 0, "Exportieren");

	if (SaveDialog.Execute()==IDOK) {
		fp = fopen(SaveData.FileName, "w");
In diesem Fall wurde die TData-Variable nicht vorbelegt.

Schriftauswahl-Dialog

#include <owl\choosefo.h>
 ...
 ...
TChooseFontDialog::TData FontData;
TChooseFontDialog *FontDialog;
static int FontSize = 0;
static char FontName[80] = "";
static TFont *MyFont = 0;

   FontData.Flags = CF_SCREENFONTS; // CF_PRINTERFONTS CF_BOTH
   if (FontSize) {
      strcpy(FontData.LogFont.lfFaceName, FontName);
      FontData.PointSize = FontSize*10;
      FontData.Flags |= CF_INITTOLOGFONTSTRUCT;
   }
   FontDialog = new TChooseFontDialog(this, FontData, 0, "Schrift-Auswahl");
   if (FontDialog->Execute()==IDOK) {
      strcpy(FontName, FontData.LogFont.lfFaceName);
      FontSize = FontData.PointSize/10;
      . . .
  }
  delete FontDialog;
}

Der Aufruf FontDialog->Execute bewirkt, daß aus der Benutzer einen Fontdialog bekommt. Die Daten werden in der FontData-Struktur abgelegt. Die wichtigen Daten sind der "Facename" und die Größe in Punkt (nicht in Pixeln!). Voraussetzung, daß der Fontdialog überhaupt startet, ist die Belegung des FontData.Flags mit einer FONT-Option. Fehlt dieser Eintrag, behauptet Windows, es wären keine Fonts installiert.

Um die Dialogbox vorzubesetzen, muß das Flag CF_INITTOLOGFONTSTRUCT enthalten. Dann werden die Daten aus LogFont verwendet. Unter OS/2 scheint es einen Fehler im OWL zu geben, der verhindert, daß die Punktgröße vorbelegt werden kann. Sollte ich mich irren oder jemand einen guten Workaround haben, bitte eine Mail an mich.

Mit den Informationen kann ein TFont gebildet werden und dann auf Grafiken oder Kontrollelementen angewandt werden.

Farben-Dialog

  TChooseColorDialog::TData choose;
  static TColor    custColors[16] = { 
    0x010101L, 0x101010L, 0x202020L, 0x303030L,
    0x404040L, 0x505050L, 0x606060L, 0x707070L,
    0x808080L, 0x909090L, 0xA0A0A0L, 0xB0B0B0L,
    0xC0C0C0L, 0xD0D0D0L, 0xE0E0E0L, 0xF0F0F0L 
  };

  choose.Flags = CC_RGBINIT;
  choose.Color = Color;
  choose.CustColors = custColors;
  if (TChooseColorDialog(this, choose).Execute() == IDOK) { 
    Color = choose.Color;
  } 


Homepage - OWL-Index 22.9.2001 (C) Copyright 1999, 2001 Arnold Willemer