Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

293 lines
6.8 KiB
C++

// UnitToolDlg.cpp : implementation file
//
#include "StdAfx.h"
#include "UnitToolDlg.h"
//#include "THvacLayerManBar.h"
//#include "DbfUtility.h"
#include "tgas.h"
using namespace TchPrivate;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CUnitToolDlg dialog
TUnitLib CUnitToolDlg::g_lib;
CUnitToolDlg::CUnitToolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CUnitToolDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CUnitToolDlg)
m_dNewNum = 0.0;
//}}AFX_DATA_INIT
m_dOldNum = 0.0; // 注:以下数据读取对话框记忆值
m_csParam = _T("");
m_csOldUnit = _T("");
m_csNewUnit = _T("");
}
void CUnitToolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUnitToolDlg)
DDX_Control(pDX, IDC_LIST_CONTENT, m_lstContent);
DDX_Control(pDX, IDC_COMBO_ITEM, m_cmbItem);
DDX_Text(pDX, IDC_EDIT_NEWNUM, m_dNewNum);
DDX_Text(pDX, IDC_EDIT_OLDNUM, m_dOldNum);
DDX_Text(pDX, IDC_STATIC_NEWUNIT, m_csNewUnit);
DDX_Text(pDX, IDC_STATIC_OLDUNIT, m_csOldUnit);
DDX_Text(pDX, IDC_EDIT_PARAM, m_csParam);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUnitToolDlg, CDialog)
//{{AFX_MSG_MAP(CUnitToolDlg)
ON_BN_CLICKED(IDC_BUTTON_CAL, OnButtonCal)
ON_BN_CLICKED(IDC_BUTTON_OPPOSITECAL, OnButtonOppositecal)
ON_CBN_SELCHANGE(IDC_COMBO_ITEM, OnSelchangeComboItem)
ON_LBN_SELCHANGE(IDC_LIST_CONTENT, OnSelchangeListContent)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUnitToolDlg message handlers
BOOL CUnitToolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
GetItem(); // 1、获取换算项目,并初始化下拉列表
int nLen = m_lstItem.Length();
for (int i = 0; i < nLen; i++)
{
m_cmbItem.AddString(m_lstItem[i]);
}
m_cmbItem.SetCurSel(0);
InitContentLst(); // 2、获取换算内容,并初始化列表
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
// 从数据库中获取单位换算项目,并初始化下拉列表
BOOL CUnitToolDlg::GetItem()
{
XString szFile;
if (!FindFile(_T("UnitItem.DBF"), szFile))
{
AfxMessageBox(_T("对不起,没有找到UnitItem.DBF文件!"));
return FALSE;
}
CodeBase db;
XDbfTable *pTable = db.Open(szFile);
if (pTable == NULL)
{
AfxMessageBox(XString(_T("打开%s失败!"), szFile));
return FALSE;
}
if (pTable->GetFieldContent(_T("Item")) == NULL)
{
pTable->Close();
AfxMessageBox(XString(_T("打开%s失败!"), szFile));
return FALSE;
}
for (pTable->MoveFirst(); !pTable->IsEOF(); pTable->MoveNext())
{
CString csItem;
GET_FIELD(pTable, _T("Item"), csItem);
if ((!csItem.IsEmpty()) && (m_lstItem.Index(csItem) < 0))
{
m_lstItem.Append(tstrnew(csItem));
}
}
pTable->Close();
return TRUE;
}
// 根据单位换算项目,初始化列表
BOOL CUnitToolDlg::InitContentLst()
{
UpdateData(TRUE);
g_lib.ClearAll(); // 首先清空
m_lstContent.ResetContent();
CString csItem;
m_cmbItem.GetWindowText(csItem); // 获取当前项目
if (!g_lib.OpenLib(csItem)) // 获取指定项目的换算内容,构造出链表
{
return FALSE;
}
XStringList lstUnit; // 获取所有换算内容列表
g_lib.GetUnitContent(lstUnit);
int nLen = lstUnit.Length();
for (int i = 0; i < nLen; i++)
{
m_lstContent.AddString(lstUnit[i]);
}
return TRUE;
}
// 根据选择的换算单位,获取换算系数,并初始化字符串
BOOL CUnitToolDlg::InitParamString()
{
UpdateData(TRUE);
CString csResult; // 所选择的换算单位
int nIndex = m_lstContent.GetCurSel();
if (nIndex < 0)
{
return FALSE;
}
m_lstContent.GetText(nIndex, csResult);
CString csUnit1, csUnit2;
nIndex = csResult.Find(_T("<"), 0);
csUnit1 = csResult.Left(nIndex-1); // 原单位
m_csOldUnit = g_lib.GetUnit(csUnit1); // 字符串中显示的内容,去掉括号
nIndex = csResult.Find(_T(">"), 0);
csUnit2 = csResult.Mid(nIndex+2, csResult.GetLength()-1); // 新单位
m_csNewUnit = g_lib.GetUnit(csUnit2);
g_lib.GetParam(csUnit1, csUnit2, m_csParam, m_csOppositeParam, m_dParam,
m_dOppParam); // 获取换算系数
UpdateData(FALSE);
return TRUE;
}
// 获取计算结果
void CUnitToolDlg::CalNewNum()
{
if (m_dParam < -1.0E-5) // 温度
{
int nParam = (int)m_dParam;
if (nParam == -1) // 摄氏温标-——>华氏温标
{
m_dNewNum = 9.0/5.0*m_dOldNum + 32;
}
else if (nParam == -2)
{
m_dNewNum = (m_dOldNum - 32) * 5.0/9.0;
}
else if (nParam == -3) // 摄氏温标-——>列氏温标
{
m_dNewNum = 0.8 * m_dOldNum;
}
else if (nParam == -4)
{
m_dNewNum = 1.25 * m_dOldNum;
}
else if (nParam == -5) // 摄氏温标-——>开氏温标
{
m_dNewNum = m_dOldNum + 273;
}
else if (nParam == -6)
{
m_dNewNum = m_dOldNum - 273;
}
else if (nParam == -7) // 华氏温标-——>列氏温标
{
m_dNewNum = (m_dOldNum - 32) * 4.0/9.0;
}
else if (nParam == -8)
{
m_dNewNum = 9.0/4.0*m_dOldNum + 32;
}
}
else // 其他
{
m_dNewNum = m_dOldNum * m_dParam;
}
CString csTmp;
csTmp.Format(_T("%.2f"), m_dNewNum);
m_dNewNum = _tstof(csTmp); // 保留两位小数
}
void CUnitToolDlg::OnButtonCal()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CalNewNum(); // 计算
UpdateData(FALSE);
}
void CUnitToolDlg::OnButtonOppositecal()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
Exchange(m_csNewUnit, m_csOldUnit); // 交换
Exchange(m_csParam, m_csOppositeParam);
Exchange(m_dParam, m_dOppParam);
CalNewNum(); // 计算
UpdateData(FALSE);
}
void CUnitToolDlg::OnCancel()
{
// TODO: Add extra cleanup here
// 注:对话框记忆功能
CDialog::OnCancel();
}
void CUnitToolDlg::OnSelchangeComboItem()
{
// TODO: Add your control notification handler code here
InitContentLst();
m_dOldNum = 0; // 清空
m_csOldUnit = _T("");
m_csParam = _T("");
m_dNewNum = 0;
m_csNewUnit = _T("");
UpdateData(FALSE);
}
void CUnitToolDlg::OnSelchangeListContent()
{
// TODO: Add your control notification handler code here
BOOL bRet = InitParamString();
if (!bRet)
{
return;
}
m_dOldNum = 0; // 清空
m_dNewNum = 0;
UpdateData(FALSE);
}
/*----------------------------------------------------------------------------*
* 函数名称: ChangeUnitCmd
* 功能描述: 单位换算对话框
* 参 数:
* 返 回 值:
* 历 史: 1. 2008-2-17 sg create
* 备 注:
-----------------------------------------------------------------------------*/
void ChangeUnitCmd()
{
CTemporaryResourceOverride vTemp;
CUnitToolDlg dlg;
dlg.DoModal();
//
// CString csTmp;
// csTmp.Format(_T("%s"), _T("全国民用建筑工程设计技术措施-暖通空调·动力\\表2.1.4-2 温差修正系数a"));
// RefBookTool(csTmp);
}