/* 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; //
}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
|
|