Source file: /~heha/mb-iwp/NA/MSVC.zip/src/SweepDlg.cpp

/********************************************************
 * Dialogdensterprozedur für „Geräte-Einstellung“	*
 * (nichtmodaler Dialog)				*
 ********************************************************/
#include "PiezoMess.h"

HWND hSweepDlg;
const union _uNaN uNaN={(__int64)-1};
UNIT FreqUnit;

// Signalisierend (generiert letztendlich WM_TIMER)
static void SetItemFloatS(UINT id, float f, int nk) {
 TCHAR s[16];
 HWND w=GetDlgItem(hSweepDlg,id);
 UNIT*u=(UNIT*)GetProp(w,T("Unit"));
 if (u) f/=u->Mul;
 FloatToString(f,nk,s,elemof(s));
 SetWindowText(w,s);
}

// Nicht signalisierend
static void SetItemFloat(UINT id, float f, int nk) {
 SetItemFloatS(id,f,nk);
 KillTimer(hSweepDlg,id);
}

static float GetItemFloat(UINT id, int *nk=NULL, float*caret=NULL) {
 HWND w=GetDlgItem(hSweepDlg,id);
 TCHAR s[16];
 GetWindowText(w,s,elemof(s));
 TCHAR *p=_tcschr(s,',');
 if (p) *p='.';
 if (nk) {
  p=_tcschr(s,'.');	// Dezimalpunkt suchen
  if (p) {
   int l=lstrlen(s);
   *nk=int(s+l-p-1);
  }else *nk=0;
 }
 float t;
 int n;
 if (_stscanf(s,T("%f%n"),&t,&n)==1 && !s[n]) {
  if (caret) {
  }else{
   UNIT*u=(UNIT*)GetProp(w,T("Unit"));
   if (u) t*=u->Mul;
  }
  return t;
 }
 return fNaN;
}

static void HandleScroll(HWND Wnd, int w) {
 float f=GetItemFloat(GetDlgCtrlID(Wnd));
 if (f==f) {
  f+=w;
  SetItemFloatS(GetDlgCtrlID(Wnd),f,3);
 }else MessageBeep(0);
}
/*
static WNDPROC DefEditProc;

static INT_PTR SubEditProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
 switch (Msg) {
  case WM_VSCROLL: switch (GET_WM_VSCROLL_CODE(wParam,lParam)) {
   case SB_LINEUP: HandleScroll(Wnd,1); break;
   case SB_LINEDOWN: HandleScroll(Wnd,-1); break;
   case SB_PAGEUP: HandleScroll(Wnd,10); break;
   case SB_PAGEDOWN: HandleScroll(Wnd,-10); break;
  }break;
  case WM_KEYDOWN: switch (wParam) {
   case VK_UP: HandleScroll(Wnd,1); return 0;
   case VK_DOWN: HandleScroll(Wnd,-1); return 0;
   case VK_PRIOR: HandleScroll(Wnd,10); return 0;
   case VK_NEXT: HandleScroll(Wnd,-10); return 0;
  }break;
 }
 return CallWindowProc(DefEditProc,Wnd,Msg,wParam,lParam);
}

static void SubclassEdit(UINT id) {
 DefEditProc=SubclassWindow(GetDlgItem(hSweepDlg,id),SubEditProc);
}
*/

void AddUpDown(UINT id) {
 CreateUpDownControl(WS_CHILD|WS_BORDER|WS_VISIBLE|UDS_HOTTRACK|UDS_ALIGNRIGHT,
   0,0,0,0,hSweepDlg,id+64,0,GetDlgItem(hSweepDlg,id),100,0,0);
}

INT_PTR CALLBACK SweepDlgProc(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam) {
 switch (Msg) {
  case WM_INITDIALOG: {
   hSweepDlg=Wnd;
//   for (UINT i=16; i<=20; i++) SubclassEdit(i);
   AddUpDown(16);
   AddUpDown(17);
   AddUpDown(18);
   AddUpDown(19);
   SetProp(GetDlgItem(Wnd,16),T("Unit"),(HANDLE)&FreqUnit);
   SetProp(GetDlgItem(Wnd,17),T("Unit"),(HANDLE)&FreqUnit);
   SendMessage(Wnd,WM_UpdateFeature,0,0);
   HWND w=GetDlgItem(Wnd,13);
   ComboBox_AddString(w,T("Hz"));
   ComboBox_AddString(w,T("kHz"));
   ComboBox_AddString(w,T("MHz"));
   ComboBox_SetCurSel(w,FreqUnit.Pre/3);
   SetDlgItemText(hSweepDlg,14,FreqUnit.Text);
  }return TRUE;
  
  case WM_UpdateFeature: {
   SetItemFloat(16,feature.GetFu(),3);
   SetItemFloat(17,feature.GetFo(),3);
   SetItemFloat(18,feature.GetT(),3);
   SetDlgItemInt(Wnd,19,feature.steps,FALSE);
   KillTimer(Wnd,19);
   SetItemFloat(20,feature.GetHV(),1);
   CheckDlgButton(Wnd,29,feature.IsLog());
  }break;
  
  case WM_Update: {
   SetItemFloat(21,adcmean.hv*HVSCALE,1);
  }break;
  
  case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam,lParam)) {
   case IDCANCEL: DestroyWindow(Wnd); break;
   case 13: switch (GET_WM_COMMAND_CMD(wParam,lParam)) {
    case CBN_SELCHANGE: {
     float a,e;
     int nka,nke;
     a=GetItemFloat(16,&nka);
     e=GetItemFloat(17,&nke);
     FreqUnit.Init(ComboBox_GetCurSel((HWND)lParam)*3);
     SetItemFloat(16,a,nka);
     SetItemFloat(17,e,nke);
     SetDlgItemText(hSweepDlg,14,FreqUnit.Text);
     SendMessage(ghMainWnd,WM_ChangeUnit,0,0);
    }break;
   }break;
   case 29: feature.SetLog(IsDlgButtonChecked(Wnd,29)!=0); break;
   default: switch (GET_WM_COMMAND_CMD(wParam,lParam)) {
    case EN_CHANGE: SetTimer(Wnd,GET_WM_COMMAND_ID(wParam,lParam),300,NULL); break;
   }
  }break;
  
  case WM_TIMER: KillTimer(Wnd,wParam); switch (wParam) {
   case 16: {	// untere Eckfrequenz
    float f=GetItemFloat((UINT)wParam);
    if (10<=f && f<=33.3E6) {
     feature.SetFu(f);
    }else MessageBeep(0);
   }break;
   case 17: {	// obere (zweite) Eckfrequenz
    float f=GetItemFloat((UINT)wParam);
    if (10<=f && f<=33.3E6) {
     feature.SetFo(f);
    }else MessageBeep(0);
   }break;
   case 18: {	// Sweep-Zeit
    float f=GetItemFloat((UINT)wParam);
    if (0.01F<=f && f<=10) {
     feature.SetT(f);
     SetDlgItemInt(Wnd,19,feature.steps,FALSE);	// Stützstellen nachführen
     KillTimer(Wnd,19);
    }else MessageBeep(0);
   }break;
   case 19: {	// Frequenz-Stützstellen
    int i=GetDlgItemInt(Wnd,(UINT)wParam,NULL,FALSE);
    if (10<=i && i<=1000) {
     feature.SetSteps(i);
     SetItemFloat(18,feature.GetT(),3);	// Zeit nachführen
     KillTimer(Wnd,18);
    }else MessageBeep(0);
   }break;
   case 20: {	// Soll-Hochspannung
    double f=GetItemFloat((UINT)wParam);
    if (10<=f && f<=100) {
     feature.hv=WORD(f/HVSCALE+0.5);
    }else MessageBeep(0);
   }break;
  }break;
  
  case WM_DESTROY: hSweepDlg=0; break;
 }
 return FALSE;
}
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded