|
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;
}
|
This page was created using
|
 |
Bookmark this page.
|
|
|