Tom Wellige  

About Me
Home
My Blog

Favourites
Books
Drink

Open Source
Miscellaneous
CAN M3S Driver
HPShell
Web DB Editor
Open Queue

Miscellaneous
Wiki
Bookmark

My Programming Page - PMFILTER




PMFILTER

Contents of this page

  • PMFILTER.C, Main Program Module, Main Window Procedure, Options Notebook Dialog Window Procedure



PMFILTER.C
/*********************************************************************
 *                                                                   *
 * MODUL NAME :  pmfilter.c             AUTOR:  Tom Wellige          *
 * ERSTELLT AM:  04.10.94                                            *
 *                                                                   *
 * COPYRIGHT (C) in 1994,95 BY TOM WELLIGE                           *
 * Zu Lernzwecken ausdrcklich freigegeben !!!                       *
 *                                                                   *
 * MODUL-BESCHREIBUNG:                                               *
 *                                                                   *
 *  Programm-Modul fr PMFILTER.EXE .                                *
 *  Ein Programm zur grafischen Anzeige von analogen Filtern.        *
 *                                                                   *
 *********************************************************************/


// ************************************************************************
// Definitionen fr die Kompilation der einzelnen INCLUDE-Dateien
// ************************************************************************

#define INCL_WIN
#define INCL_GPI
#define INCL_DOS

// ************************************************************************
// Headerdateien
// ************************************************************************

#include <os2.h>             // Defs fr OS/2 Programme
#include <stdarg.h>          // Parameterliste fr Funktionen
#include "string.h"          // String-Funktionen

#include "pmfilter.h"        // allgemeine Defs zu PMFILTER
#include "dialog.h"          // Defs zu Dialogen
#include "button.h"          // Defs zur Schalterleiste
#include "notebook.h"        // Defs zu Notebook  z.B. Filter 1 bearbeiten

#include "filter.h"          // Defs fr Filterkoeffizienten
#include "bessel.h"          // Filterkoeffizienten fr Besselfilter
#include "butter.h"          // Filterkoeffizienten fr Butterworthfilter
#include "tscheb3.h"         // Filterkoeffizienten fr Tschebyscheff-Filter
                             //   mit 3dB Welligkeit    
#include "tscheb05.h"        // Filterkoeffizienten fr Tschebyscheff-Filter
                             //   mit 0,5dB Welligkeit  


// ************************************************************************
// Funktionsprototypen Fensterprozeduren
// ************************************************************************

// "Hauptprogramm" Prozedur
MRESULT EXPENTRY ClientWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);

// "šber PMFilter..." Dialog Prozedur
MRESULT EXPENTRY AboutDlgProc  (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);

// "Bearbeiten..." Dialog Prozedur + Notizbuchseiten
MRESULT EXPENTRY BearbDlgProc  (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY TypDlgProc    (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY CharDlgProc   (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY ParamDlgProc  (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
MRESULT EXPENTRY DarstDlgProc  (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);

// ************************************************************************
// Funktionen, die die einzelnen Fensterprozeduren verwenden
// ************************************************************************

// ClientWndProc: Schalterleiste einfgen bzw. anpassen
static VOID SetUpToolBar     ( HWND hwnd, HPS hps, USHORT cx, USHORT cy);
// ClientWndProc: Fenster l”schen
static VOID ClearBackGround  ( HPS hps, USHORT cx, USHORT cy, BOOL monitor);
// ClientWndProc: Koordinatenkreuz und Beschriftung
static VOID DrawBode         ( HPS hps, USHORT cx, USHORT cy, BOOL monitor);
// ClientWndProc: Filtereinstellungen anzeigen
static VOID DrawParameters   ( HPS hps, USHORT cx, USHORT cy, BOOL monitor);
// DrawParamters: String erzeugen
static PSZ  GetPSZ( PSZ szFormat, ... );

// BearbDlgProc: Seiten in Notizbuch einfgen
static BOOL SetUpPage        ( HWND hwndNB, HWND hwnd, PVOID data,
                               INT iArrayIndex );
// BearbDlgProc: GrӇe der Tabulatoren einstellen
static BOOL SetTabDimensions ( HWND hwndNB );
// BearbDlgProc: ermittelt die GrӇe eines Strings
static INT  GetStringSize    ( HPS hps, HWND hwndNB, PSZ szString);

// ************************************************************************
// weitere Programmfunktionen
// ************************************************************************

// ”ffnet FileDialog und l„dt Filter-Structur
static VOID FilterLaden      ( HWND hwnd );
// ”ffnet FileDialog und speichert Filter-Structur
static VOID FilterSpeichern  ( HWND hwnd );

// ”ffnet Infobox mit Text
static VOID Msg              ( PSZ szFormat, ... );


// ************************************************************************
// Globale Variablen
// ************************************************************************

NBPAGE nbpage[] =                   // Informationen zu Notizbuchseiten
{
   {TypDlgProc,   NULLHANDLE, "~Typ",            0L, ID_Typ         },
   {CharDlgProc,  NULLHANDLE, "~Charakteristik", 0L, ID_Charakter   },
   {ParamDlgProc, NULLHANDLE, "~Parameter",      0L, ID_Parameter   },
   {DarstDlgProc, NULLHANDLE, "~Darstellung",    0L, ID_Darstellung }
};
#define PAGE_COUNT (sizeof( nbpage ) / sizeof( NBPAGE ))

CHAR FilterName[CCHMAXPATH];                 // Dateiname mit Filtereinstlg.

HWND hwndClientFrame;						 // Handle auf Rahmen des
                                             // Programmfensters
                                             // (um Titelzeile zu „ndern)


// ************************************************************************
// Main
// Bemerkung: C Hauptprogramm
// ************************************************************************

INT main(VOID)
{
        HAB     hab;                         // Handle auf Anchor-Block

        HMQ     hmq;                         // Handle auf Message-Queue
        QMSG    qmsg;                        // aufgelaufene Message

        HWND    hwndClient;                  // Handle auf Programm-Fenster

        ULONG   FrameCreationFlags =
                        FCF_TITLEBAR |       // Titelzeile
                        FCF_SYSMENU |        // Systemmen
                        FCF_SIZEBORDER |     // gr”áenver„nderbarer Rahmen
                        FCF_MINMAX |         // Button Min-Max
                        FCF_SHELLPOSITION |  // WPS legt Position fest
                        FCF_TASKLIST |       // in Tasklist aufnehmen
                        FCF_ICON |           // besitzt eigenen Icon
                        FCF_MENU |           // besitzt Men
                        FCF_ACCELTABLE;      // besitzt Schnellwahltasten


hab = WinInitialize (0);					 // Programm-Anchor-Block holen
hmq = WinCreateMsgQueue (hab,0);			 // Message-Queue installieren

WinRegisterClass (hab,						 // Fenster registrieren
          "Hauptfenster",                    // Name des Fensters
          ClientWndProc,                     // Fensterprozedur des Fensters
          CS_SIZEREDRAW,                      
          0);

hwndClientFrame = WinCreateStdWindow (HWND_DESKTOP,
          0L,								 // Fenter ”ffnen
          &FrameCreationFlags,
          "Hauptfenster",					 // Name des Fensters
          "PMFilter  -  Simulationsprogramm fr analoge Filter",
          WS_VISIBLE,						 // Titelzeile, sichtbar
          (HMODULE)0,
          ID_ClientWindow,
          &hwndClient);

WinSetWindowPos (hwndClientFrame, 0L,        // Fenster beim ™ffnen
         0,0, 0,0,                           // in maximaler GrӇe anzeigen
         SWP_MAXIMIZE | SWP_SHOW);

while (WinGetMsg (hab,&qmsg,0L,0,0))         // solange Nachrichten auflaufen
      WinDispatchMsg (hab,&qmsg);            // bearbeite diese

WinDestroyWindow (hwndClientFrame);          // Fenster schlieáen

WinDestroyMsgQueue (hmq);                    // Message-Queue l”schen

WinTerminate (hab);                          // Programm-Anchor-Block l”schen

return 0;
}

// ************************************************************************
// FENSTERPROZEDUREN
// ************************************************************************

// ************************************************************************
// ClientWndProc
// Bemerkung: Hauptprogramm-Prozedur
// ************************************************************************

MRESULT EXPENTRY ClientWndProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
           HPS        hps;
   static  USHORT     cxClient, cyClient;


switch (msg)
      {
       case WM_SIZE:                          // FenstergrӇe ermitteln
            cxClient = SHORT1FROMMP (mp2);
            cyClient = SHORT2FROMMP (mp2);
            return (MRESULT) FALSE;

       case WM_PAINT:                         // Grafikausgabe

            hps = WinBeginPaint (hwnd, NULLHANDLE, NULL);
              
              SetUpToolBar    (hwnd, hps, cxClient, cyClient);
              ClearBackGround (hps, cxClient, cyClient, TRUE);
              DrawBode        (hps, cxClient, cyClient, TRUE);
              DrawParameters  (hps, cxClient, cyClient, TRUE);

            WinEndPaint ( hps );
            return (MRESULT) FALSE;

       case WM_COMMAND:                       // Befehl in mp1 ausfhren
            switch (SHORT1FROMMP (mp1))
            {
              case IDM_Filter_Laden:          // Aufruf ber Men
              case IDB_Load:                  // Aufruf ber Schalterleiste
                  FilterLaden( hwnd );		  // Filtereinstellg. laden
                  WinInvalidateRect (hwnd,NULL,FALSE);
                  return (MRESULT) FALSE;

              case IDM_Filter_Speichern:	  // Filtereinstellg. sichern
              case IDB_Save:
                  FilterSpeichern( hwnd );
                  return (MRESULT) FALSE;

              case IDM_Filter_Quit:			  // Programm beenden
              case IDB_Exit:
                  if ( WinMessageBox(HWND_DESKTOP,
                          hwnd,
                          "Programm wirklich beenden ?", "PMFilter",
                          0, MB_YESNO | MB_ICONQUESTION | MB_MOVEABLE )
                       == MBID_YES)
                    WinPostMsg (hwnd,WM_QUIT,(MPARAM)0,(MPARAM)0);
                  return (MRESULT) FALSE;

              case IDM_Bearbeiten_Filter1:	  // Filtereinstellg. bearbeiten
              case IDB_Filter1:
                  WinDlgBox (HWND_DESKTOP,
                        hwnd,
                        BearbDlgProc,
                        (HMODULE) 0,
                        ID_FilterDialog,
                        &(fdata[0]) );
                  WinInvalidateRect (hwnd,NULL,FALSE);
                  return (MRESULT) FALSE;

              case IDM_Bearbeiten_Filter2:	  // Filtereinstellg. bearbeiten
              case IDB_Filter2:
                  WinDlgBox (HWND_DESKTOP,
                        hwnd,
                        BearbDlgProc,
                        (HMODULE) 0,
                        ID_FilterDialog,
                        &(fdata[1]) );
                  WinInvalidateRect (hwnd,NULL,FALSE);
                  return (MRESULT) FALSE;

              case IDM_Bearbeiten_Filter3:    // Filtereinstellg. bearbeiten
              case IDB_Filter3:
                  WinDlgBox (HWND_DESKTOP,
                        hwnd,
                        BearbDlgProc,
                        (HMODULE) 0,
                        ID_FilterDialog,
                        &(fdata[2]) );
                  WinInvalidateRect (hwnd,NULL,FALSE);
                  return (MRESULT) FALSE;

              case IDM_Bearbeiten_Filter4:	  // Filtereinstellg. bearbeiten
              case IDB_Filter4:
                  WinDlgBox (HWND_DESKTOP,
                        hwnd,
                        BearbDlgProc,
                        (HMODULE) 0,
                        ID_FilterDialog,
                        &(fdata[3]) );
                  WinInvalidateRect (hwnd,NULL,FALSE);
                  return (MRESULT) FALSE;

              case IDM_Help_About:			  // About Dlg ”ffnen
              case IDB_Info:
                  WinDlgBox (HWND_DESKTOP,
                        hwnd,
                        AboutDlgProc,
                        (HMODULE) 0,
                        ID_About,
                        NULL);
                  return (MRESULT) FALSE;
            }

       case WM_PRESPARAMCHANGED:              // Anwender „ndert Schriftart
            WinInvalidateRect (hwnd,NULL,FALSE);
            return (MRESULT) FALSE;

       case WM_CLOSE:                         // Programm beednen
            WinPostMsg (hwnd,WM_QUIT,(MPARAM)0,(MPARAM)0);
            return (MRESULT) FALSE;

       default:                               // Default-WindowProc
         return WinDefWindowProc (hwnd,msg,mp1,mp2);
      }

return (MRESULT)FALSE;
}

// ************************************************************************
// BearbDlgProc
// Bemerkung: Filter Bearbeiten... Notizbuch Dialog
// ************************************************************************

MRESULT EXPENTRY BearbDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
   static FDATA  tempdata;
          PVOID  data;
          PFDATA pfdata;

   static HWND hwndNB;

          PSZ    szTitle;
          ULONG  ZeileSpalte;
          SHORT  Zeile, Spalte, Ueberlagerung;

          HWND   hwndText;
          CHAR   szAmplitude[15];
          CHAR   szGrenz[15];
          CHAR   szUFrequenz[15];
          CHAR   szOFrequenz[15];
          CHAR   *endptr;

          BOOL   cvError;

  switch (msg)
  {
    case WM_INITDLG:                                // Dialoginitialisierung
    {
      INT  i;

      data      = (PVOID) mp2;
      pfdata    = (PFDATA) data;
      tempdata  = (*pfdata);

      switch (tempdata.Nummer)                      // Titel anpassen
      {
        case 1: szTitle = "Filter Nr.1 bearbeiten"; break;
        case 2: szTitle = "Filter Nr.2 bearbeiten"; break;
        case 3: szTitle = "Filter Nr.3 bearbeiten"; break;
        case 4: szTitle = "Filter Nr.4 bearbeiten"; break;
      }
      WinSetWindowText(hwnd, szTitle);


      hwndNB = WinWindowFromID (hwnd, ID_FilterDialog_Book);

      WinSendMsg( hwndNB, BKM_SETNOTEBOOKCOLORS,    // Hintergrundfarbe
          MPFROMLONG( SYSCLR_FIELDBACKGROUND ),
          MPFROMSHORT( BKA_BACKGROUNDPAGECOLORINDEX ));

      SetTabDimensions( hwndNB );                   // Tab-GrӇe anpassen

      for( i = 0; i < PAGE_COUNT ; i++ )            // Seiten einfgen
          SetUpPage( hwndNB, hwnd, (PVOID) &tempdata, i );

      return (MRESULT)FALSE;
    }

    case WM_COMMAND:                          // Befehl in mp1 ausfhren
      switch (SHORT1FROMMP (mp1))
      {
        case ID_FilterDialog_Ok:
          // Daten vom Typ-Dlg abfragen

          // GrundTyp-Button
          tempdata.Typ =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_GrundBtn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
             ? fltGrundTyp : fltUeberlag;

          // Typ-Valueset abfragen
          ZeileSpalte = (ULONG)
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_TypSet,
                       VM_QUERYSELECTEDITEM,
                       NULLHANDLE,
                       NULL);
          tempdata.Grundtyp = (USHORT) SHORT2FROMMR(ZeileSpalte);
          if (
               (tempdata.Grundtyp == 0     ) ||
               (tempdata.Grundtyp == fltBP ) ||
               (tempdata.Grundtyp == fltBS )
             )
          {
            cvError = TRUE;
            WinSendMsg( hwndNB,
                        BKM_TURNTOPAGE,
                        (MPARAM) nbpage[0].pageId,
                        NULL);
            WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP,
                           "Bandpass und Bandsperre werden in dieser "
                           "Programmversion noch nicht untersttzt.",
                           "Hinweis", 1, MB_OK | MB_MOVEABLE | MB_ERROR );
          }


          // šberlagerungs-Checkboxes
          tempdata.MulMitFlt1 =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_Ueberlag1Btn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

          tempdata.MulMitFlt2 =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_Ueberlag2Btn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

          tempdata.MulMitFlt3 =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_Ueberlag3Btn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

          tempdata.MulMitFlt4 =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_Ueberlag4Btn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

          // Aktiv-Checkbox
          tempdata.Aktiv =
               WinSendDlgItemMsg((HWND)nbpage[0].hwndDlg,
                       ID_AktivBtn,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
            ? (BOOL) TRUE : (BOOL) FALSE;


          // Charakter-Buttons
          tempdata.Charakter =
               WinSendDlgItemMsg((HWND)nbpage[1].hwndDlg,
                       ID_Bessel,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
            ? fltBessel : tempdata.Charakter;

          tempdata.Charakter =
               WinSendDlgItemMsg((HWND)nbpage[1].hwndDlg,
                       ID_Butter,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
            ? fltButter : tempdata.Charakter;

          tempdata.Charakter =
               WinSendDlgItemMsg((HWND)nbpage[1].hwndDlg,
                       ID_Tscheb05,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
            ? fltTscheb05 : tempdata.Charakter;

          tempdata.Charakter =
               WinSendDlgItemMsg((HWND)nbpage[1].hwndDlg,
                       ID_Tscheb3,
                       BM_QUERYCHECK,
                       NULLHANDLE,
                       NULL)
            ? fltTscheb3 : tempdata.Charakter;


          // Ordnung-Spinbutton
          WinSendDlgItemMsg((HWND)nbpage[1].hwndDlg,
                       ID_Ordnung,
                       SPBM_QUERYVALUE,
                       (MPARAM) &(tempdata.Ordnung),
                       MPFROM2SHORT (0, SPBQ_ALWAYSUPDATE));


          // Paramter Eingabezeilen

          hwndText = WinWindowFromID ((HWND)nbpage[2].hwndDlg, ID_Amplitude);
          WinQueryWindowText(hwndText, sizeof(szAmplitude), (PSZ)szAmplitude);

          hwndText = WinWindowFromID ((HWND)nbpage[2].hwndDlg, ID_Grenz);
          WinQueryWindowText(hwndText, sizeof(szGrenz),  (PSZ)szGrenz);

          hwndText = WinWindowFromID ((HWND)nbpage[2].hwndDlg, ID_UFrequenz);
          WinQueryWindowText(hwndText, sizeof(szUFrequenz), (PSZ)szUFrequenz);

          hwndText = WinWindowFromID ((HWND)nbpage[2].hwndDlg, ID_OFrequenz);
          WinQueryWindowText(hwndText, sizeof(szOFrequenz), (PSZ)szOFrequenz);

          cvError = FALSE;

          // Strings wandeln, bei Fehler Notebook Seite in den Vordergrund
          // holen, und Eingabezeile markieren.

          tempdata.Verstaerkung = strtol(&szAmplitude, &endptr, 10);
          if (
              (tempdata.Verstaerkung == 0) &&
              (PSZ)endptr == (PSZ)szAmplitude ||
              ((tempdata.Verstaerkung < -100) ||
               (tempdata.Verstaerkung > 100))
             )
          {
            cvError = TRUE;
            WinSendMsg( hwndNB,
                        BKM_TURNTOPAGE,
                        (MPARAM) nbpage[2].pageId,
                        NULL);
            hwndText = WinWindowFromID ((HWND)nbpage[2].hwndDlg, ID_Amplitude);
            WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP,
                           "Ungltige Eingabe im Feld 'Verst„rkung A'. "
                           "Es sind nur ganze Zahlen zwischen -30 und +30 "
                           "gltig.",
                           "Fehler", 1, MB_OK | MB_MOVEABLE | MB_ERROR );
          }

          tempdata.Grenz = strtol(&szGrenz, &endptr, 10);
          if (
              (tempdata.Grenz == 0) &&
              (PSZ)endptr == (PSZ)szGrenz ||
              ((tempdata.Grenz < 0)       ||
               (tempdata.Grenz > 100000000 ))
             )
          {
            cvError = TRUE;
            WinSendMsg( hwndNB,
                        BKM_TURNTOPAGE,
                        (MPARAM) nbpage[2].pageId,
                        NULL);
            WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP,
                           "Ungltige Eingabe im Feld 'Grenzfrequenz fg'. "
                           "Es sind nur ganze Zahlen zwischen 0 und "
                           "100000000 (100MHz) gltig.",
                           "Fehler", 1, MB_OK | MB_MOVEABLE | MB_ERROR );
          }

          tempdata.FUnten = strtol(&szUFrequenz, &endptr, 10);
          if (
              (tempdata.FUnten == 0) &&
              (PSZ)endptr == (PSZ)szUFrequenz ||
              ((tempdata.FUnten < 0)          ||
               (tempdata.FUnten > 100000000 ))
             )
          {
            cvError = TRUE;
            WinSendMsg( hwndNB,
                        BKM_TURNTOPAGE,
                        (MPARAM) nbpage[2].pageId,
                        NULL);
            WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP,
                           "Ungltige Eingabe im Feld 'untere Eckfrequenz fu'. "
                           "Es sind nur ganze Zahlen zwischen 0 und "
                           "100000000 (100MHz) gltig.",
                           "Fehler", 1, MB_OK | MB_MOVEABLE | MB_ERROR );
          }

          tempdata.FOben = strtol(&szOFrequenz, &endptr, 10);
          if (
              (tempdata.FOben == 0) &&
              (PSZ)endptr == (PSZ)szOFrequenz ||
              ((tempdata.FOben < 0)           ||
               (tempdata.FOben > 100000000 ))
             )
          {
            cvError = TRUE;
            WinSendMsg( hwndNB,
                        BKM_TURNTOPAGE,
                        (MPARAM) nbpage[2].pageId,
                        NULL);
            WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP,
                           "Ungltige Eingabe im Feld 'obere Eckfrequenz fo'. "
                           "Es sind nur ganze Zahlen zwischen 0 und "
                           "100000000 (100MHz) gltig.",
                           "Fehler", 1, MB_OK | MB_MOVEABLE | MB_ERROR );
          }

          // Linienfarbe Valueset abfragen
          ZeileSpalte = (ULONG)
               WinSendDlgItemMsg((HWND)nbpage[3].hwndDlg,
                       ID_LinienFarbe,
                       VM_QUERYSELECTEDITEM,
                       NULLHANDLE,
                       NULL);

          switch ( SHORT1FROMMR(ZeileSpalte) )
          {
            case 1:
              switch ( SHORT2FROMMR(ZeileSpalte) )
              {
                case 1: tempdata.LinienFarbe = CLR_PALEGRAY ; break;
                case 2: tempdata.LinienFarbe = CLR_BLUE     ; break;
                case 3: tempdata.LinienFarbe = CLR_GREEN    ; break;
                case 4: tempdata.LinienFarbe = CLR_CYAN     ; break;
              }
              break;

            case 2:
              switch ( SHORT2FROMMR(ZeileSpalte) )
              {
                case 1: tempdata.LinienFarbe = CLR_RED      ; break;
                case 2: tempdata.LinienFarbe = CLR_PINK     ; break;
                case 3: tempdata.LinienFarbe = CLR_YELLOW   ; break;
                case 4: tempdata.LinienFarbe = CLR_WHITE    ; break;
              }
              break;
          }

          // Linienart Valueset abfragen
          ZeileSpalte = (ULONG)
               WinSendDlgItemMsg((HWND)nbpage[3].hwndDlg,
                       ID_LinienArt,
                       VM_QUERYSELECTEDITEM,
                       NULLHANDLE,
                       NULL);

          switch ( SHORT2FROMMR(ZeileSpalte) )
          {
            case 1: tempdata.LinienArt = LINETYPE_DEFAULT  ; break;
            case 2: tempdata.LinienArt = LINETYPE_LONGDASH ; break;
            case 3: tempdata.LinienArt = LINETYPE_DASHDOT  ; break;
            case 4: tempdata.LinienArt = LINETYPE_DOT      ; break;
          }

          if ( cvError == FALSE )
          {
            // tempor„re Filterdaten in globales Filterarray bernehmen
            fdata[(tempdata.Nummer)-1] = tempdata;

            WinDismissDlg (hwnd, ID_FilterDialog_Ok);
          }

          break;

        case ID_FilterDialog_Abbruch:
          WinDismissDlg (hwnd, ID_FilterDialog_Abbruch);
          break;
      }

      break;

    default:                                  // Default-DialogProc
      return WinDefDlgProc(hwnd, msg, mp1, mp2);
      break;
  }
  return (MRESULT)FALSE;
}

// ************************************************************************
// TypDlgProc
// Bemerkung: Filter Bearbeiten... Notizbuch-Seite "Typeneinstellungen"
// ************************************************************************

MRESULT EXPENTRY TypDlgProc(HWND hwndDlg, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
         HWND      hwndValueSet;
         HBITMAP   hbm;
         HPS       hps;

         BOOL      UeberlagState;

         PVOID     data;
  static PFDATA    pfdata;


  switch (msg)
  {
    case WM_INITDLG:                          // Dialoginitialisierung
         data      = (PVOID) mp2;
         pfdata    = (PFDATA) data;

         hps          = WinGetPS (hwndDlg);
         hwndValueSet = WinWindowFromID (hwndDlg, ID_TypSet);

         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_TP, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,1),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_HP, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,2),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_BP, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,3),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_BS, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,4),
                         (MPARAM) hbm);

         // BP & BS noch nicht aktiviert in diser Version!!!
         WinSendMsg (hwndValueSet,
                         VM_SETITEMATTR,
                         MPFROM2SHORT (1,3),
                         MPFROM2SHORT (VIA_DISABLED, TRUE));
         WinSendMsg (hwndValueSet,
                         VM_SETITEMATTR,
                         MPFROM2SHORT (1,4),
                         MPFROM2SHORT (VIA_DISABLED, TRUE));

         if ((*pfdata).Typ == fltGrundTyp)         // Typ Schalter
             WinSendDlgItemMsg(hwndDlg, ID_GrundBtn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);
         else
             WinSendDlgItemMsg(hwndDlg, ID_UeberlagBtn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);

         switch ( (*pfdata).Grundtyp )             // Grundtyp ValueSet
         {
           case fltTP:
                WinSendDlgItemMsg(hwndDlg, ID_TypSet,
                         VM_SELECTITEM,
                         MPFROM2SHORT (1,1),
                         NULL);
                break;

           case fltHP:
                WinSendDlgItemMsg(hwndDlg, ID_TypSet,
                         VM_SELECTITEM,
                         MPFROM2SHORT (1,2),
                         NULL);
                break;

           case fltBP:
                WinSendDlgItemMsg(hwndDlg, ID_TypSet,
                         VM_SELECTITEM,
                         MPFROM2SHORT (1,3),
                         NULL);
                break;

           case fltBS:
                WinSendDlgItemMsg(hwndDlg, ID_TypSet,
                         VM_SELECTITEM,
                         MPFROM2SHORT (1,4),
                         NULL);
                break;
         }

         if ( (*pfdata).Aktiv == TRUE )
                WinSendDlgItemMsg(hwndDlg, ID_AktivBtn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);
                                                   // šberlagert mit Flt.1
         if ( (*pfdata).MulMitFlt1 == TRUE )
                WinSendDlgItemMsg(hwndDlg, ID_Ueberlag1Btn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);
                                                   // šberlagert mit Flt.2
         if ( (*pfdata).MulMitFlt2 == TRUE )
                WinSendDlgItemMsg(hwndDlg, ID_Ueberlag2Btn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);
                                                   // šberlagert mit Flt.3
         if ( (*pfdata).MulMitFlt3 == TRUE )
                WinSendDlgItemMsg(hwndDlg, ID_Ueberlag3Btn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);
                                                   // šberlagert mit Flt.4
         if ( (*pfdata).MulMitFlt4 == TRUE )
                WinSendDlgItemMsg(hwndDlg, ID_Ueberlag4Btn,
                         BM_CLICK,
                         MPFROMSHORT (0),
                         NULL);

         WinReleasePS (hps);
         break;

    case WM_CONTROL:
         switch (SHORT2FROMMP (mp1))
         {
            case BN_CLICKED:                       // Button-Nachricht

                 UeberlagState =
                      WinSendDlgItemMsg(hwndDlg,
                               ID_UeberlagBtn,
                               BM_QUERYCHECK,
                               NULLHANDLE,
                               NULL)
                   ? (BOOL) TRUE : (BOOL) FALSE;

                 // Controls in Typ-Dlg enable/disable
                 WinEnableControl(hwndDlg, ID_Ueberlag1Btn, UeberlagState);
                 WinEnableControl(hwndDlg, ID_Ueberlag2Btn, UeberlagState);
                 WinEnableControl(hwndDlg, ID_Ueberlag3Btn, UeberlagState);
                 WinEnableControl(hwndDlg, ID_Ueberlag4Btn, UeberlagState);

                 WinEnableControl(hwndDlg, ID_TypSet, !UeberlagState);

                 WinEnableControl(hwndDlg,
                             ID_Ueberlag1Btn-1+((*pfdata).Nummer),
                             FALSE);

                 // Controls in Charakter-Dlg enable/disable
                 WinEnableControl(nbpage[1].hwndDlg,
                                  ID_Bessel, !UeberlagState);
                 WinEnableControl(nbpage[1].hwndDlg,
                                  ID_Butter, !UeberlagState);
                 WinEnableControl(nbpage[1].hwndDlg,
                                  ID_Tscheb05, !UeberlagState);
                 WinEnableControl(nbpage[1].hwndDlg,
                                  ID_Tscheb3, !UeberlagState);
                 WinEnableControl(nbpage[1].hwndDlg,
                                  ID_Ordnung, !UeberlagState);

                 // Controls in Parameter-Dlg enable/disable
                 WinEnableControl(nbpage[2].hwndDlg,
                                  ID_Amplitude, !UeberlagState);
                 WinEnableControl(nbpage[2].hwndDlg,
                                  ID_Grenz, !UeberlagState);
                 break;
         }
         break;

    default: return WinDefDlgProc(hwndDlg,msg,mp1,mp2);
  }
  return (MRESULT) TRUE;
}

// ************************************************************************
// CharDlgProc
// Bemerkung: Filter Bearbeiten... Notizbuch-Seite "Charakteristik"
// ************************************************************************

MRESULT EXPENTRY CharDlgProc(HWND hwndDlg, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
         BOOL   UeberlagState;
         HWND   hwndText;

                  PSZ    pszFont   = "8.Helv";
         ULONG  ulColor;

         PVOID  data;
  static PFDATA pfdata;

  switch ( msg )
  {
    case WM_INITDLG:                          // Dialoginitialisierung
         data      = (PVOID) mp2;
         pfdata    = (PFDATA) data;

         ulColor   = CLR_BLACK;

         hwndText = WinWindowFromID (hwndDlg, ID_Ordnung_Txt);
         WinSetPresParam(hwndText,
                    PP_FOREGROUNDCOLORINDEX,
                    (ULONG)sizeof(LONG),
                    (PVOID)&ulColor );
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont) + 1,
                    (PVOID)pszFont );

         switch ((*pfdata).Charakter)
         {
           case fltBessel:
                WinSendDlgItemMsg(hwndDlg,
                        ID_Bessel,
                        BM_CLICK,
                        MPFROMSHORT (0),
                        NULL);
                break;

           case fltButter:
                WinSendDlgItemMsg(hwndDlg,
                        ID_Butter,
                        BM_CLICK,
                        MPFROMSHORT (0),
                        NULL);
                break;

           case fltTscheb05:
                WinSendDlgItemMsg(</