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(hwndDlg,
                        ID_Tscheb05,
                        BM_CLICK,
                        MPFROMSHORT (0),
                        NULL);
                break;

           case fltTscheb3:
                WinSendDlgItemMsg(hwndDlg,
                        ID_Tscheb3,
                        BM_CLICK,
                        MPFROMSHORT (0),
                        NULL);
                break;
         }

         WinSendDlgItemMsg(hwndDlg,
                        ID_Ordnung,
                        SPBM_SETLIMITS,
                        MPFROMSHORT (10),
                        (PVOID) MPFROMSHORT ( 1) );

         WinSendDlgItemMsg(hwndDlg,
                        ID_Ordnung,
                        SPBM_SPINUP,
                        MPFROMSHORT ((*pfdata).Ordnung-1),
                        NULL);

         UeberlagState =
             WinSendDlgItemMsg(nbpage[0].hwndDlg,
                        ID_UeberlagBtn,
                        BM_QUERYCHECK,
                        NULLHANDLE,
                        NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

         WinEnableControl(hwndDlg, ID_Bessel,   !UeberlagState);
         WinEnableControl(hwndDlg, ID_Butter,   !UeberlagState);
         WinEnableControl(hwndDlg, ID_Tscheb05, !UeberlagState);
         WinEnableControl(hwndDlg, ID_Tscheb3,  !UeberlagState);
         WinEnableControl(hwndDlg, ID_Ordnung,  !UeberlagState);

         break;

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

// ************************************************************************
// ParamDlgProc
// Bemerkung: Filter Bearbeiten... Notizbuch-Seite "Filter-Parameter"
// ************************************************************************

MRESULT EXPENTRY ParamDlgProc(HWND hwndDlg, ULONG msg, MPARAM mp1, MPARAM mp2 )
{
         BOOL   UeberlagState;
         HWND   hwndText;
         PSZ    pszFont   = "8.Helv";
         ULONG  ulColor;

         PVOID  data;
  static PFDATA pfdata;

         PSZ    pszFormat = "%d";
         CHAR   szAmplitude[15];
         CHAR   szGrenz[15];
         CHAR   szUFrequenz[15];
         CHAR   szOFrequenz[15];

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

         ulColor   = CLR_BLACK;

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

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

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

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

         UeberlagState =
             WinSendDlgItemMsg(nbpage[0].hwndDlg,
                        ID_UeberlagBtn,
                        BM_QUERYCHECK,
                        NULLHANDLE,
                        NULL)
             ? (BOOL) TRUE : (BOOL) FALSE;

         WinEnableControl(hwndDlg, ID_Amplitude, !UeberlagState);
         WinEnableControl(hwndDlg, ID_Grenz, !UeberlagState);
         WinEnableControl(hwndDlg, ID_UFrequenz, FALSE); // noch nicht aktiv
         WinEnableControl(hwndDlg, ID_OFrequenz, FALSE); // noch nicht aktiv

         // maximale L„nge des Eingabestrings festlegen
         WinSendDlgItemMsg(hwndDlg, ID_Amplitude,
                    EM_SETTEXTLIMIT, MPFROMSHORT (4), NULL);
         WinSendDlgItemMsg(hwndDlg, ID_Grenz,
                    EM_SETTEXTLIMIT, MPFROMSHORT (10), NULL);
         WinSendDlgItemMsg(hwndDlg, ID_UFrequenz,
                    EM_SETTEXTLIMIT, MPFROMSHORT (10), NULL);
         WinSendDlgItemMsg(hwndDlg, ID_OFrequenz,
                    EM_SETTEXTLIMIT, MPFROMSHORT (10), NULL);

         // Zahlenwerte in Strings umwandeln
         vsprintf( szAmplitude, pszFormat, &((*pfdata).Verstaerkung ) );
         vsprintf( szGrenz,     pszFormat, &((*pfdata).Grenz    ) );
         vsprintf( szUFrequenz, pszFormat, &((*pfdata).FUnten ) );
         vsprintf( szOFrequenz, pszFormat, &((*pfdata).FOben ) );

         // einfgen der Vorgabe in die Eingabefelder

         hwndText = WinWindowFromID (hwndDlg, ID_Amplitude);
         WinSetWindowText(hwndText, (PSZ)szAmplitude);

         hwndText = WinWindowFromID (hwndDlg, ID_Grenz);
         WinSetWindowText(hwndText, (PSZ)szGrenz);

         hwndText = WinWindowFromID (hwndDlg, ID_UFrequenz);
         WinSetWindowText(hwndText, (PSZ)szUFrequenz);

         hwndText = WinWindowFromID (hwndDlg, ID_OFrequenz);
         WinSetWindowText(hwndText, (PSZ)szOFrequenz);

         break;

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

// ************************************************************************
// DarstDlgProc
// Bemerkung: Filter Bearbeiten... Notizbuch-Seite "Darstellung"
// ************************************************************************

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

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

         MPARAM    ZeileSpalte;

         PVOID     data;
  static PFDATA    pfdata;

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

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

         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_PALEGRAY, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,1),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_BLUE, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,2),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_GREEN, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,3),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_CYAN, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,4),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_RED, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (2,1),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_PINK, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (2,2),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_YELLOW, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (2,3),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_WHITE, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (2,4),
                         (MPARAM) hbm);

         switch ( (*pfdata).LinienFarbe )
         {
           case CLR_PALEGRAY: ZeileSpalte = MPFROM2SHORT (1,1); break;
           case CLR_BLUE    : ZeileSpalte = MPFROM2SHORT (1,2); break;
           case CLR_GREEN   : ZeileSpalte = MPFROM2SHORT (1,3); break;
           case CLR_CYAN    : ZeileSpalte = MPFROM2SHORT (1,4); break;
           case CLR_RED     : ZeileSpalte = MPFROM2SHORT (2,1); break;
           case CLR_PINK    : ZeileSpalte = MPFROM2SHORT (2,2); break;
           case CLR_YELLOW  : ZeileSpalte = MPFROM2SHORT (2,3); break;
           case CLR_WHITE   : ZeileSpalte = MPFROM2SHORT (2,4); break;
         }

         WinSendMsg(hwndValueSet,
                         VM_SELECTITEM,
                         ZeileSpalte,
                         NULL);


         hwndValueSet = WinWindowFromID (hwndDlg, ID_LinienArt);

         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_DASH, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,1),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_LONGDASH, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,2),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_DASHDOT, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,3),
                         (MPARAM) hbm);
         hbm = (HBITMAP) GpiLoadBitmap (hps, NULLHANDLE, IDB_DOT, 32L, 32L);
         WinSendMsg (hwndValueSet,
                         VM_SETITEM,
                         MPFROM2SHORT (1,4),
                         (MPARAM) hbm);

         switch ( (*pfdata).LinienArt )
         {
           case LINETYPE_DEFAULT : ZeileSpalte = MPFROM2SHORT (1,1); break;
           case LINETYPE_LONGDASH: ZeileSpalte = MPFROM2SHORT (1,2); break;
           case LINETYPE_DASHDOT : ZeileSpalte = MPFROM2SHORT (1,3); break;
           case LINETYPE_DOT     : ZeileSpalte = MPFROM2SHORT (1,4); break;
         }

         WinSendMsg(hwndValueSet,
                         VM_SELECTITEM,
                         ZeileSpalte,
                         NULL);

         ulColor = CLR_BLACK;

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

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

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

         WinReleasePS (hps);
         break;

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

// ************************************************************************
// AboutDlgProc
// Bemerkung: šber PMFilter...  Dialog
// ************************************************************************

MRESULT EXPENTRY AboutDlgProc (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
{
     HWND    hwndText;
     ULONG   ulColor;
     PSZ     pszFont1 = "8.Helv";
     PSZ     pszFont2 = "10.Helv";

  switch (msg)
  {
    case WM_INITDLG:                          // Dialoginitialisierung

         hwndText = WinWindowFromID (hwnd, ID_About_C1);
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont2) + 1,
                    (PVOID)pszFont2 );

         hwndText = WinWindowFromID (hwnd, ID_About_C2);
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont2) + 1,
                    (PVOID)pszFont2 );

         hwndText = WinWindowFromID (hwnd, ID_About_C3);
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont2) + 1,
                    (PVOID)pszFont2 );

         ulColor  = CLR_DARKRED;

         hwndText = WinWindowFromID (hwnd, ID_About_Text);
         WinSetPresParam(hwndText,
                    PP_FOREGROUNDCOLORINDEX,
                    (ULONG)sizeof(LONG),
                    (PVOID)&ulColor );
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont2) + 1,
                    (PVOID)pszFont2 );

         ulColor  = CLR_DARKGRAY;

         hwndText = WinWindowFromID (hwnd, ID_About_Disclaimer1);
         WinSetPresParam(hwndText,
                    PP_FOREGROUNDCOLORINDEX,
                    (ULONG)sizeof(LONG),
                    (PVOID)&ulColor );
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont1) + 1,
                    (PVOID)pszFont1 );

         hwndText = WinWindowFromID (hwnd, ID_About_Disclaimer2);
         WinSetPresParam(hwndText,
                    PP_FOREGROUNDCOLORINDEX,
                    (ULONG)sizeof(LONG),
                    (PVOID)&ulColor );
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont1) + 1,
                    (PVOID)pszFont1 );

         hwndText = WinWindowFromID (hwnd, ID_About_Disclaimer3);
         WinSetPresParam(hwndText,
                    PP_FOREGROUNDCOLORINDEX,
                    (ULONG)sizeof(LONG),
                    (PVOID)&ulColor );
         WinSetPresParam(hwndText, PP_FONTNAMESIZE,
                    (ULONG)strlen(pszFont1) + 1,
                    (PVOID)pszFont1 );
      break;

    case WM_COMMAND:                          // Befehl in mp1 ausfhren
      switch (SHORT1FROMMP (mp1))
      {
        case ID_About_Ok:
          WinDismissDlg (hwnd, ID_About_Ok);
          break;
      }

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

// ************************************************************************
// FilterLaden
// Bemerkung: Filter Laden Dialog
// ************************************************************************

VOID FilterLaden ( HWND hwnd )
{
   FILEDLG fileDialog;
   PSZ     pszTitle       = "PMFilter  -  ";
   CHAR    szWildCard[10] = "*.flt";
   CHAR    szTitle[MAXNAMEL];
   ULONG   Action;
   ULONG   Laenge;

   HWND    hwndFrame;
   HFILE   hfile;

   memset(&fileDialog, 0, sizeof(fileDialog));

   fileDialog.cbSize      = sizeof(FILEDLG);
   fileDialog.pszTitle    = "Filter laden";
   fileDialog.pszOKButton = "~Laden";
   fileDialog.fl          = FDS_CENTER | FDS_OPEN_DIALOG;

   if ( strlen(FilterName) == 0 )
     strcpy(fileDialog.szFullFile, szWildCard);
   else
     strcpy(fileDialog.szFullFile, FilterName);

   hwndFrame = WinQueryWindow (hwnd, QW_PARENT);

   WinFileDlg(HWND_DESKTOP, hwndFrame, (PFILEDLG)&fileDialog);

   if (fileDialog.lReturn == ID_OK)
   {
     if ( DosOpen ( fileDialog.szFullFile,
                    &hfile, &Action,
                    0, 0L,
                    OPEN_ACTION_OPEN_IF_EXISTS,
                    OPEN_SHARE_DENYWRITE,
                    0L )  == 0 )
     {
       if ( DosRead( hfile,
                     (PVOID) fdata,
                     sizeof(fdata),
                     &Laenge) == 0)
       {
         DosClose(hfile);

         memset(&szTitle,    0, sizeof(szTitle));
         memset(&FilterName, 0, sizeof(FilterName));

         strcpy(FilterName, fileDialog.szFullFile);
         strcpy(szTitle, pszTitle);
         strcat(szTitle, FilterName);

         WinSetWindowText(hwndClientFrame, szTitle);
       }
       else
         WinMessageBox(HWND_DESKTOP, hwnd,
             "Fehler beim Laden einer Filterdatei.",
             "Fehler",
             0,
             MB_OK | MB_ERROR | MB_MOVEABLE );
     }
     else
       WinMessageBox(HWND_DESKTOP, hwnd,
             "Fehler beim Laden einer Filterdatei.",
             "Fehler",
             0,
             MB_OK | MB_ERROR | MB_MOVEABLE );
   }
}

// ************************************************************************
// FilterSpeichern
// Bemerkung: Filter Speichern Dialog
// ************************************************************************

VOID FilterSpeichern ( HWND hwnd )
{
   FILEDLG fileDialog;
   PSZ     pszTitle       = "PMFilter  -  ";
   CHAR    szWildCard[10] = "*.flt";
   CHAR    szTitle[MAXNAMEL];

   ULONG   Action;
   ULONG   Laenge;

   HWND    hwndFrame;
   HFILE   hfile;

   memset(&fileDialog, 0, sizeof(fileDialog));

   fileDialog.cbSize      = sizeof(FILEDLG);
   fileDialog.pszTitle    = "Filter speichern";
   fileDialog.pszOKButton = "~Speichern";
   fileDialog.fl          = FDS_CENTER | FDS_SAVEAS_DIALOG | FDS_ENABLEFILELB;

   if ( strlen(FilterName) == 0 )
     strcpy(fileDialog.szFullFile, szWildCard);
   else
     strcpy(fileDialog.szFullFile, FilterName);

   hwndFrame = WinQueryWindow (hwnd, QW_PARENT);

   WinFileDlg(HWND_DESKTOP, hwndFrame, (PFILEDLG)&fileDialog);

   if (fileDialog.lReturn == ID_OK)
   {
     if ( DosOpen ( fileDialog.szFullFile,
                    &hfile, &Action,
                    sizeof(fdata), FILE_NORMAL,
                    OPEN_ACTION_CREATE_IF_NEW |
                    OPEN_ACTION_REPLACE_IF_EXISTS,
                    OPEN_SHARE_DENYREADWRITE |
                    OPEN_ACCESS_WRITEONLY,
                    0L )  == 0 )
     {
       if ( DosWrite( hfile,
                      (PVOID) fdata,
                      sizeof(fdata),
                      &Laenge) == 0)
       {
         DosClose(hfile);

         memset(&szTitle,    0, sizeof(szTitle));
         memset(&FilterName, 0, sizeof(FilterName));

         strcpy(FilterName, fileDialog.szFullFile);
         strcpy(szTitle, pszTitle);
         strcat(szTitle, FilterName);

         WinSetWindowText(hwndClientFrame, szTitle);
       }
       else
         WinMessageBox(HWND_DESKTOP, hwnd,
             "Fehler beim Schreiben einer Filterdatei.",
             "Fehler",
             0,
             MB_OK | MB_ERROR | MB_MOVEABLE );
     }
     else
       WinMessageBox(HWND_DESKTOP, hwnd,
             "Fehler beim Schreiben einer Filterdatei.",
             "Fehler",
             0,
             MB_OK | MB_ERROR | MB_MOVEABLE );
   }
}


// ************************************************************************
// Funktionen die in den einzelnen Fensterprozeduren verwendet werden
// ************************************************************************

// ************************************************************************
// SetUpToolBar
// Bemerkung: verwendet von ClientWndProc
//            fgt Schalterleiste neu ein, oder paát die Gr”áe an
// ************************************************************************

static VOID SetUpToolBar     ( HWND hwnd, HPS hps, USHORT cx, USHORT cy)
{
           POINTL     ptl;
           INT        i;
   static  USHORT     cyButton = 0;
   static  BOOL       blFirst = TRUE;
   
   if ( (cyButton == 0) ||
       ((cyButton != 0) && (cyButton != cy-44)) )
   { 
     GpiSetColor     ( hps, CLR_PALEGRAY);
     ptl.x = 0;
     ptl.y = cy-46;
     GpiMove (hps, &ptl);
     ptl.x = cx;
     ptl.y = cy;
     GpiBox (hps, DRO_FILL, &ptl, 0, 0);
   }  

   if (blFirst == TRUE)           // Schalterleiste erstmalig darstellen                   
   {
     blFirst = FALSE;
     cyButton = cy-44;

     for ( i = 0; i < (BUTTON_COUNT) ; i++ )
       bdata[i].hwnd = WinCreateWindow( hwnd,
                         WC_BUTTON,
                         (PSZ)bdata[i].idIcon,
                         WS_VISIBLE | BS_ICON,
                         (2+(i * 45)), cyButton, 42, 42,
                         hwnd,
                         HWND_TOP,
                         bdata[i].idButton,
                         NULL, NULL);
   } else
   {							  // Schalterleiste anpassen
     cyButton = cy-44;
     for ( i = 0; i < (BUTTON_COUNT) ; i++ )
       WinSetWindowPos ( bdata[i].hwnd,        // einzelne Buttons
                         0L,
                         (2+(i * 45)), cyButton,
                         (2+(i * 45)) + 42, cyButton + 42,
                         SWP_MOVE | SWP_SHOW);
   }
}   

// ************************************************************************
// ClearBackGround
// Bemerkung: verwendet von ClientWndProc
//            l”scht den Hintergrund des ClientWindows
// ************************************************************************

static VOID ClearBackGround  (HPS hps, USHORT cx, USHORT cy, BOOL monitor)
{
           POINTL     ptl;

   if (monitor == TRUE)                // normale Ausgabe
     { GpiSetColor(hps, CLR_BLACK); }
   else
     { GpiSetColor(hps, CLR_WHITE); }  // Ausgabe fr Export in Clipboard
     
   ptl.x = 0;
   ptl.y = 0;
   GpiMove (hps, &ptl);
   ptl.x = cx;
   ptl.y = cy-46;
   GpiBox (hps, DRO_FILL, &ptl, 0, 0);
}

// ************************************************************************
// DrawBode
// Bemerkung: verwendet von ClientWndProc
//            zeichnet Koordinatenkreuz und Achsenbeschriftung
// ************************************************************************
    
static VOID DrawBode         ( HPS hps, USHORT cx, USHORT cy, BOOL monitor)
{
           POINTL     ptl;
           int        i;

   if (monitor == TRUE)                // normale Ausgabe
     { GpiSetColor(hps, CLR_DARKGREEN); }
   else
     { GpiSetColor(hps, CLR_BLACK); }  // Ausgabe fr Export in Clipboard
     
   GpiSetLineType(hps, LINETYPE_ALTERNATE);  // nur jeder zweite Punkt
   
   for ( i = 0; i < 9 ; i++ )              	 // y-Achsen
   {
     ptl.y = 80+(i*(cy-80-60)/8);
     ptl.x = 50;
     GpiMove(hps, &ptl);
     ptl.x = cx-20;
     GpiLine(hps, &ptl);
   }
   
   for ( i = 0; i < 9 ; i++ )				 // x-Achsen
   {
     ptl.x = 50+(i*(cx-50-20)/8);
     ptl.y = 80;
     GpiMove(hps, &ptl);
     ptl.y = cy-60;
     GpiLine(hps, &ptl);
   }  
   
   for ( i = 0 ; i < 9 ; i++)               // y-Beschriftung
   {
     ptl.y = 75+(i*(cy-75-65)/8);
     ptl.x = 20;
     GpiCharStringAt(hps, &ptl, 4, yAxis[i].Name);
   }
   
   for ( i = 0 ; i < 9 ; i++ )            	// x-Beschriftung
   {
     ptl.x = 34+(i*(cx-34-36)/8);
     ptl.y = 62;
     GpiCharStringAt(hps, &ptl, 4, xAxis[i].Name);
   }
   
   ptl.x = 7;
   ptl.y = cy-78;
   GpiCharStringAt(hps, &ptl, 4, "A/dB");

   ptl.y = 50;
   ptl.x = cx-60;
   GpiCharStringAt(hps, &ptl, 4, "f/Hz");
}

// ************************************************************************
// DrawParameters
// Bemerkung: verwendet von ClientWndProc
//            gibt Filtereinstellungen am unteren Fensterrand aus
// ************************************************************************
    
static VOID DrawParameters ( HPS hps, USHORT cx, USHORT cy, BOOL monitor)
{
           POINTL     ptl;
           int        i;
           PSZ        szText;
           LONG       BackGround;
           CHAR       s[50];

   if (monitor == TRUE)                  // Hintergrundfarbe festlegen
   { 
     BackGround = CLR_BLACK;
   } else
   {
     BackGround = CLR_WHITE;
   }

   for ( i = 0 ; i < 4 ; i++ )
   {
     if (fdata[i].Aktiv == TRUE)         // Filter sichtbar ?
     {
       GpiSetColor(hps, fdata[i].LinienFarbe);
     } else
     { 
       GpiSetColor(hps, BackGround);
       
       switch (i)                       // evtl. "Zulieferer" fr      
       {                                // anderes, sichtbares Filter ?
         case 0: 
           if ( (fdata[1].MulMitFlt1 == TRUE) ||         
				(fdata[2].MulMitFlt1 == TRUE) ||
				(fdata[3].MulMitFlt1 == TRUE) )
		   { GpiSetColor(hps, CLR_DARKGRAY ); }
		   break; 		
         case 1:
           if ( (fdata[0].MulMitFlt2 == TRUE) ||         
				(fdata[2].MulMitFlt2 == TRUE) ||
				(fdata[3].MulMitFlt2 == TRUE) )
		   { GpiSetColor(hps, CLR_DARKGRAY ); }
		   break; 		
         case 2:
           if ( (fdata[0].MulMitFlt3 == TRUE) ||         
				(fdata[1].MulMitFlt3 == TRUE) ||
				(fdata[3].MulMitFlt3 == TRUE) )
		   { GpiSetColor(hps, CLR_DARKGRAY ); }
		   break; 		
         case 3:
           if ( (fdata[0].MulMitFlt4 == TRUE) ||         
				(fdata[1].MulMitFlt4 == TRUE) ||
				(fdata[2].MulMitFlt4 == TRUE) )
		   { GpiSetColor(hps, CLR_DARKGRAY ); }
		   break; 		
       }
	 }
       
     GpiSetLineType(hps, fdata[i].LinienArt);

     ptl.x = 20;
     ptl.y = 50-(i*13);
     GpiMove(hps, &ptl);
     ptl.x = 100;
     GpiLine(hps, &ptl);
      
     if( (szText = (PSZ) malloc(256)) == NULL )
     {
        return;
     }

     if (fdata[i].Typ == fltGrundTyp)
     {
       szText = GetPSZ(
                "Filter %d: %s,  %s,  %d.Ordnung,  A = %d dB,  fg = %d Hz", 
                (i+1),                                  // Filter-Nummer
                FilterTyp[fdata[i].Grundtyp-1],         // Filter-Typ
                FilterCharakter[fdata[i].Charakter-1],  // Filter-Charakter
                fdata[i].Ordnung,                       // Filter-Ordnung
                fdata[i].Verstaerkung,                  // Filter-Verst„rkung
                fdata[i].Grenz);                        // Grenzfrequenz
     } else
     {
       szText = GetPSZ(
                "Filter %d: šberlagerung von den grau dargestellten Filtern",
                (i+1));                                 // Filter-Nummer
     }   
     ptl.y = 45-(i*13);
     ptl.x = 120;
     GpiCharStringAt(hps, &ptl, strlen(szText), szText);
     free( szText );
   }
}


// ************************************************************************
// GetPSZ
// Bemerkung: verwendet von DrawParameters | ClientWndProc
//            erzeugt aus String aus Format und Argumentenliste
// ************************************************************************

#define TEXT_SIZE 512

PSZ GetPSZ( PSZ szFormat,... )
{
    PSZ     szText;
    va_list argptr;

    if( (szText = (PSZ) malloc( TEXT_SIZE )) == NULL )
    {
        DosBeep( 1000, 1000 );
        return;
    }
    va_start( argptr, szFormat );
    vsprintf( szText, szFormat, argptr );
    va_end( argptr );
    szText[ TEXT_SIZE - 1 ] = 0;
    return szText;
}

// ************************************************************************
// SetUpPage
// Bemerkung: verwendet von BearbDlgProc
//            fgt einzelne Seiten in das Notizbuch ein
// ************************************************************************

static BOOL SetUpPage( HWND hwndNB, HWND hwnd, PVOID data, INT iPage )
{
    nbpage[iPage].pageId = (ULONG) WinSendMsg( hwndNB,
                            BKM_INSERTPAGE, NULL,
                            MPFROM2SHORT( BKA_MAJOR | BKA_AUTOPAGESIZE,
                            BKA_LAST ) );

    WinSendMsg( hwndNB, BKM_SETTABTEXT,
                            MPFROMP( nbpage[iPage].pageId ),
                            MPFROMP( nbpage[iPage].szTabText ) );

    nbpage[iPage].hwndDlg = WinLoadDlg(hwndNB, hwnd,
                            (PFNWP) nbpage[iPage].pfnwpDlg,
                            NULLHANDLE,
                            nbpage[iPage].idDlg,
                            data);

    WinSendMsg(hwndNB, BKM_SETPAGEWINDOWHWND,
                            MPFROMLONG( nbpage[iPage].pageId ),
                            MPFROMHWND( nbpage[iPage].hwndDlg ));
  return (BOOL)TRUE;
}

// ************************************************************************
// SetTabDimensions
// Bemerkung: verwendet von BearbDlgProc
//            Legt die GrӇe der Tabulatoren im Notizbuch fest
// ************************************************************************

static BOOL SetTabDimensions( HWND hwndNB )
{
    HPS          hps = WinGetPS( hwndNB );
    FONTMETRICS  fm;
    INT          i, iSize, iLongestMajText = 0, iLongestMinText = 0;

    (void) memset( &fm, 0, sizeof( FONTMETRICS ) );

    // H”he und Breite des akt. Fonts errechnen
    if( GpiQueryFontMetrics( hps, sizeof( FONTMETRICS ), &fm ) )
        fm.lMaxBaselineExt += (TAB_HEIGHT_MARGIN * 2);
    else
        fm.lMaxBaselineExt = DEFAULT_NB_TAB_HEIGHT + (TAB_HEIGHT_MARGIN * 2);

    // l„ngsten Tab-Text ermitteln
    for( i = 0; i < PAGE_COUNT; i++ )
    {
        iSize = GetStringSize( hps, hwndNB, nbpage[ i ].szTabText );

        if( iSize > iLongestMajText )
            iLongestMajText = iSize;
    }

    WinReleasePS( hps );

    // Rand an l„ngsten Tab-Text hinzufgen
    if( iLongestMajText )
        iLongestMajText += TAB_WIDTH_MARGIN;

    if( iLongestMinText )
        iLongestMinText += TAB_WIDTH_MARGIN;

    // neue GrӇen fr BKA_MAJORTAB und BKA_MINORTAB setzen
    if( iLongestMajText )
       WinSendMsg( hwndNB, BKM_SETDIMENSIONS,
                 MPFROM2SHORT( iLongestMajText, (SHORT)fm.lMaxBaselineExt ),
                 MPFROMSHORT( BKA_MAJORTAB ) );


    if( iLongestMinText )
       WinSendMsg( hwndNB, BKM_SETDIMENSIONS,
                 MPFROM2SHORT( iLongestMinText, (SHORT)fm.lMaxBaselineExt ),
                 MPFROMSHORT( BKA_MINORTAB ) );

  return (BOOL)TRUE;
}

// ************************************************************************
// GetStringSize
// Bemerkung: verwendet von SetTabDimensions --> BearbDlgProc
//            ermittelt die L„nge eines Strings, damit die Gr”áe der
//            Tabulatoren richtig eingestellt werden kann.         
// ************************************************************************

static INT GetStringSize( HPS hps, HWND hwndNB, PSZ szString )
{
    POINTL aptl[ TXTBOX_COUNT ];
    // ermitteln der GrӇe, in Pixeln, die der String berschreitet
    GpiQueryTextBox( hps, strlen( szString ), szString, TXTBOX_COUNT, aptl );
    return aptl[ TXTBOX_CONCAT ].x;
}


// ************************************************************************
// Message
// Bemerkung: zeigt Messagebox mit PSZ als Nachricht an
//            wird an vielen Stellen im Programm verwendet
// ************************************************************************

#define MESSAGE_SIZE 1024

VOID Msg( PSZ szFormat,... )
{
    PSZ     szMsg;
    va_list argptr;

    if( (szMsg = (PSZ) malloc( MESSAGE_SIZE )) == NULL )
    {
        DosBeep( 1000, 1000 );
        return;
    }

    va_start( argptr, szFormat );

    vsprintf( szMsg, szFormat, argptr );

    va_end( argptr );

    szMsg[ MESSAGE_SIZE - 1 ] = 0;

    (void) WinAlarm( HWND_DESKTOP, WA_WARNING );

    (void) WinMessageBox(  HWND_DESKTOP, HWND_DESKTOP, szMsg,
                           "Information", 1, MB_OK | MB_MOVEABLE );

    free( szMsg );

    return;
}



page up

This page was created using Code Colorizer -    http://www.chami.com/colorizer





Bookmark this page.
 
 

Copyright © Tom Wellige, 1995-2010
All Rights Reserved