2025-11-27 16:46:48 +09:00

304 lines
10 KiB
C++

// ==========================================================================
// Class Specification : COXPhysicalEdit
// ==========================================================================
// Header file : OXPhysicalEdit.h
// Version: 9.3
// This software along with its related components, documentation and files ("The Libraries")
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
// to obtain this file, or directly from our office. For a copy of the license governing
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
// //////////////////////////////////////////////////////////////////////////
// Properties:
// NO Abstract class (does not have any objects)
// YES Derived from CEdit
// YES Is a Cwnd.
// YES Two stage creation (constructor & Create())
// YES Has a message map
// NO Needs a resource (template)
// NO Persistent objects (saveable on disk)
// YES Uses exceptions (CUserException)
// //////////////////////////////////////////////////////////////////////////
// Desciption :
// This class is a base class to encapsulate an edit controls for editing of physical values
// such as time (COXTimeEdit), angle (COXAngleEdit), length (COXLengthEdit), and
// temperature (COXTempEdit).
//
// Contents of this controls consist of a numerical value and an optional
// character string describing a physical unit
// (e.g.: "12 cm", where "12" is the numerical value and "cm" the character
// string for the unit)
// member functions allow:
// setting a value with a specified unit
// retrieving a value in a specified unit
// converting values between different units
// Four classes are derived from this base class. These implement
// length, time, angle and temperature (see OXPhysicalEditEx.h)
// There are two ways you can use this base class to implement your specific
// physical edit class
// 1) One way is by defining a static array which contains all the names
// of the units along with their conversion factors
// A pointer to this structor can then be supplied to the constructor of
// COXPhysicalEdit. This is how the 4 supplied classes are implemented
// 2) Another way is to just supply a default unit to the constructor of
// COXPhysicalEdit (nDefaultUnitIndex), in this case you can
// pass NULL for pConversionData
// Now you HAVE TO override the functions
// virtual int GetNumberOfUnits();
// virtual int GetDefaultUnit();
// virtual LPCTSTR* GetUnitNames();
// virtual double Convert(double dValue, int nUnitFrom, int nUnitTo);
// This way you can do the conversion in code
// Remark:
// Prerequisites (necessary conditions):
/////////////////////////////////////////////////////////////////////////////
#ifndef __OXPHYSICALEDIT_H__
#define __OXPHYSICALEDIT_H__
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "OXDllExt.h"
#include "OXEdit.h"
#include "OXDropEdit.h"
#define ID_OXPHYSICALEDIT_INDEXBASE 0x0fff
// The following 3 numbers are used to convert a specic unit (S) to the
// default unit (D) by using the formula : D = (S + m_dPreTerm) * m_dFactor + m_dPostTerm
// E.g. if the default unit is meter and then the conversion paramaters for mm are
// 0 and 0.001 and 0, because 1m = (1mm + 0) * 0.0001 + 0
struct COXConversionParams
{
// --- Pre multiplication addition
double m_dPreTerm;
// --- Multiplcator (must not be 0!)
double m_dFactor;
// --- Post multiplication addition
double m_dPostTerm;
};
struct COXConversionData
{
// --- Total number of units that can be used
int m_nNumberOfUnits;
// --- The index of the default unit
int m_nDefaultUnitIndex;
// --- Pointer to an array of strings containing the names of the units
// (must be at least m_nNumberOfUnits long)
LPCTSTR* m_ppszUnitNames;
// --- Pointer to an array of conversioon paramaters that will be used to convert
// (must be at least m_nNumberOfUnits long)
COXConversionParams* m_pConversionParams;
// --- Pointer to a string containing the error message that will be shown
// when an unknown unit is encountered (may contain %1 which will
// be substituted by the specific unit name). May also be a resource ID
LPCTSTR m_pszErrorMsg;
};
class OX_CLASS_DECL COXPhysicalEdit: public COXDropEdit<COXNumericEdit>
{
DECLARE_DYNAMIC(COXPhysicalEdit)
// Data members -------------------------------------------------------------
public:
protected:
int m_nUnitIndex;
COXConversionData* m_pConversionData;
// flag that specifies whether the currently set unit will be displayed
// right after the value
BOOL m_bShowUnit;
// menu with different unit choices
CMenu m_menu;
private:
// Member functions ---------------------------------------------------------
public:
// --- In :
// --- Out :
// --- Returns :
// --- Effect : Default contructor
COXPhysicalEdit();
// --- In : pConversionData : Pointer to a structure that contains all the
// data to supply a conversion (may be NULL)
// nDefaultUnitIndex : The index of the unit that should be used as default
// --- Out :
// --- Returns :
// --- Effect : Standard contructor
COXPhysicalEdit(COXConversionData* pConversionData, int nDefaultUnitIndex = -1,
BOOL bShowUnit=TRUE);
// --- In : dValue : The value to be set
// nUnit : The unit of dValue (one of the predefined units)
// pszFormat : A "printf" like format string (if NULL "%g" will be used)
// --- Out :
// --- Returns :
// --- Effect : Sets a new unit value of the edit control
void SetValue(double dValue, int nUnit = -1, LPCTSTR pszFormat = NULL);
// --- In : nUnit : The unit in which the value should be retrieved
// bNotify : Whether a messagebox should be shown in case of error
// --- Out :
// --- Returns : The value of the edit control
// --- Effect : Retrieves the value of the edit control
// This function throws a CUserException when the control contains
// an unknown unit
double GetValue(int nUnit = -1, BOOL bNotify = TRUE);
// --- In : dValue : The value to be converted
// nUnitFrom : The unit of dValue on input (one of the predefined units)
// nUnitTo : The unit of dValue on output (one of the predefined units)
// --- Out :
// --- Returns : The value of the edit control
// --- Effect : Converts a value bewteen different units
virtual double Convert(double dValue, int nUnitFrom, int nUnitTo);
// --- In : dValue : The value to be converted
// nUnitFrom : The unit of dValue on input (one of the predefined units)
// nUnitTo : The unit of dValue on output (one of the predefined units)
// pConversionParams : The conversion params to use (may not be NULL)
// --- Out :
// --- Returns : The value of the edit control
// --- Effect : Static function that converts a value bewteen different units
static double ConversionHelper(double dValue, int nUnitFrom, int nUnitTo,
COXConversionParams* pConversionParams);
// --- In :
// --- Out :
// --- Returns : The number of different units supported by this object
// --- Effect : If you are not using a static table of conversion data
// (COXConversionData) this function should be overridden in a derived class
virtual int GetNumberOfUnits();
// --- In :
// --- Out :
// --- Returns : The zero-based index of the default unit
// --- Effect : If you are not using a static table of conversion data
// (COXConversionData) this function should be overridden in a derived class
virtual int GetDefaultUnit();
// --- In :
// --- Out :
// --- Returns : A pointer to an array of strings containg tne names of the units
// (should be at least GetNumberOfUnits() long)
// --- Effect : If you are not using a static table of conversion data
// (COXConversionData) this function should be overridden in a derived class
virtual LPCTSTR* GetUnitNames();
// --- In :
// --- Out :
// --- Returns : A pointer to an array of conversion data
// (should be at least GetNumberOfUnits() long)
// --- Effect : If you are not using a static table of conversion data
// (COXConversionData) this function should be overridden in a derived class
virtual COXConversionParams* GetConversionParams();
// --- In : pszUnit : The name of the unit that was not recognized
// --- Out :
// --- Returns :
// --- Effect : Shows a message box to the user, warning him that a unknown unit name was encountered
virtual void ShowErrorMessage(LPCTSTR pszUnit);
// --- In : bShowUnit - if TRUE then the name of the unit will be
// shown in edit control
// --- Out :
// --- Returns:
// --- Effect : Shows/hide unit name
void ShowUnit(BOOL bShowUnit);
// --- In :
// --- Out :
// --- Returns: TRUE if the name of the unit will be shown in edit control
// --- Effect : retrieves the flag that specifies whether unit name will be
// displayed along with value
inline BOOL GetShowUnit() const { return m_bShowUnit; }
#ifdef _DEBUG
// --- In :
// --- Out :
// --- Returns :
// --- Effect : AssertValid performs a validity check on this object
// by checking its internal state.
// In the Debug version of the library, AssertValid may assert and
// thus terminate the program.
virtual void AssertValid() const;
// --- In : dc : The diagnostic dump context for dumping, usually afxDump.
// --- Out :
// --- Returns :
// --- Effect : Dumps the contents of the object to a CDumpContext object.
// It provides diagnostic services for yourself and
// other users of your class.
// Note The Dump function does not print a newline character
// at the end of its output.
virtual void Dump(CDumpContext& dc) const;
#endif
// --- In :
// --- Out :
// --- Returns :
// --- Effect : Standard destructor
virtual ~COXPhysicalEdit();
// Overrides
//{{AFX_VIRTUAL(COXPhysicalEdit)
//}}AFX_VIRTUAL
protected:
virtual void UpdateMask();
// Generated message map functions
//{{AFX_MSG(COXPhysicalEdit)
//}}AFX_MSG
afx_msg void OnChangeUnit(UINT nID);
DECLARE_MESSAGE_MAP()
private:
};
/////////////////////////////////////////////////////////////////////////////
// global public functions
OX_API_DECL void AFXAPI DDX_OXPhysicalEdit(CDataExchange* pDX, int nIDC,
double& dValue, int nUnitIndex);
#endif // __OXPHYSICALEDIT_H__
/////////////////////////////////////////////////////////////////////////////