MFC模拟量转工程量换应用程序实例

一个完整的工程量模拟量转换通用应用程序。六个编辑框分别输入工程量上限、工程量下限、数字量上限、数字量下限、零点偏移补偿、输入的模拟量信号值,一个文本控件显示输出的工程值。当零点有偏移时可以在零点偏移补偿编辑框中输入数值补偿。实际应用中输入模拟量可以是实时值,不使用转换按钮实时输出工程值。

AnalogConversionDlg.h相关代码

cpp 复制代码
// AnalogConversionDlg.h : header file
//

#if !defined(AFX_ANALOGCONVERSIONDLG_H__6D46D62D_B4FA_4287_AF74_D2998FEA5430__INCLUDED_)
#define AFX_ANALOGCONVERSIONDLG_H__6D46D62D_B4FA_4287_AF74_D2998FEA5430__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CAnalogConversionDlg dialog

class CAnalogConversionDlg : public CDialog
{
// Construction
public:
	CAnalogConversionDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	//{{AFX_DATA(CAnalogConversionDlg)
	enum { IDD = IDD_ANALOGCONVERSION_DIALOG };
	double	m_dEngHigh;
	double	m_dEngLow;
	double	m_dInputValue;
	double	m_dOffset;
	double	m_dRawHigh;
	double	m_dRawLow;
	CString	m_strOutput;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAnalogConversionDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CAnalogConversionDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnConvert();
	afx_msg void OnChangeInputValue();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ANALOGCONVERSIONDLG_H__6D46D62D_B4FA_4287_AF74_D2998FEA5430__INCLUDED_)

AnalogConversionDlg.cpp相关代码

cpp 复制代码
// AnalogConversionDlg.cpp : implementation file
//

#include "stdafx.h"
#include "AnalogConversion.h"
#include "AnalogConversionDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAnalogConversionDlg dialog

CAnalogConversionDlg::CAnalogConversionDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAnalogConversionDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAnalogConversionDlg)
	m_dEngHigh = 0.0;
	m_dEngLow = 0.0;
	m_dInputValue = 0.0;
	m_dOffset = 0.0;
	m_dRawHigh = 0.0;
	m_dRawLow = 0.0;
	m_strOutput = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CAnalogConversionDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAnalogConversionDlg)
	DDX_Text(pDX, IDC_ENG_HIGH, m_dEngHigh);
	DDX_Text(pDX, IDC_ENG_LOW, m_dEngLow);
	DDX_Text(pDX, IDC_INPUT_VALUE, m_dInputValue);
	DDX_Text(pDX, IDC_OFFSET, m_dOffset);
	DDX_Text(pDX, IDC_RAW_HIGH, m_dRawHigh);
	DDX_Text(pDX, IDC_RAW_LOW, m_dRawLow);
	DDX_Text(pDX, IDC_OUTPUT_VALUE, m_strOutput);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAnalogConversionDlg, CDialog)
	//{{AFX_MSG_MAP(CAnalogConversionDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_CONVERT, OnConvert)
	ON_EN_CHANGE(IDC_INPUT_VALUE, OnChangeInputValue)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAnalogConversionDlg message handlers

BOOL CAnalogConversionDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CAnalogConversionDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CAnalogConversionDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CAnalogConversionDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CAnalogConversionDlg::OnConvert() 
{
UpdateData(TRUE); // 从控件获取数据
    
    // 验证输入
    if (m_dRawHigh == m_dRawLow)
    {
        AfxMessageBox(_T("数字量上限和下限不能相同"));
        return;
    }
    
    // 计算转换值
    double dOutput = 0.0;
    
    // 线性转换公式: 
    // 工程值 = [(输入值-数字量下限)/(数字量上限-数字量下限)]*(工程量上限-工程量下限)+工程量下限 + 偏移量
    dOutput = ((m_dInputValue - m_dRawLow) / (m_dRawHigh - m_dRawLow)) * 
              (m_dEngHigh - m_dEngLow) + m_dEngLow + m_dOffset;
    
    // 格式化输出
    m_strOutput.Format(_T("%.2f"), dOutput);
    
    UpdateData(FALSE); // 更新控件显示	
}


void CAnalogConversionDlg::OnChangeInputValue()
{
    // 实时响应输入变化
    OnConvert();
}

运行程序

相关推荐
水天需010几秒前
Linux 下查找 UID 的多种方法
c++
Donald_wsn4 分钟前
牛客 栈和排序 C++
数据结构·c++·算法
程序喵大人5 分钟前
记录va_list重复使用导致的crash
开发语言·c++
达子66610 分钟前
git-lfs的安装配置,解决大文件存储问题
linux·c++·git
测试人社区—小叶子12 分钟前
使用开源模型微调,构建专属的测试用例生成机器人
运维·网络·c++·人工智能·机器人·自动化·测试用例
coderxiaohan15 分钟前
【C++】红黑树的实现
数据结构·c++·算法
纵有疾風起18 分钟前
【C++—STL】哈希表底层封装与unorderedset/unorderedmap模拟实现
开发语言·数据结构·c++·stl·哈希算法·散列表
dangdang___go18 分钟前
使用国产AI模型进行“委婉劝学程序”的模拟实现||创建可执行程序营造惊喜感
c语言·c++·豆包·劝学程序开发·创建可执行文件营造惊喜感
coderxiaohan19 分钟前
【C++】封装红黑树实现mymap和myset
数据结构·c++·算法
9ilk37 分钟前
【C++】--- 类型转换
开发语言·c++