File: DIFRKMTY\A_INTERN.CPP

    1 //##############################################################################
    2 //                                                                            //
    3 // A_INTERN.CPP                                                               //
    4 //                                                                            //
    5 // Subsystem: Diffraktometrie/ Reflektometrie                                 //
    6 //            intern genutzte Fenster für AreaScan                            //
    7 // Benutzung durch andere Subsysteme erforderlich: NEIN                       //
    8 //                                                                            //
    9 //##############################################################################
   10 //! Kommentierung und Aenderungen B. Buss, 2000/2001, HUB IfI
   11 
   12 #include <direct.h>
   13 
   14 #include "internls\evrythng.h" // GermanVersion
   15 #include "winresrc\rc_def.h"   // Ressourcen-IDs
   16 #include "help\help_def.h"     // Help-IDs
   17 #pragma hdrstop
   18 
   19 #include "difrkmty\a_intern.h" // SCHNITTSTELLE für diese Datei
   20 #include "difrkmty\a_extern.h" // TAreaScanWindow
   21 #include "internls\l_layer.h" // für extern lpDBase
   22 
   23 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
   24 
   25 __declspec(dllimport) LPDataBase lpDBase; // aus L_LAYER.CPP
   26 
   27 //#############################################################################
   28 // globale Typen und Konstanten
   29 //#############################################################################
   30 
   31 const UINT _RELATIONDIGITS= 2;
   32 const UINT _MAXTIMEDIGITS= 1;
   33 
   34 //#############################################################################
   35 // sprachspezifische Konstanten
   36 //#############################################################################
   37 
   38 #ifdef GermanVersion
   39         static const char szDlgFailure[]= "Fehler";
   40         static const char szDlgMessage[]= "Meldung";
   41         static const char szInfoType0[]= "         Meßdetektor";
   42         static const char szInfoType1[]= "Integrale Intensität";
   43         static const char szInfoType2[]= "    Absorberposition";
   44         static const char szInfoType3[]= "  Monitor-Intensität";
   45         static const char szInfoType4[]= "       reale Meßzeit";
   46         static const char szDlgMsgLine001[]= "Kein gültiger Scantyp";
   47         static const char szDlgMsgLine002[]= "Vorgang bitte wiederholen !";
   48         static const char szDlgMsgLine003[]= "kein Absorber verfügbar";
   49         static const char szDlgMsgLine004[]= "gültige Kanalnummern: 0 bis %d";
   50         static const char szDlgMsgLine005[]= "Bereichsüberschreitung (Omega)";
   51         static const char szDlgMsgLine006[]= "Bereichsüberschreitung (Theta)!\n\nMinimum %s ist ungültig.";
   52         static const char szDlgMsgLine007[]= "Bereichsüberschreitung (Theta)!\n\nMaximum %s ist ungültig.";
   53 
   54         static const char szDlgMsgLine100[]= "Datei existiert bereits !\r\nüberschreiben ?";
   55         static const char szDlgMsgLine101[]= "Probleme beim Anlegen der Datei !";
   56         static const char szDlgMsgLine102[]= "Bitte mit der Maus eine Linie festlegen.";
   57         static const char szDlgMsgLine103[]= "Kein Monitor";
   58         static const char szDlgMsgLine104[]= "Datenbasis-Datei wählen";
59 #else 60 static const char szDlgFailure[]= "Failure"; 61 static const char szDlgMessage[]= "Message"; 62 static const char szInfoType0[]= " Detector-type"; 63 static const char szInfoType1[]= " Integral Intensity"; 64 static const char szInfoType2[]= " Absorberposition"; 65 static const char szInfoType3[]= " Monitor-Intensity"; 66 static const char szInfoType4[]= " real Measure-Time "; 67 static const char szDlgMsgLine001[]= "No valid Scan Type"; 68 static const char szDlgMsgLine002[]= "Please repeat the procedure !"; 69 static const char szDlgMsgLine003[]= "no absorber available"; 70 static const char szDlgMsgLine004[]= "valid Channelnumber: 0 to %d"; 71 static const char szDlgMsgLine005[]= "Area-overstepping (Omega)!"; 72 static const char szDlgMsgLine006[]= "Area-overstepping (Theta)!\n\nMinimum is invalid."; 73 static const char szDlgMsgLine007[]= "Area-overstepping (Theta)!\n\nMaximum is invalid."; 74 75 static const char szDlgMsgLine100[]= "File already exists !\r\nOverwrite ?"; 76 static const char szDlgMsgLine101[]= "Error, creating the file !"; 77 static const char szDlgMsgLine102[]= "Draw a line with the mouse."; 78 static const char szDlgMsgLine103[]= "No Monitor"; 79 static const char szDlgMsgLine104[]= "Choose database-file";
80 #endif 81 82 //############################################################################## 83 // TSetupAreaScanDlg 84 //############################################################################## 85 86 TSetupAreaScanDlg::TSetupAreaScanDlg( TAreaScanWindow *aScan ) : TModalDlg( "AREASCANPARAMETERS", GetMainInstance() ), Areascan(0) 87 { 88 //! einige Parameter vom AreaScan-fenster uebernehmen 89 Areascan= aScan; 90 nOmega= Areascan->nOmega; 91 nTheta= Areascan->nTheta; 92 //JP 12.08.2002 nOldMotor= mlGetAxis(); 93 hDetectorList= 0; 94 d2ThetaStart= Areascan->d2ThetaStart; 95 //! o-t-offset aus AreaScanfenster holen 96 dThetaOffset= Areascan->dOffsetTheta; 97 dOmegaOffset= Areascan->dOffsetOmega; 98 mlSetAxis( nTheta ); 99 }; 100 //***************************************************************************** 101 102 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box 103 //! Rueckkehrcode immer true 104 BOOL TSetupAreaScanDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM lParam ) 105 { 106 CtrlSetDouble(id_2Theta, d2ThetaStart, mlGetDigits(nTheta), _DECIMAL); // 12.06.2003 hier wurde immer eine Nachkommastellengenauigkeit von 4 verwendet?! 107 //! FIX Fehler 74 108 if (!mlIsAxisValid(Theta)) 109 { 110 Areascan->eScanType= stStandardScan; 111 CtrlSetEnabled(id_2Theta, FALSE); 112 } 113 //! Werte fuer Checkboxen 'Save on Ready' und 'Using Absorber' setzen 114 CheckDlgButton( GetHandle(), id_SaveOnReady, Areascan->bSaveOnReady ); 115 //! nur wenn absorber exist diesen ev. aktivieren 116 if (mlIsAxisValid(Absorber)) 117 CheckDlgButton( GetHandle(), id_AbsorberUsed, Areascan->ReportUse.bAbsorber ); 118 //! diverse Werte in Dialogbox setzen 119 CtrlSetDouble(id_MaxTime, Areascan->fMaxTime, _MAXTIMEDIGITS, _DECIMAL); 120 //! Fehler id_ThetaUnit existiert nicht 121 CtrlSetText(id_ThetaUnit, mlGetUnitName(nTheta)); 122 mlSetAxis( nOmega ); 123 CtrlSetText(id_Unit, mGetUnitName()); 124 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL); 125 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL); 126 CtrlSetLong(id_MaxCounts, Areascan->dwMaxCounts); 127 CheckDlgButton( GetHandle(), id_Standard, 128 Areascan->eSaveFormat == ffStandardFile ); 129 // CheckDlgButton( GetHandle(), id_DIB_Format, Areascan->eSaveFormat == Bitmap ); 130 CheckDlgButton( GetHandle(), id_SaveContinuous, Areascan->bSaveContinuous ); 131 //! FIX Fehler 38 132 CtrlSetDouble(id_AngleWidth, Areascan->dOmegaWidth, mlGetDigits(nOmega)+1, _DECIMAL); 133 CtrlSetText(id_Catalog, Areascan->szDataPath); 134 CtrlSetDouble(id_Relation, Areascan->dMoveRelation, _RELATIONDIGITS, _DECIMAL); 135 136 //! neu akk 137 //! einstellen der Art der Darstellungsaktualisierung 138 CheckDlgButton( GetHandle(), id_Final, !Areascan->bAccumulatedDisplay ); 139 CheckDlgButton( GetHandle(), id_Akkumulation, Areascan->bAccumulatedDisplay ); 140 141 //! aufnehmen aller verfuegbaren Detektoren in Combobox und vorauswahl des 142 //! aktuell eingestellten Det. 143 hDetectorList= GetDlgItem( GetHandle(), id_ChooseDetector ); 144 TDetectorManager::DetectorManager().FillDetectorComboBox( hDetectorList); 145 ComboBox_SelectString( hDetectorList, 0 , Areascan->GetDetector()->GetCharacteristic() ); 146 147 //! aufnehmen aller verfuegbaren Detektoren in Combobox 148 HWND hMonitorList= GetDlgItem( GetHandle(), id_ChooseMonitor ); 149 150 ComboBox_AddString( hMonitorList, szDlgMsgLine103 ); 151 TDetectorManager::DetectorManager().FillDetectorComboBox( hMonitorList); 152 153 if (Areascan->GetMonitor() != 0) 154 ComboBox_SelectString( hMonitorList, 0 , Areascan->GetMonitor()->GetCharacteristic() ); 155 else 156 ComboBox_SelectString( hMonitorList, 0 , szDlgMsgLine103 ); 157 158 //! bewirkt aufruf von Dlg_OnCommand mit den Kommandos cm_ParamSet und 159 //! cm_SetupParameters 160 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage ); 161 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, hwndCtl, 0, SendMessage ); 162 //! Focus auf OK-Button der Box 163 CtrlSetFocus( IDOK ); 164 165 // HotKey's für Hilfe 166 LoadHotKeys( LoadAccelerators(GetMainInstance(), MAKEINTRESOURCE(ACC_SetupAreaScanDlg)) ); // Accelerator aus Ressourcen laden 167 return TRUE; 168 }; 169 //***************************************************************************** 170 171 //! behandelt Kommandos in der Dialogbox 172 void TSetupAreaScanDlg::Dlg_OnCommand( HWND, int id, HWND hwndCtl, UINT codeNotify ) 173 { 174 //! abhaengig von Dialogelement bzw. Kommando 175 switch ( id ) 176 { 177 case cm_Help: 178 WinHelp(GetHandle(), GetHelpFile(), HELP_CONTEXT, Help_SetupAreaScanDlg); 179 break; 180 181 //! initialisierung 182 case cm_ParamSet: 183 OnParamSet(GetHandle()); 184 break; 185 186 //! 'Update Parameters'-Button betaetigt 187 case cm_SetupParameters: 188 FORWARD_WM_COMMAND( GetHandle(), cm_InquireRelevantData, hwndCtl, 0, SendMessage ); 189 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage ); 190 break; 191 192 //! uebernehmen von einigen Dialogeintraegen ohne pruefung (fehler) 193 //! 'Data Catalog','Save each Scan',Omegaschrittweite,Thetarelation, 194 //! Speicherformat 195 case cm_InquireRelevantData: 196 OnInquireRelevantData(); 197 break; 198 199 //! Detektor-auswahlbox angewaehlt 200 case id_ChooseDetector: 201 OnChooseDetector(GetHandle(), hwndCtl, codeNotify); 202 break; 203 204 case id_ChooseMonitor: 205 OnChooseMonitor(codeNotify); 206 break; 207 208 //! 'Detector Settings'-Button betaetigt 209 //! bewirkt Aufruf der zum eingestellten Detekt. gehoerigen Settingsbox 210 //! und uebernahme der akt. Einstellungen ohne pruefung 211 case cm_SpecificParameters: 212 // spezifische Parameter fuer einen Sensor setzen 213 if ( Areascan->GetDetector()->RunSpecificParametersDlg( Areascan->GetHandle() ) ) 214 FORWARD_WM_COMMAND( GetHandle( ), cm_ActivateChanges, 0, 0, PostMessage ); // Dialog in den Vordergrund verschieben 215 else 216 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, SendMessage ); // Parameter aktualisieren und anzeigen 217 break; 218 219 //! FIX Fehler 74 220 case id_FixThetaAxis: 221 OnFixThetaAxis(); 222 break; 223 224 //! anclicken der folgenden Dialogelemente bewirkt uebernahme der akt. 225 //! Einstellungen ohne pruefung 226 227 /*case id_DIB_Format: 228 case id_Standard: 229 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, PostMessage ); 230 break;*/ 231 232 //! neu akk 233 //! exclusives oder bei aktualisierungsoptionen 234 case id_Akkumulation: 235 CheckDlgButton(GetHandle(), id_Final, FALSE); 236 break; 237 238 case id_Final: 239 CheckDlgButton(GetHandle(), id_Akkumulation, FALSE); 240 break; 241 242 //! FIX Fehler 71 243 case id_SaveContinuous: 244 CheckDlgButton(GetHandle(), id_SaveOnReady, FALSE); 245 break; 246 247 case id_SaveOnReady: 248 CheckDlgButton(GetHandle(), id_SaveContinuous, FALSE); 249 break; 250 251 //! auswaehlen von absorberbenutz. nur eraubt wenn absorber exist. 252 case id_AbsorberUsed: 253 if (!mlIsAxisValid(Absorber)) 254 { 255 MessageBox(szDlgMsgLine003, szDlgFailure, MBINFO); 256 CtrlSetChecked(id_AbsorberUsed, FALSE); 257 } 258 break; 259 260 default: 261 TModalDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify ); 262 } 263 }; 264 //***************************************************************************** 265 266 void TSetupAreaScanDlg::OnParamSet(HWND) 267 { 268 CtrlSetEnabled(cm_SpecificParameters, Areascan->GetDetector()->HasSpecificParametersDlg() ); 269 270 //! abhaengig vom Scantyp einige Dialogelemente sperren bzw. freigeben 271 switch ( Areascan->eScanType ) 272 { 273 case stOmega2ThetaScan: 274 CtrlSetEnabled(id_Relation, TRUE ); 275 //! abhaengig ob PSD verfuegbar oder nicht Dialogelemente sperren 276 //! bzw. freigeben 277 //! FIX Fehler 53 278 CheckDlgButton( GetHandle(), id_FixThetaAxis, FALSE ); 279 if ( Areascan->GetPsd() != 0 ) 280 { 281 //! FIX Fehler 59 282 CtrlSetEnabled(id_MaxCounts, FALSE); 283 //! FIX Fehler 55 284 CtrlSetEnabled(id_AbsorberUsed, TRUE ); 285 CtrlSetEnabled(id_FixThetaAxis, TRUE ); 286 CtrlSetEnabled(id_ThetaWidth, FALSE ); 287 CtrlSetEnabled(id_ThetaWindow, FALSE ); 288 Areascan->nAddedChannels= Areascan->GetPsd()->GetAddedChannels(); 289 CtrlSetDouble(id_ThetaWidth, Areascan->GetPsd()->GetWidth(), Areascan->GetPsd()->GetAngleStepDigits(), _DECIMAL); // 17.06.2003 hier wurde eine Nachkommastellengenauigkeit von 3 verwendet 290 //! neu akk 291 //! bei psd Darstellungsaktualisierungmodus erlaubt 292 CtrlSetEnabled(id_Akkumulation, TRUE ); 293 CtrlSetEnabled(id_Final, TRUE ); 294 295 } 296 else 297 { 298 //! FIX Fehler 59 299 CtrlSetEnabled(id_MaxCounts, TRUE); 300 //! FIX Fehler 55 301 CtrlSetEnabled(id_AbsorberUsed, FALSE); 302 CheckDlgButton(GetHandle(), id_AbsorberUsed, FALSE); 303 //! FIX Fehler 53 304 CtrlSetEnabled(id_FixThetaAxis, FALSE ); 305 CtrlSetEnabled(id_ThetaWindow, TRUE ); 306 CtrlSetEnabled(id_ThetaWidth, TRUE ); 307 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL); 308 CtrlSetDouble(id_ThetaWidth, Areascan->dThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL); 309 //! neu akk 310 //! bei 0-dim. detektor Darstellungsaktualisierungmodus nicht 311 //! erlaubt 312 CtrlSetEnabled(id_Akkumulation, FALSE ); 313 CtrlSetEnabled(id_Final, FALSE ); 314 CheckDlgButton( GetHandle(), id_Akkumulation , FALSE); 315 CheckDlgButton( GetHandle(), id_Final , TRUE); 316 } 317 break; 318 319 case stStandardScan: 320 //! FIX Fehler 59 321 CtrlSetEnabled(id_MaxCounts, FALSE); 322 //! FIX Fehler 55 323 CtrlSetEnabled(id_AbsorberUsed, TRUE ); 324 CheckDlgButton( GetHandle(), id_FixThetaAxis, TRUE ); 325 CtrlSetEnabled(id_FixThetaAxis, TRUE ); 326 CtrlSetEnabled(id_ThetaWindow, FALSE ); 327 CtrlSetEnabled(id_ThetaWidth, FALSE ); 328 CtrlSetEnabled(id_Relation, FALSE ); 329 330 Areascan->nAddedChannels= Areascan->GetPsd()->GetAddedChannels(); 331 CtrlSetDouble(id_ThetaWidth, Areascan->GetPsd()->GetWidth(), Areascan->GetPsd()->GetAngleStepDigits(), _DECIMAL); 332 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL); 333 //! neu akk 334 //! bei psd Darstellungsaktualisierungmodus erlaubt 335 CtrlSetEnabled(id_Akkumulation, TRUE ); 336 CtrlSetEnabled(id_Final, TRUE ); 337 break; 338 339 default: 340 MessageBox( szDlgMsgLine001, szDlgFailure, MBSTOP ); 341 break; 342 } 343 }; 344 //***************************************************************************** 345 346 void TSetupAreaScanDlg::OnInquireRelevantData() 347 { 348 BOOL bValid= TRUE; 349 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString); 350 Areascan->bSaveContinuous= IsDlgButtonChecked( GetHandle(), 351 id_SaveContinuous ); 352 // Bestimmen der Schrittweite und Schrittrelation 353 Areascan->dOmegaWidth= CtrlGetDouble(id_AngleWidth, mlGetDigits(nOmega)+1, _DECIMAL, bValid); 354 Areascan->dMoveRelation= CtrlGetDouble(id_Relation, _RELATIONDIGITS, _DECIMAL, bValid); 355 //! uebernahme von Scantyp und abhaengig davon weitere werte 356 switch ( Areascan->eScanType ) 357 { 358 case stOmega2ThetaScan: 359 if ( Areascan->GetPsd() != 0) 360 { 361 if ( IsDlgButtonChecked( GetHandle(), id_FixThetaAxis ) ) 362 { 363 Areascan->eScanType= stStandardScan; 364 break; 365 } 366 CtrlSetDouble(id_ThetaWidth, Areascan->dMoveRelation * Areascan->dOmegaWidth, mlGetDigits(nTheta)+1, _DECIMAL); 367 } 368 else 369 { 370 Areascan->dThetaWindow= CtrlGetDouble(id_ThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL, bValid); 371 Areascan->dThetaWidth= CtrlGetDouble(id_ThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL, bValid); 372 } 373 break; 374 375 case stStandardScan: 376 if ( !IsDlgButtonChecked( GetHandle(), id_FixThetaAxis ) ) 377 { 378 Areascan->eScanType= stOmega2ThetaScan; 379 if ( Areascan->GetPsd() != 0) 380 { 381 CtrlSetDouble(id_ThetaWidth, Areascan->dMoveRelation * Areascan->dOmegaWidth, mlGetDigits(nTheta)+1, _DECIMAL); 382 } 383 } 384 break; 385 386 default: 387 MessageBox( szDlgMsgLine001, szDlgFailure, MBSTOP ); 388 } 389 Areascan->eSaveFormat= ffStandardFile; 390 //! if ( IsDlgButtonChecked( GetHandle(), id_DIB_Format ) ) 391 //! Areascan->eSaveFormat= Bitmap; 392 //! if ( IsDlgButtonChecked( GetHandle(), id_Standard ) ) 393 //! Areascan->eSaveFormat= StandardFile; 394 }; 395 //***************************************************************************** 396 397 void TSetupAreaScanDlg::OnChooseDetector(HWND, HWND hwndCtl, UINT codeNotify ) 398 { 399 if ( codeNotify == CBN_SELCHANGE ) 400 { 401 //! wenn neuer det. ausgewaehlt, dann diesen als aktuellen Det. 402 //! setzen und neuinitialisierung (cm_ParamSet) 403 int idx= ComboBox_GetCurSel( hDetectorList ); 404 405 if (idx == CB_ERR) 406 return; 407 408 TDetector* newDetector= TDetectorManager::DetectorManager().GetDetector(idx); 409 410 if ( Areascan->GetDetector() != newDetector ) 411 { 412 Areascan->SetDetector(newDetector); 413 //! FIX Fehler 74 414 if (Areascan->GetPsd() != 0) 415 { 416 Areascan->eScanType= stStandardScan; 417 } 418 else 419 { 420 if (mlIsAxisValid(Theta) == FALSE) 421 { 422 Areascan->SetDetector( TDetectorManager::DetectorManager().GetDetector( 0, 1) ); 423 ComboBox_SelectString( hDetectorList, 0, Areascan->GetDetector()->GetCharacteristic() ); 424 } 425 else 426 { 427 Areascan->eScanType= stOmega2ThetaScan; 428 } 429 } 430 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, PostMessage ); 431 } 432 } 433 }; 434 //***************************************************************************** 435 436 void TSetupAreaScanDlg::OnFixThetaAxis() 437 { 438 if (!mlIsAxisValid(Theta)) 439 CheckDlgButton(GetHandle(), id_FixThetaAxis, TRUE); 440 441 //! 2thetawert bei fixierter Thetaachse vorgeben wenn Theta exist. 442 if (IsDlgButtonChecked( GetHandle(), id_FixThetaAxis )) 443 { 444 if (mlIsAxisValid(Theta)) 445 { 446 double dPos; 447 mlGetDistance(nTheta, dPos); 448 CtrlSetDouble(id_2Theta, dPos, mlGetDigits(nTheta), _DECIMAL); 449 } 450 else 451 CtrlSetText(id_2Theta, " "); 452 } 453 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, PostMessage ); 454 }; 455 //***************************************************************************** 456 457 void TSetupAreaScanDlg::OnChooseMonitor(UINT codeNotify ) 458 { 459 if ( codeNotify == CBN_SELCHANGE ) 460 { 461 int idx= ComboBox_GetCurSel( GetDlgItem( GetHandle(), id_ChooseMonitor ) ); 462 463 if (idx == CB_ERR) 464 return; 465 466 // Ersten Eintrag "Kein Monitor" beruecksichtigen 467 if (idx == 0) 468 { 469 Areascan->SetMonitor(0); 470 return; 471 } 472 idx--; 473 474 TDetector* newMonitor= TDetectorManager::DetectorManager().GetDetector( idx ); 475 if ( Areascan->GetDetector() != newMonitor ) 476 Areascan->SetMonitor(newMonitor); 477 } 478 }; 479 //***************************************************************************** 480 481 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen der 482 //! Dialogbox (durch OK-Button) 483 //! Rueckkehrcode false wenn die Dialogbox nicht geschlossen werden kann (werte 484 //! inkonsistent) sonst true 485 BOOL TSetupAreaScanDlg::CanClose( void ) 486 { 487 char buf[ MaxString ]; 488 BOOL bValid= TRUE; 489 float valueF; 490 long valueL; 491 BOOL bFailure= FALSE; 492 //! lokale Wert fuer o-t-offset 493 double dTO= dThetaOffset, dOO= dOmegaOffset; 494 495 //! uebernehmen von einigen werten ohne pruefung 496 FORWARD_WM_COMMAND( GetHandle(), cm_SetupParameters, 0, 0, SendMessage ); 497 //! uebernahme der CheckButtons 'Save on Ready' und 'Using Absorber' 498 Areascan->bSaveOnReady= IsDlgButtonChecked( GetHandle(), id_SaveOnReady ); 499 Areascan->ReportUse.bAbsorber= IsDlgButtonChecked( GetHandle(), id_AbsorberUsed ); 500 //! o-t-offset verwenden bzw. nicht verwenden 501 switch (Areascan->eScanType) 502 { 503 case stStandardScan: 504 dTO= 0.0; 505 break; 506 507 case stOmega2ThetaScan: 508 dTO= dOO= 0.0; 509 break; 510 } 511 //! Psd-spezifische parameter 512 if (Areascan->GetPsd() != 0) 513 { 514 //! neu akk 515 //! art der darstellungsaktualisierung an Scanfenster uebergeben 516 Areascan->bAccumulatedDisplay= IsDlgButtonChecked( GetHandle(), id_Akkumulation ); 517 } 518 519 //! uebernahme des Omega-Maximum mit Pruefung, ob der Wert kleiner als der 520 //! maximal erlaubte 521 //! wenn Wert nicht kleiner als der max. erlaubte dann auf 522 //! Max.Wert-Schrittweite setzen + Setzen des korrekten Wertes fuer 523 //! Theta-Window? (Fehler) + Box wird nicht verlassen 524 valueF= CtrlGetDouble(id_AngleMax, mlGetDigits(nOmega), _DECIMAL, bValid); 525 //! FIX Fehler 50,52 526 if (!bValid) bFailure= TRUE; 527 else if ( (valueF + dOO < mlGetValue( nOmega, MaxDistanceRel )) && 528 (valueF + dOO > mlGetValue( nOmega, MinDistanceRel ))) 529 Areascan->dOmegaMax= valueF; 530 else 531 { 532 Areascan->dOmegaMax= ( mlGetValue( nOmega, MaxDistanceRel ) - 533 mlGetValue( nOmega, MinWidth ) ); 534 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL); 535 MessageBox(szDlgMsgLine005, szDlgMessage, MBINFO); 536 CtrlSetFocus(id_AngleMax); 537 bFailure= TRUE; 538 } 539 540 //! uebernahme des Omega-Minimum mit Pruefung, ob der Wert groesser als der 541 //! maximal erlaubte 542 //! wenn Wert nicht groesser als der max. erlaubte dann auf 543 //! Min.Wert+Schrittweite setzen + Setzen des korrekten Wertes fuer 544 //! Minimum + Box wird nicht verlassen 545 valueF= CtrlGetDouble(id_AngleMin, mlGetDigits(nOmega), _DECIMAL, bValid); 546 //! FIX Fehler 50 547 if (!bValid) bFailure= TRUE; 548 else if ( (valueF + dOO < mlGetValue( nOmega, MaxDistanceRel )) && 549 ( valueF + dOO > mlGetValue( nOmega, MinDistanceRel ) )) 550 Areascan->dOmegaMin= valueF; 551 else 552 { 553 Areascan->dOmegaMin= ( mlGetValue( nOmega, MinDistanceRel ) + 554 mlGetValue( nOmega, MinWidth ) ); 555 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL); 556 MessageBox(szDlgMsgLine005, szDlgMessage, MBINFO); 557 CtrlSetFocus(id_AngleMin); 558 bFailure= TRUE; 559 } 560 //! FIX Fehler 50,52 561 if (Areascan->dOmegaMin >= Areascan->dOmegaMax) 562 { 563 valueF= Areascan->dOmegaMax; 564 Areascan->dOmegaMax= Areascan->dOmegaMin; 565 CtrlSetDouble(id_AngleMax, Areascan->dOmegaMax, mlGetDigits(nOmega), _DECIMAL); 566 Areascan->dOmegaMin= valueF; 567 CtrlSetDouble(id_AngleMin, Areascan->dOmegaMin, mlGetDigits(nOmega), _DECIMAL); 568 CtrlSetFocus(id_AngleMin); 569 bFailure= TRUE; 570 } 571 572 //! 2theta aus Dialogbox wird fuer bereichsuebrschreitungstests gebraucht 573 d2ThetaStart= CtrlGetDouble(id_2Theta, mlGetDigits(nTheta), _DECIMAL, bValid); 574 if (!bValid) bFailure= TRUE; 575 //!FIX Fehler 60 576 switch (Areascan->eScanType) 577 { 578 case stOmega2ThetaScan: 579 //! Relation ermitteln 580 valueF= CtrlGetDouble(id_Relation, _RELATIONDIGITS, _DECIMAL, bValid); 581 if (!bValid) bFailure= TRUE; 582 else if ( valueF>0 ) 583 Areascan->dMoveRelation= valueF; 584 else { 585 Areascan->dMoveRelation= 2; 586 CtrlSetDouble(id_Relation, Areascan->dMoveRelation, _RELATIONDIGITS, _DECIMAL); 587 MessageBeep(0); 588 CtrlSetFocus(id_Relation); 589 bFailure= TRUE; 590 } 591 592 if ( Areascan->GetPsd() == 0 ) 593 { 594 //! uebernahme des Theta-Window mit Pruefung, ob der 595 //! Wert groesser 0 wenn nicht, setzen auf 596 //! (OmegaMax-OmegaMin)*Relation + eintragen des 597 //! entsprechenden Wertes in Dlg.Box + Box wird nicht 598 //! verlassen 599 valueF= CtrlGetDouble(id_ThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL, bValid); 600 //! FIX Fehler 50 601 if (!bValid) bFailure= TRUE; 602 else if ( valueF>0 ) 603 Areascan->dThetaWindow= valueF; 604 else 605 { 606 Areascan->dThetaWindow= ( Areascan->dOmegaMax - Areascan->dOmegaMin ) * 607 Areascan->dMoveRelation; 608 CtrlSetDouble(id_ThetaWindow, Areascan->dThetaWindow, mlGetDigits(nTheta)+1, _DECIMAL); 609 MessageBeep(0); 610 CtrlSetFocus(id_ThetaWindow); 611 bFailure= TRUE; 612 } 613 614 //! uebernahme der Theta-Schrittweite mit Pruefung, ob der Wert ungleich 0 615 //! (Fehler) wenn nicht, setzen auf OmegaSchrittweite*Relation + eintragen 616 //! des entsprechenden Wertes in Dlg.Box + Box wird nicht verlassen 617 valueF= CtrlGetDouble(id_ThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL, bValid); 618 //! FIX Fehler 50 619 if (!bValid) bFailure= TRUE; 620 else if ( valueF>0 ) 621 Areascan->dThetaWidth= valueF; 622 else 623 { 624 Areascan->dThetaWidth= Areascan->dOmegaWidth * Areascan->dMoveRelation; 625 CtrlSetDouble(id_ThetaWidth, Areascan->dThetaWidth, mlGetDigits(nTheta)+1, _DECIMAL); 626 MessageBeep(0); 627 CtrlSetFocus(id_ThetaWidth); 628 bFailure= TRUE; 629 } 630 631 //! uebernahme der Messimpulse mit Pruefung, ob der Wert ungleich 0 (Fehler) 632 //! wenn nicht, wird Box wird nicht verlassen 633 valueL= CtrlGetLong(id_MaxCounts, bValid); 634 //! FIX Fehler 50 635 if (!bValid) bFailure= TRUE; 636 else if ( valueL>0 ) 637 Areascan->dwMaxCounts= valueL; 638 else { 639 Areascan->dwMaxCounts= 1; 640 CtrlSetLong(id_MaxCounts, Areascan->dwMaxCounts); 641 MessageBeep(0); 642 CtrlSetFocus(id_MaxCounts); 643 bFailure= TRUE; 644 } 645 646 Areascan->ReportUse.bTime= FALSE; 647 Areascan->ReportUse.bIntegral= FALSE; 648 //! test ob Thetabereichsueberschreitung bei sld 649 if (!bFailure) 650 { 651 valueF= d2ThetaStart - 0.5*Areascan->dThetaWindow; 652 if ( ((valueF + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) && 653 ((valueF + dTO) >= mlGetValue(nTheta, MinDistanceRel)) ) 654 { 655 Areascan->dThetaMin= valueF; 656 //! Thetawinkel fuer letzten punkt des letzten spektrums 657 //! ermitteln + test ob dieser wert gueltig 658 valueF= d2ThetaStart + (Areascan->dOmegaMax - Areascan->dOmegaMin) * 659 Areascan->dMoveRelation + 0.5 * Areascan->dThetaWindow; 660 661 if ( valueF + dTO <= mlGetValue(nTheta, MaxDistanceRel) ) 662 Areascan->d2ThetaStart= d2ThetaStart; 663 else 664 { 665 char buf2[_MAXLENDOUBLE]; 666 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL); 667 sprintf(buf, szDlgMsgLine007, buf2); 668 MessageBox(buf, szDlgMessage, MBINFO); 669 CtrlSetFocus(id_Relation); 670 bFailure= TRUE; 671 } 672 } 673 else 674 { 675 char buf2[_MAXLENDOUBLE]; 676 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL); 677 sprintf(buf, szDlgMsgLine006, buf2); 678 MessageBox(buf, szDlgMessage, MBINFO); 679 CtrlSetFocus(id_2Theta); 680 bFailure= TRUE; 681 } 682 683 } 684 } 685 else //! O2T-Scan mit Psd 686 { 687 //! test Thetabereichsueberschreitung O2T mit Psd 688 if (!bFailure) 689 { 690 if ( ((d2ThetaStart + dTO) >= mlGetValue(nTheta, MinDistanceRel)) && 691 ((d2ThetaStart + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) ) 692 { 693 Areascan->d2ThetaStart= d2ThetaStart; 694 //! ermitteln des Thetawinkel fuer letztes Spektrum + test ob 695 //! Bereichsueberschreitung 696 valueF= d2ThetaStart + (Areascan->dOmegaMax - Areascan->dOmegaMin) * 697 Areascan->dMoveRelation; 698 if ( ((valueF + dTO) >= mlGetValue(nTheta, MinDistanceRel)) && 699 ((valueF + dTO) <= mlGetValue(nTheta, MaxDistanceRel)) ) 700 { 701 Areascan->dThetaMax= valueF; Areascan->dThetaMin= d2ThetaStart; 702 } 703 else 704 { 705 char buf2[_MAXLENDOUBLE]; 706 Double2String(buf2, valueF, mlGetDigits(nTheta), FALSE, _DECIMAL); 707 sprintf(buf, szDlgMsgLine007, buf2); 708 MessageBox(buf, szDlgMessage, MBINFO); 709 CtrlSetFocus(id_Relation); 710 bFailure= TRUE; 711 } 712 } 713 else 714 { 715 char buf2[_MAXLENDOUBLE]; 716 Double2String(buf2, d2ThetaStart, mlGetDigits(nTheta), FALSE, _DECIMAL); 717 sprintf(buf, szDlgMsgLine006, buf2); 718 MessageBox(buf, szDlgMessage, MBINFO); 719 CtrlSetFocus(id_2Theta); 720 bFailure= TRUE; 721 } 722 723 } 724 //! bei Psd diese infos immer anlegen 725 Areascan->ReportUse.bTime= TRUE; 726 Areascan->ReportUse.bIntegral= TRUE; 727 728 } 729 break; 730 731 case stStandardScan: //! bei Psd diese infos immer anlegen 732 Areascan->ReportUse.bTime= TRUE; 733 Areascan->ReportUse.bIntegral= TRUE; 734 735 //! test Thetabereichsueberschreitung StandardScan 736 if (!bFailure) 737 //! test ob Theta exist. wenn ja wert testen+ ev.uebernehmen 738 //! sonst nicht 739 if ( mlIsAxisValid(Theta) ) 740 if ( (d2ThetaStart >=mlGetValue(nTheta, MinDistanceRel)) && 741 (d2ThetaStart <=mlGetValue(nTheta, MaxDistanceRel)) ) 742 { 743 Areascan->dThetaMin= d2ThetaStart; 744 Areascan->dThetaMax= d2ThetaStart; 745 Areascan->d2ThetaStart= d2ThetaStart; 746 } 747 else 748 { 749 char buf2[_MAXLENDOUBLE]; 750 Double2String(buf2, d2ThetaStart, mlGetDigits(nTheta), FALSE, _DECIMAL); 751 sprintf(buf, szDlgMsgLine006, buf2); 752 MessageBox(buf, szDlgMessage, MBINFO); 753 CtrlSetFocus(id_2Theta); 754 bFailure= TRUE; 755 } 756 break; 757 } 758 //! wenn bis hier schon Fehlern aufgetretenen sind: cm_ParamSet senden und Dialogbox nicht schliessen 759 if ( bFailure ) 760 { 761 PostMessage( GetHandle(), WM_COMMAND, ( WPARAM ) cm_ParamSet, 0l ); 762 return FALSE; 763 } 764 765 //! uebernahme der Messzeit mit Pruefung, ob der Wert ungleich 0 766 //! wenn nicht, wird Box wird nicht verlassen 767 valueF= CtrlGetDouble(id_MaxTime, _MAXTIMEDIGITS, _DECIMAL, bValid); 768 //! FIX Fehler 50 769 if (!bValid) bFailure= TRUE; 770 else if ( valueF>0.0 ) 771 Areascan->fMaxTime= valueF; 772 else { 773 Areascan->fMaxTime= 0.1f; 774 CtrlSetDouble(id_MaxTime, Areascan->fMaxTime, _MAXTIMEDIGITS, _DECIMAL); 775 MessageBeep(0); 776 CtrlSetFocus(id_MaxTime); 777 bFailure= TRUE; 778 } 779 780 //! uebernahme des Datenpfades, wenn er sich beschreiben laesst 781 //! ansonsten auf "C:\\" setzen + Box wird nicht verlassen 782 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString); 783 if ( !PathCanWrite(Areascan->szDataPath) ) { 784 strcpy( Areascan->szDataPath, "c:\\" ); 785 //! FIX Fehler 38 786 CtrlSetText(id_Catalog, Areascan->szDataPath); 787 CtrlSetFocus(id_Catalog); 788 MessageBeep(0); 789 bFailure= TRUE; 790 } 791 792 //! FIX Fehler 38,51 793 valueF= CtrlGetDouble(id_AngleWidth, mlGetDigits(nOmega)+1, _DECIMAL, bValid); 794 if (!bValid) bFailure= TRUE; 795 else if ( valueF>=mGetValue(MinWidth) ) 796 Areascan->dOmegaWidth= valueF; 797 else 798 { 799 Areascan->dOmegaWidth= mGetValue(MinWidth); 800 CtrlSetDouble(id_AngleWidth, Areascan->dOmegaWidth, mlGetDigits(nOmega)+1, _DECIMAL); 801 MessageBeep(0); 802 CtrlSetFocus(id_AngleWidth); 803 bFailure= TRUE; 804 } 805 806 //! wenn bisher keine fehler auftraten diverse werte an Areasanfenster 807 //! uebergeben 808 if ( !bFailure) 809 { 810 //! Offsetwerte uebernehmen 811 Areascan->dOffsetOmega= dOO; 812 Areascan->dOffsetTheta= dTO; 813 Areascan->dPsdOffset= 0; 814 Areascan->nMeasurementChannel= 0; 815 //! gewollte zusatzinfos 816 Areascan->ReportUse.bAbsorber= IsDlgButtonChecked( GetHandle(), id_AbsorberUsed ); 817 } 818 819 //! bei aufgetretenen Fehlern cm_ParamSet senden und Dialogbox nicht 820 //! schliessen 821 if ( bFailure ) 822 { 823 PostMessage( GetHandle(), WM_COMMAND, ( WPARAM ) cm_ParamSet, 0l ); 824 return FALSE; 825 } 826 827 return TRUE; 828 }; 829 830 //############################################################################# 831 // TAquisitionDlg 832 //############################################################################# 833 834 TAquisitionDlg::TAquisitionDlg( TAreaScanWindow *aScan ) : TModalDlg( "AQUISITION", GetMainInstance() ) 835 { 836 Areascan= aScan; 837 Areascan->bAquisitionActive= FALSE; 838 }; 839 //***************************************************************************** 840 841 //! eintragen von Defaultwerten fuer alle Elemente bei Aufruf der Dlg.Box 842 //! rueckkehrcode immer true 843 BOOL TAquisitionDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM lParam ) 844 { 845 //! Anzahl der Messpunkte 846 CtrlSetLong(id_LinePoints, Areascan->nLinePoints); 847 //! Umgebung 848 CtrlSetLong( id_AddedPoints, Areascan->nEnvironment ); 849 CtrlSetText( id_FileName, Areascan->DataFile ); 850 //! ? 851 CheckDlgButton( GetHandle(), id_DX, Areascan->bSetDXZero ); 852 CheckDlgButton( GetHandle(), id_DY, Areascan->bSetDYZero ); 853 CheckDlgButton( GetHandle(), id_RL, Areascan->bSetRLSave ); 854 //! Focus auf OK-Button der Box 855 CtrlSetFocus( IDOK ); 856 return TRUE; 857 }; 858 //***************************************************************************** 859 860 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor Verlassen der 861 //! Dialogbox (durch OK-Button) 862 //! Rueckkehrcode false wenn die Dialogbox nicht geschlossen werden kann (werte 863 //! inkonsistent) sonst true 864 BOOL TAquisitionDlg::CanClose( void ) 865 { 866 int value; 867 OFSTRUCT of; 868 int hFile; 869 BOOL bValid= TRUE; 870 871 //! Werte der CheckBoxen uebernehmen wenn nicht beide markiert, sonst 'dX=0' 872 //! auf unmarkiert setzen, CheckButtons neu setzen und Box nicht verlassen 873 Areascan->bSetDXZero= IsDlgButtonChecked( GetHandle(), id_DX ); 874 Areascan->bSetDYZero= IsDlgButtonChecked( GetHandle(), id_DY ); 875 Areascan->bSetRLSave= IsDlgButtonChecked( GetHandle(), id_RL ); 876 if ( Areascan->bSetDXZero * Areascan->bSetDYZero ) 877 { 878 Areascan->bSetDXZero= !Areascan->bSetDYZero; 879 CheckDlgButton( GetHandle(), id_DX, Areascan->bSetDXZero ); 880 CheckDlgButton( GetHandle(), id_DY, Areascan->bSetDYZero ); 881 return FALSE; 882 } 883 //! uebernehmen der 'Umgebung', wenn Wert im Bereich von 0 bis 3 liegt, sonst 884 //! Wert auf entsprechende Grenze setzen + Wert in Box eintragen + Box nicht 885 //! verlassen 886 value= CtrlGetLong( id_AddedPoints, bValid ); 887 Areascan->nEnvironment= max( 0, min( 3, value ) ); 888 if (!bValid) return FALSE; 889 else if ( value!=Areascan->nEnvironment ) 890 { 891 CtrlSetLong( id_AddedPoints, Areascan->nEnvironment ); 892 MessageBeep(0); 893 CtrlSetFocus(id_AddedPoints); 894 return FALSE; 895 } 896 //! uebernehmen der 'Messpunkte', wenn Wert im Bereich von 0 bis 1100 liegt, 897 //! sonst Wert auf entsprechende Grenze setzen + Wert in Box eintragen + Box 898 //! nicht verlassen 899 value= CtrlGetLong( id_LinePoints, bValid ); 900 Areascan->nLinePoints= max( 0, min( 1100, value ) ); 901 if (!bValid) return FALSE; 902 else if ( value!=Areascan->nLinePoints ) 903 { 904 CtrlSetLong( id_LinePoints, Areascan->nLinePoints ); 905 MessageBeep(0); 906 CtrlSetFocus(id_LinePoints); 907 return FALSE; 908 } 909 //! Test, ob angeg. Datei bereits existiert + evtl. Fehlermeldung 910 //! anlegen der Datei 911 CtrlGetText( id_FileName, Areascan->DataFile, MaxString ); 912 // Testen, ob sich das File auch erzeugen laesst 913 if ( OpenFile( Areascan->DataFile, &of, OF_EXIST )!=HFILE_ERROR ) 914 { 915 if ( IDYES == MessageBox( szDlgMsgLine100, szDlgMessage, MBASK ) ) 916 goto Exit; 917 else 918 return FALSE; 919 } 920 921 //! Fehlermeldung bei Problemen beim Anlegen der Datei 922 hFile= OpenFile( Areascan->DataFile, &of, OF_CREATE ); 923 if ( hFile == HFILE_ERROR ) 924 { 925 MessageBox( szDlgMsgLine101, szDlgMessage, MBINFO ); 926 return FALSE; 927 } 928 else 929 _lclose(hFile); 930 //! remove( DataFile ); 931 932 //! wenn alles erfolgreich Marke setzen + Info + DataAquisiton auf true 933 //!setzen 934 Exit: 935 Areascan->bAquisitionActive= TRUE; 936 SetInfo( szDlgMsgLine102 ); 937 938 return TRUE; 939 }; 940 941 //############################################################################## 942 // TChooseScanDlg 943 //############################################################################## 944 945 TChooseScanDlg::TChooseScanDlg( TAreaScanWindow *aScan, TModelessDlg **aRef ) : TModelessDlg( "CHOOSESCAN", aRef, GetMainInstance() ), InfoField(0, 0), Report(0), Report2(0), BarHandle(0), hInfoList(0) 946 { 947 Areascan= aScan; 948 Report= Areascan->ScanReport; 949 Report2= Areascan->ScanReport2; 950 nMaxScan= nInfoNumber= 0; 951 }; 952 //***************************************************************************** 953 954 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box 955 //! Rueckkehrcode immer true 956 BOOL TChooseScanDlg::Dlg_OnInit( HWND, HWND hwndCtl, LPARAM ) 957 { 958 SCROLLINFO scrInfo; 959 scrInfo.cbSize= sizeof(SCROLLINFO); 960 scrInfo.fMask= SIF_RANGE; 961 //! 1.zusatzinfo auf Detektortyp setzen 962 nInfoNumber= 0; 963 //! anzahl der Kurven eintragen + Scrollbar initialisieren 964 nMaxScan= lpDBase->GetCNumber() - 1; 965 CtrlSetLong(id_Limit, nMaxScan); 966 BarHandle= GetDlgItem( GetHandle(), id_Bar ); 967 968 scrInfo.nMin= 0; 969 scrInfo.nMax= nMaxScan; 970 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE); 971 972 //! alle zur datenbasis verfuegbaren Infos in combobox eintragen 973 hInfoList= GetDlgItem( GetHandle() , id_ChooseInfo ); 974 ComboBox_AddString( hInfoList , szInfoType0 ); 975 InfoField.Append(0); 976 if (Areascan->ReportUse.bIntegral == TRUE) 977 { 978 ComboBox_AddString( hInfoList , szInfoType1 ); 979 InfoField.Append(1); 980 } 981 if (Areascan->ReportUse.bAbsorber == TRUE) 982 { 983 ComboBox_AddString( hInfoList , szInfoType2 ); 984 InfoField.Append(2); 985 } 986 if (Areascan->ReportUse.bMonitor == TRUE) 987 { 988 ComboBox_AddString( hInfoList , szInfoType3); 989 InfoField.Append(3); 990 } 991 if (Areascan->ReportUse.bTime == TRUE) 992 { 993 ComboBox_AddString( hInfoList , szInfoType4 ); 994 InfoField.Append(4); 995 } 996 ComboBox_SelectString( hInfoList, 0 , szInfoType0 ); 997 998 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage ); 999 //! Focus auf OK-Button der Box 1000 CtrlSetFocus( IDOK ); 1001 return TRUE; 1002 }; 1003 //***************************************************************************** 1004 1005 //! behandelt Kommandos in der Dialogbox 1006 void TChooseScanDlg::Dlg_OnCommand( HWND, int id, HWND hwndCtl, 1007 UINT codeNotify ) 1008 { 1009 BOOL bValid= TRUE; 1010 char buf[ MaxString ]; 1011 float x, y, fIntegral, fPeakPos, fMonitor, fAbsorber, fTime, fdummy; 1012 1013 SCROLLINFO scrInfo; 1014 scrInfo.cbSize= sizeof(SCROLLINFO); 1015 scrInfo.fMask= SIF_POS; 1016 1017 switch ( id ) 1018 { 1019 //! Update-Button gedrueckt 1020 case id_CurveShow: 1021 //! Scannummer aus Dialogbox holen + diese Darstellen 1022 lpDBase->SetCurveIdx( CtrlGetLong(id_ScanNumber, bValid) ); 1023 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage ); 1024 break; 1025 1026 //! aktualisieren 1027 case cm_ParamSet: { 1028 //! aktuelle Kurve in Maincurve + Dialogboxeintraege eintragen + 1029 //! Fenster neuzeichnen 1030 Areascan->nActiveScan= lpDBase->GetCurveIdx(); 1031 Areascan->MainCurve= lpDBase->GetCurve( Areascan->nActiveScan ); 1032 CtrlSetLong(id_ScanNumber, Areascan->nActiveScan); 1033 scrInfo.nPos= nMaxScan - Areascan->nActiveScan; 1034 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE); 1035 Report->SetPP( Areascan->nActiveScan ); 1036 Report->PGet( x, y, fIntegral ); 1037 Report2->SetPP( Areascan->nActiveScan ); 1038 Report2->PGet( fTime, fMonitor, fAbsorber); 1039 //! FIX Fehler 42 1040 CtrlSetDouble(id_Omega, x, 3, _DECIMAL); 1041 TCurve *Curve= Areascan->MainCurve; 1042 CtrlSetDouble(id_PeakIntensity, Curve->GetMax( 1 ), 1, _DECIMAL); 1043 1044 //! je nach ausgewähltem Combobox-eintrag den zugehörigen Infowert eintragen 1045 Curve->GetGravityCenter(fPeakPos, fdummy, fdummy); 1046 if (Areascan->VisualDB.bPsd) 1047 fPeakPos= y + fPeakPos; 1048 CtrlSetDouble(id_PeakPosition, fPeakPos, 3, _DECIMAL); 1049 switch (nInfoNumber) 1050 { 1051 case 0: 1052 if (Areascan->VisualDB.bPsd) 1053 sprintf( buf, "Psd"); 1054 else 1055 sprintf( buf, "0-dim."); 1056 break; 1057 1058 case 1: 1059 sprintf( buf, "%.1f", fIntegral); //! integrale Intens. 1060 break; 1061 1062 case 2: 1063 sprintf( buf, "%.3f", fAbsorber); //! Absorber 1064 break; 1065 1066 case 3: 1067 sprintf( buf, "%.1f", fMonitor); //! Monitor 1068 break; 1069 1070 case 4: 1071 sprintf( buf, "%.3f", fTime); //! Zeit 1072 break; 1073 1074 default: 1075 sprintf( buf, "????"); 1076 }; 1077 CtrlSetText(id_Info, buf); 1078 1079 //! Kurve im Hintergrund neu zeichnen 1080 Areascan->UpdateWnd(); 1081 break; 1082 } 1083 1084 case id_ChooseInfo: //! auswaehlen einer anderen Zusatzinfo 1085 if ( codeNotify==CBN_SELCHANGE ) { //! wenn neue info ausgewaehlt, dann diesen ins nachbarfeld(in cm_ParamSet 1086 nInfoNumber= InfoField[ ComboBox_GetCurSel(hInfoList) ]; 1087 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, hwndCtl, 0, SendMessage ); 1088 }; 1089 break; //Fehler? Kullmann+Reinecker: Fehlt hier vielleicht ein break? 1090 1091 //! behandelt OK und Abbruch 1092 default: 1093 TModelessDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify ); 1094 } 1095 }; 1096 //***************************************************************************** 1097 1098 //! wird aufgerufen, wenn in der Dialogbox die linke Maustaste nach Druecken 1099 //! wieder losgelassen wird (sinnvoll wenn Dialogbox waehrend eines Areascans 1100 //! aktiv ist) 1101 void TChooseScanDlg::Dlg_OnLButtonUp( HWND, int, int, UINT ) 1102 { 1103 SCROLLINFO scrInfo; 1104 scrInfo.cbSize= sizeof(SCROLLINFO); 1105 scrInfo.fMask= SIF_RANGE; 1106 //! aktualisiert Anzahl der Scans der Datenbasis + anpassen des Scrollbar 1107 nMaxScan= lpDBase->GetCNumber() - 1; 1108 CtrlSetLong(id_Limit, nMaxScan); 1109 BarHandle= GetDlgItem( GetHandle(), id_Bar ); 1110 1111 scrInfo.nMin= 0; 1112 scrInfo.nMax= nMaxScan; 1113 SetScrollInfo(BarHandle,SB_CTL,&scrInfo,TRUE); 1114 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, 0, 0, SendMessage ); 1115 }; 1116 //***************************************************************************** 1117 1118 //! wird aufgerufen, wenn Scrollbar angeclickt wurde 1119 void TChooseScanDlg::Dlg_OnVScrollBar( HWND, HWND hwndCtl, UINT code, 1120 int pos ) 1121 { 1122 switch ( code ) 1123 { 1124 case SB_LINEUP://! Klick auf oberen Pfeil 1125 lpDBase->SetCurveIdx( Areascan->nActiveScan + 1 ); 1126 break; 1127 1128 case SB_LINEDOWN://! Klick auf unteren Pfeil 1129 lpDBase->SetCurveIdx( Areascan->nActiveScan - 1 ); 1130 break; 1131 1132 case SB_THUMBPOSITION://! anclicken + bewegen des Scrollschiebers 1133 lpDBase->SetCurveIdx( nMaxScan - pos ); 1134 break; 1135 1136 case SB_PAGEUP://! anklicken oberhalb des schiebers 1137 lpDBase->SetCurveIdx( Areascan->nActiveScan + 10 ); 1138 break; 1139 1140 case SB_PAGEDOWN://! anklicken unterhalb des schiebers 1141 lpDBase->SetCurveIdx( Areascan->nActiveScan - 10 ); 1142 break; 1143 1144 case SB_ENDSCROLL://! Skrolling ist beendet, Daten nun anzeigen 1145 FORWARD_WM_COMMAND( GetHandle(), cm_ParamSet, 0, 0, SendMessage ); 1146 break; 1147 } 1148 }; 1149 //***************************************************************************** 1150 1151 //! wird aufgerufen beim druecken des OK-Buttons 1152 //! Rueckkehrcode immer true 1153 BOOL TChooseScanDlg::CanClose( void ) 1154 { 1155 return TRUE; 1156 }; 1157 1158 //############################################################################## 1159 // TComposeDBDlg 1160 //############################################################################## 1161 1162 TComposeDBDlg::TComposeDBDlg( TAreaScanWindow *aScan ) : TModalDlg( "COMPOSEDATABASE", GetMainInstance() ) 1163 { 1164 //! sichern aktueller Werte fuer Dateinamen und Dateianzahl 1165 Areascan= aScan; 1166 strcpy( oldFirstFile, Areascan->FirstFile ); 1167 strcpy( oldLastFile, Areascan->LastFile ); 1168 oldMaxFiles= Areascan->MaxFiles; 1169 }; 1170 //***************************************************************************** 1171 1172 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box 1173 //! Rueckkehrcode immer true 1174 BOOL TComposeDBDlg::Dlg_OnInit(HWND, HWND hwndCtl, LPARAM lParam) 1175 { 1176 //! Eintraege in Dialogbox setzen fuer Dateinamen und Dateizahl 1177 CtrlSetText(cm_StartFile, oldFirstFile); 1178 CtrlSetText(id_LastFile, oldLastFile); 1179 CtrlSetLong(id_NumberSpectrum, oldMaxFiles); 1180 //! wenn Dateizahl 0 deaktivieren des Eingabefeldes 1181 if ( oldMaxFiles == 0 ) CtrlSetEnabled(id_NumberSpectrum, FALSE ); 1182 //! Focus auf OK-Button der Box 1183 CtrlSetFocus( IDOK ); 1184 return TRUE; 1185 }; 1186 //***************************************************************************** 1187 1188 //! behandelt alle kommandos der Dialogbox 1189 void TComposeDBDlg::Dlg_OnCommand(HWND, int id, HWND hwndCtl, UINT codeNotify) 1190 { 1191 HFILE hFile; 1192 OFSTRUCT of; 1193 char buf[ MaxString ], FileName[ MaxString ]; 1194 int counter= 0, oldcounter= 0; 1195 char drive[ _MAX_DRIVE+1 ], path[ _MAX_DIR+1 ], name[ _MAX_FNAME+1 ], ext[ _MAX_EXT+1 ]; 1196 1197 switch ( id ) 1198 { 1199 case cm_StartFile://! Start-Datei-Button gedrueckt 1200 //! ins Arbeitverzeichnis wechseln + 'Datei nachladen'-Dialog oeffnen + Dateinamen prüfen 1201 char NewFilename[ _MAX_PATH ]; 1202 strcpy( NewFilename, "*.crv" ); // Fehler? warum *.crv beim AreaScan 1203 _chdir( Areascan->szDataPath ); 1204 if ( !FileOpenDialog( szDlgMsgLine104, "", NewFilename, Areascan->szDataPath ) ) return; // 'Abbruch' geklickt 1205 if ( strlen(NewFilename)==0 || strcmp(NewFilename, "*")==0 ) return; 1206 1207 //! nach Auswahl des Dateinamen bestimmen der maximalen Anzahl 1208 //! zusammenfassbarer Spektren abhaengig von fortlaufendem Vorhandensein 1209 //! der entsprechenden Dateien 1210 //! zunaechst: Bestimmung des Dateinamens(ohne Numerierung) 1211 _splitpath( NewFilename, drive, path, name, ext ); 1212 counter= oldcounter= atoi( &name[ max(0, strlen(name)-4) ] ); 1213 strcpy( buf, name ); 1214 buf[ max(0, strlen(name)-4) ]= '\0'; 1215 strcpy( Areascan->DismantleFile, buf ); 1216 strcpy( oldFirstFile, name ); 1217 strcat( oldFirstFile, ext ); 1218 SetWindowText( GetDlgItem( GetHandle(), cm_StartFile ), oldFirstFile ); 1219 hFile= OpenFile( oldFirstFile, &of, OF_READ ); 1220 //! fortlaufender Test auf vorhandene Dateien 1221 do 1222 { 1223 _lclose( hFile ); 1224 strcpy( oldLastFile, name ); 1225 strcpy(buf, ""); 1226 sprintf( buf, "%.4d", counter++ ); 1227 strcpy( name, Areascan->DismantleFile ); 1228 strcat( name, buf ); 1229 _makepath( FileName, drive, path, name, ext ); 1230 hFile= OpenFile( FileName, &of, OF_READ ); 1231 } while ( hFile!=HFILE_ERROR ); 1232 //! Eintragen von Dateizahl, Start- , End-Datei in Dialogbox 1233 CtrlSetLong(id_NumberSpectrum, counter - oldcounter - 1); 1234 strcat( oldLastFile, ext ); 1235 CtrlSetText(id_LastFile, oldLastFile ); 1236 oldMaxFiles= counter - oldcounter - 1; 1237 CtrlSetEnabled(id_NumberSpectrum, TRUE ); 1238 break; 1239 1240 default://! behandelt IDOK, IDCANCEL 1241 TModalDlg::Dlg_OnCommand( GetHandle(), id, hwndCtl, codeNotify ); 1242 } 1243 }; 1244 //***************************************************************************** 1245 1246 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen 1247 //! der Dialogbox (durch OK-Button) 1248 //! Rueckkehrcode False wenn die Dlg.box nicht geschlossen werden kann 1249 //! (Werte inkonsistent) sonst true 1250 BOOL TComposeDBDlg::CanClose() 1251 { 1252 BOOL result= TRUE; 1253 BOOL bValid= TRUE; 1254 char buf[ _MAX_PATH+1 ]; 1255 int counter; 1256 1257 //! auslesen der Spektrenzahl, event. Korrektur, wenn Wert zu gross bzw. klein 1258 int valueI= CtrlGetLong(id_NumberSpectrum, bValid); 1259 if (!bValid) result= FALSE; // Wert konnte nicht ausgelesen werden 1260 else if ( valueI!=oldMaxFiles ) 1261 { 1262 if ( (valueI<=oldMaxFiles) && (valueI >= 1) ) 1263 { 1264 oldMaxFiles= valueI; 1265 strcpy( buf, oldLastFile ); 1266 buf[ max(0, strlen(buf)-8) ]= '\0'; 1267 strcpy( oldLastFile, buf ); 1268 counter= atoi( &oldFirstFile[ max(0, strlen(oldFirstFile)-8) ] ); 1269 sprintf( buf, "%.4d", counter + oldMaxFiles - 1 ); 1270 strcat( oldLastFile, buf ); 1271 strcat( oldLastFile, ".CRV" ); 1272 } 1273 //! setzen der neuen Eintraege 1274 CtrlSetText(id_LastFile, oldLastFile ); 1275 CtrlSetLong(id_NumberSpectrum, oldMaxFiles); 1276 CtrlSetFocus(id_NumberSpectrum); 1277 result= FALSE; 1278 } 1279 else 1280 { 1281 //! uebergeben der neuen Werte an das AreaScan-Fenster 1282 Areascan->MaxFiles= oldMaxFiles; 1283 CtrlGetText(cm_StartFile, Areascan->FirstFile, _MAX_PATH); 1284 CtrlGetText(id_LastFile, Areascan->LastFile, _MAX_PATH); 1285 } 1286 return result; 1287 }; 1288 1289 //############################################################################## 1290 // TDismantleDBDlg 1291 //############################################################################## 1292 1293 TDismantleDBDlg::TDismantleDBDlg( TAreaScanWindow *scan ) : TModalDlg( "DISMANTLEDATABASE", GetMainInstance() ), Areascan(0) 1294 { 1295 //! Einlesen der Id's in Feld-Variablen zur komfortableren Nutzung 1296 Areascan= scan; 1297 }; 1298 //***************************************************************************** 1299 1300 //! setzt Defaultwerte der Dialogbox bei Aufruf der Box 1301 //! Rueckkehrcode immer true 1302 BOOL TDismantleDBDlg::Dlg_OnInit(HWND, HWND hwndCtl, LPARAM lParam) 1303 { 1304 //! setzen des Datenpfades 1305 CtrlSetText(id_Catalog, Areascan->szDataPath); 1306 strcpy(Areascan->DismantleFile, ""); 1307 //! Focus auf OK-Button der Box 1308 CtrlSetFocus( IDOK ); 1309 return TRUE; 1310 }; 1311 //***************************************************************************** 1312 1313 //! realisiert test der Dialogboxinhalte auf ihre konsistenz vor verlassen 1314 //! der Dialogbox (durch OK-Button) 1315 //! Rueckkehrcode False wenn die Dlg.box nicht geschlossen werden kann 1316 //! (Werte inkonsistent) sonst true 1317 BOOL TDismantleDBDlg::CanClose() 1318 { 1319 BOOL retval= TRUE; 1320 1321 CtrlGetText(id_Catalog, Areascan->szDataPath, MaxString); 1322 //! Testen, ob sich der Pfad auch beschreiben laesst 1323 if ( Areascan->szDataPath[ max(0, strlen(Areascan->szDataPath)-1) ] != '\\' ) 1324 strcat( Areascan->szDataPath, "\\" ); 1325 if ( !PathCanWrite(Areascan->szDataPath) ) { 1326 strcpy( Areascan->szDataPath, "c:\\" ); 1327 CtrlSetText(id_Catalog, Areascan->szDataPath); 1328 CtrlSetFocus(id_Catalog); 1329 MessageBeep(0); 1330 retval= FALSE; 1331 } 1332 //! Dateinamen auslesen und auf Laenge <5 testen 1333 //! sonst nur erste 4 Zeichen nehmen und Dialogbox bleibt geoeffnet 1334 if (retval) 1335 { 1336 CtrlGetText(id_FileName, Areascan->DismantleFile, MaxString ); 1337 if ( strlen( Areascan->DismantleFile ) > 4 ) 1338 { 1339 char buf[ MaxString ]; 1340 strcpy( buf, Areascan->DismantleFile ); 1341 buf[4]= '\0'; 1342 strcpy( Areascan->DismantleFile, buf ); 1343 CtrlSetText(id_FileName, buf ); 1344 retval= FALSE; 1345 } 1346 } 1347 return retval; 1348 }; 1349