Source file: /~heha/messtech/sensokom.zip/source/A_INPUT.C

/* Dieser Dialog {mit der ParamDlgProc()} ist so komplex,
 * für ihn lohnt sich diese Extra-Datei.
 */
#include <windows.h>
#include <windowsx.h>		//Message Crackers
#ifndef GET_WM_COMMAND_CMD
# define GET_WM_COMMAND_CMD(wp,lp) HIWORD(lp)	//fehlt bei BC31 windowsx.h
#endif
#include <commdlg.h>		//GetOpenFileName
//#include <string.h>		//memset
#include <stdio.h>		//sprintf
#include <math.h>		//floor, log, fabs, exp für MakePrefix
#include "driver.h"		//DDE-Gerätezugriff
#include "dialog.h"		//diverse Hilfsfunktionen
#include "a_input.h"		//Nur der Prototyp der Fensterfunktion
#include "sensokom.rh"		//ID der Dialogressource für Hilfe
#include "toolstat.h"		//HelpFileName

//=== Dialog-interne Strukturen ===
typedef struct {
 int o;			// Originaler Digitalwert
 float x,y;		// Anzeige-Werte X und Y mit Komma
}PAIR;

typedef struct {
 BYTE m_Adresse;			// Modul-Adresse
 int  komma,oldkomma;			// Kommastellen auf Anzeige
 int  anz;				// Anzahl der Wertepaare
 float X_min, X_max, Y_min, Y_max;	// Grenzen der folgenden Paare
 PAIR pair[20];				// Wertepaare
}DLGDATA, near*NPDLGDATA, far*LPDLGDATA;

//=== Allgemeine Unterprogramme ===
static int limit(float z, int u, int o) {
//Sauberes Eingrenzen einer FLOAT-Zahl
 if (z<u) return u;
 if (z>o) return o;
 return (int)z;
}

static long CalcF(int m, int s, int v) { /* berechnet irgendwas aus irgendwas */
 switch (m) {
  case 0: return (v==40) ? 2L*v : 2000L*v;
  case 1: return 10L*v*50/*Ohm*/;
  case 2:
  case 3:
  case 8:
  case 9: return (v==1) ? 10L*v*1000 : 10L*v;
// else if (m==11 || m==12) {
  case 4:
  case 11:
  case 12: return 10L*v;
  default: switch (s) {		// für 5,6,7,10
   case 0: return v;
   case 1: return 5L*v;
   case 2: return 10L*v;
   case 3: return 50L*v;
  }
  return 1;
 }
}

static void TSV(const PAIR *pair, int k, char *buf) {
// Drei tabulator-separierte Werte ausgeben (in String)
 char buf2[10];
 if (abs(pair->o)<=20000) {
  sprintf(buf2,"%+d",pair->o);
  if (buf2[0]=='-') buf2[0]=(char)173;	// längeres Minus
  if (!pair->o) buf2[0]=(char)160;		// &nbsp;
 }else{
  lstrcpy(buf2,"XXXX");			// Überlauf!
 }
 sprintf(buf,"%s\t%.*f\t%.*f",buf2,k,pair->x,k,pair->y);
}

static char MakePrefix(float number, float*multiplier) {
/* Ausgehend von <number> wird ein Präfix ausgewählt,
 * der eine Wiedergabe der physikalischen Größe mit 1..3
 * Vorkommastellen erlaubt.
 * In <multiplier> landet der Wert zum "Behandeln" der Daten vor Ausgabe.
 * Die Funktion kann auch '\0' liefern!
 */
 int i;
 static const char ISO_Prefixes[13]={	// MSVC ist blöd!
   'a','f','p','n','µ','m','\0','k','M','G','T','P','E'};
 static const float log1000=6.907755278982137F; //log(1000);
 i=number?(int)floor(log(fabs(number))/log1000):0;
			//Typecast ohne floor() rundet zu Null: falsch!
 if (abs(i)>6) i=0;     //idiotisch, hier noch Präfixe zu verwenden
 *multiplier=(float)exp(-i*log1000);
 return ISO_Prefixes[i+6];
}

//=== Unterprogramme für bestimmte Nachrichten (Ereignisse) ===
#ifdef __BORLANDC__
# pragma argsused
#endif
static void ThermotypChange(HWND Wnd, NPDLGDATA dd) {
 BOOL Enab=IsDlgButtonChecked(Wnd,6005);
 EnableDlgItem(Wnd,6002,Enab);
 Enab=!Enab;
 EnableDlgItem(Wnd,6004,Enab);
 EnableDlgItem(Wnd,6007,Enab);
 EnableDlgItem(Wnd,6008,Enab);
}

static void OnFChange (HWND Wnd, NPDLGDATA dd) { // Wenn sich F ändert...
 int m=(int)SendDlgItemMessage(Wnd,6001,CB_GETCURSEL,0,0);//Messart
 int s=(int)SendDlgItemMessage(Wnd,6003,CB_GETCURSEL,0,0);//Steuerstrom
 BYTE vi=(BYTE)SendDlgItemMessage(Wnd,6002,CB_GETCURSEL,0,0);//Verstärkung
 int v=verstaerk[vi];
 long f=CalcF(m,s,v);
 HWND LWerte=GetDlgItem(Wnd,6013);
 int OldSel=(int)SendMessage(LWerte,LB_GETCURSEL,0,0);
 int i;
 SendMessage(LWerte,LB_RESETCONTENT,0,0);
 for (i=0; i<dd->anz; i++) {
  char buf[32];
  dd->pair[i].o=limit(dd->pair[i].x*f,-20001,20001);
  TSV(dd->pair+i,dd->komma,buf);
  SendMessage(LWerte,LB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
 }
 SendMessage(LWerte,LB_SETCURSEL,OldSel,0);
}

static void MessartChange(HWND Wnd, NPDLGDATA dd) {
 int i,m,OldSel;
 BOOL Enab;
 char *maxstr="Maximalwert:";
 float ew=2.0;
 char *prefix="± ";
 char *einheit="V";
 HWND MaxList=GetDlgItem(Wnd,6002);
 EnableWindow(MaxList,TRUE);
 m=(int)SendDlgItemMessage(Wnd,6001,CB_GETCURSEL,0,0);
 Enab=m==4||m==11;	//Thermometer...
 for (i=6004; i<=6008; i++) EnableDlgItem(Wnd,i,Enab);

 switch (m) {
  case 4:
  case 11:
  ThermotypChange(Wnd,dd);
  case 0:
  case 2:
  case 3: {
   if (!m) ew=10.0;
  }break;
  case 1: {
   ew/=50;	// durch 50 Ohm ergibt 40 mA
   einheit="A";
  }break;
  case 5:
  case 6:
  case 7: {
   int si=(int)SendDlgItemMessage(Wnd,6003,CB_GETCURSEL,0,0);
   prefix="";
   ew*=strom_inv[si];	// Speisestrom einrechnen
   einheit="Ohm";
  }break;
  case 8:
  case 9: {
   maxstr="max. Brückenspannung:";
  }break;
 }/*switch*/

 SetDlgItemText(Wnd,6010,maxstr);

 OldSel=(int)SendMessage(MaxList,CB_GETCURSEL,0,0);
 SendMessage(MaxList,CB_RESETCONTENT,0,0);
 for (i=0; i<8; i++) {
  float z,m;
  char buf[20],e[2];
  z=ew/verstaerk[i];
  e[0]=MakePrefix(z,&m); e[1]='\0';
  sprintf(buf,"%s%g %s%s",prefix,z*m,e,einheit);
  SendMessage(MaxList,CB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
 }
 SendMessage(MaxList,CB_SETCURSEL,OldSel,0);
 OnFChange(Wnd,dd);
}

static void KommaChange(HWND Wnd, NPDLGDATA dd) {
 dd->komma=(int)SendDlgItemMessage(Wnd,6011,CB_GETCURSEL,0,0);
 OnFChange(Wnd,dd);
}

//=== Linearisierungspaar-Verwaltung===
static void DeletePair(NPDLGDATA dd, int at) {
 if (!dd->anz) return;
 dd->anz--;
 for ( ; at<dd->anz; at++) {
  dd->pair[at]=dd->pair[at+1];
 }
}

static int InsertPair(NPDLGDATA dd, int o, float x, float y) {
// sortiert nach X in Liste der Linearisierungspaare einfügen
 int i,newpos;
 if (dd->anz==20) return -1;
 for (newpos=0; newpos<dd->anz; newpos++) {
  if (dd->pair[newpos].x>x) break;
 }
 for (i=dd->anz; i>newpos; i--) {
  dd->pair[i]=dd->pair[i-1];
 }
 dd->anz++;
 dd->pair[newpos].o=o;
 dd->pair[newpos].x=x;
 dd->pair[newpos].y=y;
 return newpos;
}

static void CalcMinMax(NPDLGDATA dd) {
 int i;
 dd->X_min=1E38F, dd->X_max=-1E38F, dd->Y_min=1E38F, dd->Y_max=-1E38F;
 for (i=0; i<dd->anz; i++) {
  if (dd->X_min>dd->pair[i].x) dd->X_min=dd->pair[i].x;
  if (dd->X_max<dd->pair[i].x) dd->X_max=dd->pair[i].x;
  if (dd->Y_min>dd->pair[i].y) dd->Y_min=dd->pair[i].y;
  if (dd->Y_max<dd->pair[i].y) dd->Y_max=dd->pair[i].y;
 }
}

static void ShowKennlinie(HWND Wnd, NPDLGDATA dd) {
 CalcMinMax(dd);
 SetDlgItemFloat(Wnd,6017,dd->komma,dd->X_max);
 SetDlgItemFloat(Wnd,6016,dd->komma,dd->X_min);
 SetDlgItemFloat(Wnd,6019,dd->komma,dd->Y_max);
 SetDlgItemFloat(Wnd,6018,dd->komma,dd->Y_min);
 InvalidateRect(GetDlgItem(Wnd,2003),NULL,TRUE);	// neue Kurve
}

static void EditEntry(HWND Wnd, NPDLGDATA dd) {
 char buf[32];
 float mess, lin;
 HWND LWerte=GetDlgItem(Wnd,6013);
 int oldpos=(int)SendMessage(LWerte,LB_GETCURSEL,0,0);
 SendMessage(LWerte,LB_GETTEXT,oldpos,(LPARAM)(LPSTR)buf);
 sscanf(buf,"%*s %f %f",&mess,&lin);
 if (PairInput(Wnd,MAKEINTRESOURCE(0xB03),	//Änderung Wertepaar
   MAKEINTRESOURCE(0xB04), MAKEINTRESOURCE(0xB05),
   &mess, &lin, FALSE, dd->komma)==IDOK) {
  DeletePair(dd,oldpos);
  InsertPair(dd,0,mess,lin);
  OnFChange(Wnd,dd);
  ShowKennlinie(Wnd,dd);
 }
}

static void InsertEntry (HWND Wnd, NPDLGDATA dd) {
 float mess, lin;
 if (dd->anz<20) {
  if (PairInput(Wnd,MAKEINTRESOURCE(0xB02),	//"Eingabe Wertepaar"
    MAKEINTRESOURCE(0xB04), MAKEINTRESOURCE(0xB05),
    &mess, &lin, FALSE, -1)==IDOK) {
   InsertPair(dd,0,mess,lin);
   OnFChange(Wnd,dd);
   if (dd->anz>2) EnableDlgItem(Wnd,6020,TRUE);
   ShowKennlinie(Wnd,dd);
  }
 }else EnableDlgItem(Wnd,6015,FALSE);
}

static void DelEntry(HWND Wnd, NPDLGDATA dd) {
 if (dd->anz>2) {
  HWND LWerte=GetDlgItem(Wnd,6013);
  int oldpos = (int)SendMessage(LWerte,LB_GETCURSEL,0,0);
  if (oldpos>=0) {
   DeletePair(dd,oldpos);
   SendMessage(LWerte,LB_DELETESTRING,oldpos,0);
   SendMessage(LWerte,LB_SETCURSEL,oldpos,0);	// aufs nächste Element
   ShowKennlinie(Wnd,dd);
  }else MessageBeep(MB_ICONSTOP);
 }
 if (dd->anz<3) EnableDlgItem(Wnd,6020,FALSE);
}

static void LoadLinFile(HWND Wnd, NPDLGDATA dd) {
 float mess, lin;
 OPENFILENAME ofn;
 FILE *f;
 char buf[256];

 InitStruct(&ofn,sizeof(ofn));
 ofn.hwndOwner=Wnd;
 ofn.lpstrFilter="Linearisierungsdateien (*.lin)\0*.lin\0";
 ofn.lpstrFile=buf; ofn.nMaxFile=elemof(buf); buf[0]=0;
 ofn.Flags=OFN_HIDEREADONLY|OFN_FILEMUSTEXIST|OFN_LONGNAMES|OFN_SHOWHELP;
 if (!GetOpenFileName(&ofn)) return;
 f=fopen(buf,"r");
 if (!f) return;
 dd->anz=0;
 while (fgets(buf,sizeof(buf)-1,f)) {
  sscanf(buf,"%f %f",&mess,&lin);
  InsertPair(dd,0,mess,lin);
 }
 fclose(f);
 KommaChange(Wnd,dd);		 // Anzeige der Listbox neu aufbauen
 ShowKennlinie(Wnd,dd);
}

static WNDPROC OldLbProc;
#define WM_CHILDKEYDOWN WM_USER+88
LRESULT CALLBACK NewLbProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
 switch (Msg) {
  case WM_KEYDOWN: switch (wParam) {
   case VK_DELETE:
   case VK_INSERT:
   case VK_SPACE: SendMessage(GetParent(Wnd),WM_CHILDKEYDOWN,wParam,lParam);
  }nobreak;
 }
 return CallWindowProc(OldLbProc,Wnd,Msg,wParam,lParam);
}

//=== Dialogfensterfunktion ===
BOOL CALLBACK ParamDlgProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
 extern UINT WM_ComDlgHelp;	// in der SENSOKOM.C vorhanden und initialisiert
 NPDLGDATA dd=(NPDLGDATA)GetWindowLong(Wnd,DWL_USER);
 switch (Msg) {
  case WM_INITDIALOG: {
   BYTE Thermotyp,vi;
   int m,s,v,i;
   char buf[64];
   HWND W,LWerte;
   long f;
   static const char Thermotypen[10]={	//blödes MSVC
     'B','C','E','J','K','L','R','S','T','U'};
   const char *Einheiten[8]= {"mV","V","mA","A","g","mm","°C","Ohm"};
   static int tabs[2]={40,80};
   dd=(NPDLGDATA)LocalAlloc(LMEM_FIXED,sizeof(DLGDATA));
	// für die Lebenszeit des Dialogs Hilfsspeicher beschaffen
   SetWindowLong(Wnd,DWL_USER,(long)dd);	// Adresse merken
   dd->m_Adresse=(BYTE)lParam;			// Struktur füllen
   Thermotyp=Get_Thermotyp(dd->m_Adresse);
   m=Get_Messart(dd->m_Adresse);
   s=Get_Strom(dd->m_Adresse);
   vi=Get_Verstaerk(dd->m_Adresse);
   v=verstaerk[vi];
   dd->komma=Get_Komma(dd->m_Adresse); if ((unsigned)dd->komma>6) dd->komma=6;
   dd->oldkomma=dd->komma;

   W=GetDlgItem(Wnd,6001);	// Kombobox "Messart"
   for (i=2560; i<2560+12; i++) {
    LoadString(hInstance,i,buf,sizeof(buf));
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
   }
   SendMessage(W,CB_SETCURSEL,m,0);

   W=GetDlgItem(Wnd,6004);	// Kombobox "Thermotyp"
   for (i=0; i<10; i++) {
    wsprintf(buf,"Typ %c",Thermotypen[i]);
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
   }
   SendMessage(W,CB_SETCURSEL,(Thermotyp>>2)&0x0F,0);

   CheckDlgButton(Wnd,Thermotyp&0x01?6006:6005,TRUE);	//6006 wenn DIN-Standard
   CheckDlgButton(Wnd,Thermotyp&0x40?6007:6008,TRUE);	//6008 wenn gesamter Temperaturbereich

   SetDlgItemInt(Wnd,6009,Get_Mittelungen(dd->m_Adresse),FALSE);

   W=GetDlgItem(Wnd,6002);	// Kombobox "Verstärkung" = "Maxwert"
   for (i=0; i< 8; i++) {
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)"");	// mit Dummys füllen,
   }	// wird von MessartChange() richtig ausgefüllt, brauchen aber...
   SendMessage(W,CB_SETCURSEL,vi,0);	// gültige CurSel

   W=GetDlgItem(Wnd,6003);	// Kombobox "Steuerstrom"
   for (i=0; i< 4; i++) {
    char buf[20];
    sprintf(buf,"%g mA",1000.0/strom_inv[i]);
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
   }
   SendMessage(W,CB_SETCURSEL,s,0);

   W=GetDlgItem(Wnd,6014);	// Kombobox "Einheit"
   Get_Einheit(dd->m_Adresse,buf);
   SetWindowText(W,buf);
   for (i=0; i<8; i++) {
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)Einheiten[i]);
    if (!lstrcmp(buf,Einheiten[i])) SendMessage(W,CB_SETCURSEL,i,0);
   }

   W=GetDlgItem(Wnd,6011);	// Kombobox "Kommastellen"
   for (i=0; i< 7; i++) {
    wsprintf(buf,"%d",i);
    SendMessage(W,CB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
   }
   SendMessage(W,CB_SETCURSEL,dd->komma,0);

   LWerte=GetDlgItem(Wnd,6013);
   OldLbProc=(WNDPROC)SetWindowLong(LWerte,GWL_WNDPROC,(LPARAM)NewLbProc);
   SendMessage(LWerte,LB_SETTABSTOPS,2,(LPARAM)(LPINT)tabs);
  //--------------------
   f=CalcF(m,s,v);
  //---------------------
   dd->anz=0;
   {
    int i,j;
    long n;
    j=Get_LinAnzahl(dd->m_Adresse); if ((unsigned)j>20) j=20;
    n=exp10(dd->komma);
    for (i=0; i<j; i++) {
     int o=Get_OrgWert(dd->m_Adresse,i);
     InsertPair(dd,o,(float)o/f,(float)Get_LinWert(dd->m_Adresse,i)/n);
    }

    for (i=0; i<dd->anz; i++) {
     char buf[50];
     TSV(dd->pair+i,dd->komma,buf);
     SendMessage(LWerte,LB_ADDSTRING,0,(LPARAM)(LPSTR)buf);
    }
   }
   MessartChange(Wnd,dd);
   ShowKennlinie(Wnd,dd);
   if (dd->anz<3) EnableDlgItem(Wnd,6020,FALSE);
   if (dd->anz>=20) EnableDlgItem(Wnd,6015,FALSE);
  }return TRUE;

  case WM_CHILDKEYDOWN: if (dd) switch (wParam) {
   case VK_INSERT: InsertEntry(Wnd,dd); break;
   case VK_DELETE: DelEntry(Wnd,dd); break;
   case VK_SPACE:  EditEntry(Wnd,dd);
  }break;

  case WM_COMMAND: if (dd) {
#define wNotifyCode GET_WM_COMMAND_CMD(wParam,lParam)
   switch (LOWORD(wParam)) {
    case 6001:
    case 6003:
    case 6014: if (wNotifyCode==CBN_SELCHANGE) MessartChange(Wnd,dd); break;
    case 6002: if (wNotifyCode==CBN_SELCHANGE) OnFChange(Wnd,dd); break;
    case 6011: if (wNotifyCode==CBN_SELCHANGE) KommaChange(Wnd,dd); break;
    case 6005:
    case 6006: ThermotypChange(Wnd,dd); break;
    case 6013: if (wNotifyCode==LBN_DBLCLK) EditEntry(Wnd,dd); break;
    case 6015: InsertEntry(Wnd,dd); break;
    case 6020: DelEntry(Wnd,dd); break;
    case 6021: LoadLinFile(Wnd,dd); break;
    case 9: {			// Hilfe
     WinHelp(Wnd,HelpFileName,HELP_CONTEXT,CM_KONFIGURATION_A_INPUT);
    }break;
    case 3:			// Übernehmen
    case 1: {			// OK
     int i,Laenge,L2,m,s;
     char buf[20];
     BOOL invals;
     BYTE Thermotyp,vi;
     long n;
     HFILE backupdatei;
     int Messart=(int)SendDlgItemMessage(Wnd,6001,CB_GETCURSEL,0,0);
     if (Messart==10) {
      MBox(Wnd,2574,MB_ICONSTOP|MB_OK);	//"Fauler Programmierer"
      SetFocus(GetDlgItem(Wnd,6001));
      return FALSE;
     }
     CalcMinMax(dd);
     Laenge=sprintf(buf,"%+.*f",dd->komma,dd->Y_min);
     L2=sprintf(buf,"%+.*f",dd->komma,dd->Y_max);
     if (Laenge<L2) Laenge=L2;		// Hier ist das MAX-Makro Murks!

     Laenge+=(int)SendDlgItemMessage(Wnd,6014,WM_GETTEXTLENGTH,0,0);
     if ((int)SendDlgItemMessage(Wnd,6014,CB_GETCURSEL,0,0)==7) {
      Laenge-=2;			    //Einheit dazu, bei "Ohm" =1(!)
     }
     if (Laenge>8) {
      MBox(Wnd,2573,MB_ICONSTOP|MB_OK);	//"Zu viele Kommastellen"
      SetFocus(GetDlgItem(Wnd,6011));	// Kommastellen fokussieren
      return FALSE;
     }
     invals=FALSE;
     for (i=0; i<dd->anz; i++) {
      if (abs(dd->pair[i].o)>20000) {
       invals=TRUE; break;
      }
     }
     if (invals) {
      MBox(Wnd,2572,MB_ICONSTOP|MB_OK);	// Linearisierungsdaten außerhalb
      SetFocus(GetDlgItem(Wnd,6013));	//Linearisierungsdaten fokussieren
      return FALSE;
     }
    // Prüfungen abgeschlossen, Daten übernehmen
     SetWaitCursor(Wnd,TRUE);
     Thermotyp=0x02;				// Anwendertyp
     if (IsDlgButtonChecked(Wnd,6006)) Thermotyp=0x01;// DIN-Standard
     Thermotyp|=(BYTE)(SendDlgItemMessage(Wnd,6004,CB_GETCURSEL,0,0)<<2); // Typ B..U
     if (IsDlgButtonChecked(Wnd,6007)) Thermotyp|=0x40;// Temp-Bereich 200 °C
     Set_Thermotyp(dd->m_Adresse,Thermotyp);
     Set_Mittelungen(dd->m_Adresse,(WORD)GetDlgItemInt(Wnd,6009,NULL,FALSE));
     GetDlgItemText(Wnd,6014,buf,5);
     Set_Einheit(dd->m_Adresse,buf);

     n=exp10(dd->komma);
     if (dd->oldkomma!=dd->komma) {	// Schwellwerte umsetzen!
      long o=exp10(dd->oldkomma);
      unsigned int i;
      for (i=0;i<4;i++) {
       Set_Schwelle(dd->m_Adresse,i,(long)((float)Get_Schwelle(dd->m_Adresse,i)*n/o));
      }
      Set_Komma(dd->m_Adresse,(WORD)dd->komma);
      dd->oldkomma=dd->komma;
     }

     m=(int)SendDlgItemMessage(Wnd,6001,CB_GETCURSEL,0,0);//Messart
     s=(int)SendDlgItemMessage(Wnd,6003,CB_GETCURSEL,0,0);//Steuerstrom
     vi=(BYTE)SendDlgItemMessage(Wnd,6002,CB_GETCURSEL,0,0);//Verstärkung
     Set_Messart(dd->m_Adresse,(BYTE)m);
     Set_Strom(dd->m_Adresse,(BYTE)s);
     Set_Verstaerk(dd->m_Adresse,vi);
     backupdatei=_lcreat("backup.lin",0);
     if (backupdatei!=HFILE_ERROR) {
      int i;
      char buf[50];
      for (i=0; i<dd->anz; i++) {
       _lwrite(backupdatei,buf,sprintf(buf,"%E\t%E\n",
	 dd->pair[i].x,dd->pair[i].y));
      }
      _lclose(backupdatei);
     }
     Set_LinAnzahl(dd->m_Adresse,(WORD)dd->anz);
     for (i=0; i<dd->anz; i++) {
      Set_OrgWert(dd->m_Adresse,i,dd->pair[i].o);
      Set_LinWert(dd->m_Adresse,i,(long)(dd->pair[i].y*n));
     }
     SetWaitCursor(Wnd,FALSE);
     if (SchaltplanDlg) SendMessage(SchaltplanDlg,WM_SET_MESSART,0,m);
    }if (LOWORD(wParam)!=1) break;	// nur bei OK das Fenster schließen
    case 2: {
     LocalFree((HLOCAL)dd);
     SetWindowLong(Wnd,DWL_USER,0);		// sicherheitshalber
     EndDialog(Wnd,wParam);
    }
   }/*switch*/
#undef wNotifyCode
  }return FALSE;

  case WM_DRAWITEM: {
#define DIS ((LPDRAWITEMSTRUCT)lParam)
#define R (DIS->rcItem)
   int i,*ptp;
   POINT pt[20];	// Kennlinie
	// Rahmen und weiße Zeichenfläche malen
   SelectObject(DIS->hDC,GetStockObject(WHITE_BRUSH));
   Rectangle(DIS->hDC,R.left,R.top,R.right,R.bottom);
   InflateRect(&R,-1,-1);
	// Nullkreuz
   if (dd->X_max!=dd->X_min && dd->Y_max!=dd->Y_min) {
    int x0=fitrafo(0,dd->X_min,dd->X_max,R.left,R.right);
    int y0=fitrafo(0,dd->Y_min,dd->Y_max,R.bottom,R.top);
    HPEN zpen=CreatePen(PS_DOT,0,0L);
    HPEN open=(HPEN)SelectObject(DIS->hDC,zpen);
    if (dd->X_min<0 && dd->X_max>0) {
     Line(DIS->hDC,x0,R.top,x0,R.bottom);
    }
    if (dd->Y_min<0 && dd->Y_max>0) {
     Line(DIS->hDC,R.left,y0,R.right,y0);
    }
    SelectObject(DIS->hDC,open);
    DeleteObject(zpen);
   }
   i=0;
   for (ptp=(int*)pt; i<dd->anz; i++) {
    *ptp++=fitrafo(dd->pair[i].x,dd->X_min,dd->X_max,R.left,R.right);
    *ptp++=fitrafo(dd->pair[i].y,dd->Y_min,dd->Y_max,R.bottom,R.top);
   }
   Polyline(DIS->hDC,pt,i);
#undef R
#undef DIS
  }
  default: if (Msg==WM_ComDlgHelp){
   WinHelp(Wnd,HelpFileName,HELP_CONTEXT,6021);
  }
 }/*switch*/
 return FALSE;
}

Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded