/**************/ /* scaling.cpp*/ /**************************************************************************** PROGRAM: scaling.cpp PURPOSE: Vaihtaa matkoja AUTHOR: Vesa Lappalainen 10.11.1996 CHANGES: 11.11.1996 - alaspäin yhteensopivuus OWL 5.0: CHANGES: 06.11.1999/vl - MFC-versio: Ongelmia OWL toteutuksessa: 5) Rekursio (mistä tulisi?) on poistettu siis silä, että DoubleEdit ei muuta näyttöä, jos sama arvo (tietyllä tarkkudella) yritetään laittaa uudelleen. Tosin tämä ei olut ongelma enää tänä vuonna, sen kanssa olin erehtynyt jo aikaisemmin! Tehtäviä: 1) Tee luokka TFactorBox, joka peritään ComboBoxista ja jonka avulla kerroin saadaan suoraan tyylin kerroin = CbVasen; Saat tehdä samanlaisen Refresh-tempun kuin TDoubleEditissäkin on tehty 2) Tee sama RadioButtonille RbNaapuri, eli luokka jonka ansiosta radiobuttonia voi käyttää if ( RbNaapuri ) ... 3) Ota tämän tiedoston yleiskäytöiset osat ja tee niistä perittävä luokka vastaaviin skaalaustapauksiin. Eli jokaisessa skaalaustapauksessa (mittakaava, rahanvaihto, painot) tarvitsee vain alustaa comboboxit eri tavalla. ****************************************************************************/ #include #include #include #include "scaling.h" #include "mfc\doubedit.h" // vrt. owl\IntLabel.h #include "vaihtaja.rh" //------------------------------------------------------------------------------ class cUnit { const char *unit; double factor; public: cUnit(const char *u, double f) : unit(u), factor(f) {} const char *Unit() const { return unit; } double Factor() const { return factor; } operator double() const { return factor; } operator const char *() const { return unit; } }; //------------------------------------------------------------------------------ static cUnit units[] = { // Kertoimet suhteessa units[0]:aan cUnit( "mm", 1.0 ), cUnit( "cm", 10.0 ), cUnit( "dm", 100.0 ), cUnit( "m", 1000.0 ), cUnit( "km", 1000000.0 ), cUnit( "inch", 25.4 ), cUnit( "ft", 304.8 ), cUnit( "yard", 914.4 ), cUnit( "mile", 1609300.0 ), cUnit( "NM", 1853200.0 ), cUnit( "tuuma(s)", 24.742 ), cUnit( "kortteli", 148.45 ), cUnit( "jalka(s)", 296.9 ), cUnit( "kyynärä", 593.8 ), cUnit( "syli", 1781.4 ), cUnit( "virsta", 1068800.0 ), cUnit( "peninkulma", 10688000.0 ), cUnit( "lentopinta", 30400.8 ), cUnit( NULL, 0.0 ) }; #define BF_CHECKED 1 #define MM 0 #define KM 4 //------------------------------------------------------------------------------ class TScalingDialog : public CDialog { CComboBox CbVasen; CComboBox CbOikea; TDoubleEdit DeScale; TDoubleEdit DeVasen; TDoubleEdit DeOikea; CButton RbNaapuri; public: TScalingDialog(UINT nIDTemplate, CWnd *parent=NULL, BOOL modeless=FALSE) : CDialog(nIDTemplate,parent) { if ( modeless ) Create(nIDTemplate,parent);} BOOL OnInitDialog(); virtual ~TScalingDialog() { } virtual bool Naapuri() const { return RbNaapuri.GetCheck() == BF_CHECKED; } virtual double vKerroin() const { return units[CbVasen.GetCurSel()]; } virtual double oKerroin() const { return units[CbOikea.GetCurSel()]; } virtual void LaskeVasen() { DeVasen = ( DeOikea * oKerroin() ) / // ------------------------- ( DeScale * vKerroin() ); } virtual void LaskeOikea() { DeOikea = ( DeVasen * vKerroin() * DeScale ) / // ---------------------------------- oKerroin(); } virtual void ENVasen() { DeVasen.Refresh(); LaskeOikea(); } virtual void ENOikea() { DeOikea.Refresh(); LaskeVasen(); } virtual void ENScale() { DeScale.Refresh(); if ( DeScale.get() <= 0.0 ) DeScale = 1.0; LaskeOikea(); } virtual void CBNVasen() { if ( Naapuri() ) LaskeOikea(); else LaskeVasen(); } virtual void CBNOikea() { if ( Naapuri() ) LaskeVasen(); else LaskeOikea(); } virtual void BNOK() { DeVasen.SetFocus(); DeVasen.SetSel(0,-1); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP( TScalingDialog, CDialog ) ON_EN_CHANGE (ID_VASEN ,ENVasen) ON_EN_CHANGE (ID_OIKEA ,ENOikea) ON_EN_CHANGE (ID_SCALE ,ENScale) ON_CBN_SELCHANGE(ID_VASEN_UNIT ,CBNVasen) ON_CBN_SELCHANGE(ID_OIKEA_UNIT ,CBNOikea) ON_BN_CLICKED (IDOK ,BNOK ) // Retillä vasen aktiiviseksi END_MESSAGE_MAP() BOOL TScalingDialog::OnInitDialog() { CDialog::OnInitDialog(); // MUISTA TÄMÄ!!! HICON m_hIcon = AfxGetApp()->LoadIcon(IDI_IKONI); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // Yhdistetään resurssit sisäisiin kontrolleihin CbVasen.SubclassDlgItem( ID_VASEN_UNIT, this ); CbOikea.SubclassDlgItem( ID_OIKEA_UNIT, this ); DeScale.SubclassDlgItem( ID_SCALE, this ); DeVasen.SubclassDlgItem( ID_VASEN, this ); DeOikea.SubclassDlgItem( ID_OIKEA, this ); RbNaapuri.SubclassDlgItem( IDR_NAAPURI, this ); for (int i=0; units[i].Unit(); i++) { // Täytetään combo-listat CbVasen.InsertString(i,units[i].Unit()); // Tätä ei voi tehdä muodostajassa CbOikea.InsertString(i,units[i].Unit()); } RbNaapuri.SetCheck(BF_CHECKED); // Eikä näitäkään! CbVasen.SetCurSel(MM); CbOikea.SetCurSel(KM); DeScale = 200000.0; DeVasen = 20.0; return TRUE; } //------------------------------------------------------------------------------ void RunScaling(CWnd *wnd,BOOL modeless) { TScalingDialog *dlg = new TScalingDialog(IDD_SCALING,wnd,modeless); // dlg->SetFlag(wfDeleteOnClose); if ( !modeless ) dlg->DoModal(); }