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