如何在VS上使用MFC

How to use MFC on VS

本文关键字:MFC VS      更新时间:2023-10-16

不断收到错误

error LNK2001: unresolved external symbol "public: void __thiscall CMSCalculatorDlg::OnEnChangeEdtDisplay(void)" (?OnEnChangeEdtDisplay@CMSCalculatorDlg@@QAEXXZ)
error LNK2001: unresolved external symbol "public: void __thiscall CMSCalculatorDlg::OnBnClickedChkInverse(void)" (?OnBnClickedChkInverse@CMSCalculatorDlg@@QAEXXZ)

致命错误 LNK1120:2 个未解析的外部

#include "stdafx.h"
#include "MSCalculator.h"
#include "MSCalculatorDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


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

enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()



CMSCalculatorDlg::CMSCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMSCalculatorDlg::IDD, pParent)
, m_display(_T(""))
, m_input(0)
, m_output(0)
, m_operator(0)
, m_invert(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMSCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDT_Display, m_display);
DDX_Check(pDX, IDC_CHK_Inverse, m_invert);
}
BEGIN_MESSAGE_MAP(CMSCalculatorDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTN_Cancel, &CMSCalculatorDlg::OnBnClickedBtnCancel)
ON_BN_CLICKED(IDC_BTN_1, &CMSCalculatorDlg::OnBnClickedBtn1)
ON_BN_CLICKED(IDC_BTN_ADD, &CMSCalculatorDlg::OnBnClickedBtnAdd)
ON_BN_CLICKED(IDC_BTN_EQUAL, &CMSCalculatorDlg::OnBnClickedBtnEqual)
ON_BN_CLICKED(IDC_BTN_MINUS, &CMSCalculatorDlg::OnBnClickedBtnMinus)
ON_BN_CLICKED(IDC_BTN_LN, &CMSCalculatorDlg::OnBnClickedBtnLn)
ON_BN_CLICKED(IDC_CHK_Inverse, &CMSCalculatorDlg::OnBnClickedChkInverse)
ON_BN_CLICKED(IDC_BTN_2, &CMSCalculatorDlg::OnBnClickedBtn2)
ON_BN_CLICKED(IDC_BTN_3, &CMSCalculatorDlg::OnBnClickedBtn3)
ON_BN_CLICKED(IDC_BTN_4, &CMSCalculatorDlg::OnBnClickedBtn4)
ON_BN_CLICKED(IDC_BTN_5, &CMSCalculatorDlg::OnBnClickedBtn5)
ON_BN_CLICKED(IDC_BTN_6, &CMSCalculatorDlg::OnBnClickedBtn6)
ON_BN_CLICKED(IDC_BTN_7, &CMSCalculatorDlg::OnBnClickedBtn7)
ON_BN_CLICKED(IDC_BTN_8, &CMSCalculatorDlg::OnBnClickedBtn8)
ON_BN_CLICKED(IDC_BTN_9, &CMSCalculatorDlg::OnBnClickedBtn9)
ON_EN_CHANGE(IDC_EDT_Display, &CMSCalculatorDlg::OnEnChangeEdtDisplay)
ON_BN_CLICKED(IDC_BTN_0, &CMSCalculatorDlg::OnBnClickedBtn0)
ON_BN_CLICKED(IDC_BTN_SQUARED, &CMSCalculatorDlg::OnBnClickedBtnSquared)
ON_BN_CLICKED(IDC_BTN_MULTIPLY, &CMSCalculatorDlg::OnBnClickedBtnMultiply)
ON_BN_CLICKED(IDC_BTN_DIVIDE, &CMSCalculatorDlg::OnBnClickedBtnDivide)
ON_BN_CLICKED(IDC_BTN_POWER, &CMSCalculatorDlg::OnBnClickedBtnPower)
ON_BN_CLICKED(IDC_BTN_LOG, &CMSCalculatorDlg::OnBnClickedBtnLog)
ON_BN_CLICKED(IDC_BTN_SINE, &CMSCalculatorDlg::OnBnClickedBtnSine)
ON_BN_CLICKED(IDC_BTN_COSINE, &CMSCalculatorDlg::OnBnClickedBtnCosine)
ON_BN_CLICKED(IDC_BTN_CUBED, &CMSCalculatorDlg::OnBnClickedBtnCubed)
ON_BN_CLICKED(IDC_BTN_TANGENT, &CMSCalculatorDlg::OnBnClickedBtnTangent)
ON_BN_CLICKED(IDC_BTN_SINEH, &CMSCalculatorDlg::OnBnClickedBtnSineh)
ON_BN_CLICKED(IDC_BTN_COSINEH, &CMSCalculatorDlg::OnBnClickedBtnCosineh)
ON_BN_CLICKED(IDC_BTN_TANGENTH, &CMSCalculatorDlg::OnBnClickedBtnTangenth)
ON_BN_CLICKED(IDC_BTN_FACTORIAL, &CMSCalculatorDlg::OnBnClickedBtnFactorial)
ON_BN_CLICKED(IDC_BTN_INVFUC, &CMSCalculatorDlg::OnBnClickedBtnInvfuc)
END_MESSAGE_MAP()

BOOL CMSCalculatorDlg::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 CMSCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
    CAboutDlg dlgAbout;
    dlgAbout.DoModal();
}
else
{
    CDialog::OnSysCommand(nID, lParam);
}
}

void CMSCalculatorDlg::OnPaint()
{
if (IsIconic())
{
    CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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();
}
}

HCURSOR CMSCalculatorDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

void CMSCalculatorDlg::OnBnClickedBtnCancel()
{
m_display = _T("");
UpdateData(false);
}

void CMSCalculatorDlg::OnBnClickedBtnAdd()
{
UpdateData(true);
m_input = _tstof(m_display);
m_output = m_input;
m_display = _T("");
m_operator = 0;
UpdateData(false);
}
void CMSCalculatorDlg::OnBnClickedBtnMinus()
{
UpdateData(true);
m_input = _tstof(m_display);
m_output = m_input;
m_display = _T("");
m_operator = 1;
}
void CMSCalculatorDlg::OnBnClickedBtnMultiply()
{   
UpdateData(true);
m_input = _tstof(m_display);
m_output = m_input;
m_display = _T("");
m_operator = 2;
}
void CMSCalculatorDlg::OnBnClickedBtnDivide()
{
UpdateData(true);
m_input = _tstof(m_display);
m_output = m_input;
m_display = _T("");
m_operator = 3;
}
void CMSCalculatorDlg::OnBnClickedBtnEqual()
{
UpdateData(true);
m_input = _tstof(m_display);
switch(m_operator)
{
case 0:
m_output += m_input;
break;
case 1:
m_output -= m_input;
break;
case 2:
m_output *= m_input;
break;
case 3:
m_output /= m_input;
break;
}
m_display.Format(_T("%.4f"), m_output); // convert from double to C-string
UpdateData(false);
}

void CMSCalculatorDlg::OnBnClickedBtnLn()
{
UpdateData(true);
m_input = _tstof(m_display);
if(m_invert == false)
m_output = log(m_input);
else
m_output = exp(m_input);
m_display.Format(_T("%.4f"), m_output); // converter
UpdateData(false); 
m_display =_T("");
}

void CMSCalculatorDlg::OnBnClickedBtnLog()
{
UpdateData(true);
m_input = _tstof(m_display);
if(m_invert == false)
m_output = log10(m_input);
else
m_output = pow(10,m_input);
m_display.Format(_T("%.4f"), m_output); // converter
UpdateData(false); 
m_display =_T("");
}

void CMSCalculatorDlg::OnBnClickedBtn0()
{
m_display += _T("0");
UpdateData(false);
}
void CMSCalculatorDlg::OnBnClickedBtn1()
{
m_display += _T("1");
UpdateData(false);
}
void CMSCalculatorDlg::OnBnClickedBtn2()
{
m_display += _T("2");
UpdateData(false);
}
void CMSCalculatorDlg::OnBnClickedBtn3()
{
m_display += _T("3");
UpdateData(false);
}

void CMSCalculatorDlg::OnBnClickedBtn4() {

m_display += _T("4");
UpdateData(false);
}
 void CMSCalculatorDlg::OnBnClickedBtn5()
{
  m_display += _T("5");
UpdateData(false);
 }
 void CMSCalculatorDlg::OnBnClickedBtn6()
 { 
 m_display += _T("6");
 UpdateData(false);
}
void CMSCalculatorDlg::OnBnClickedBtn7()
{
 m_display += _T("7");
UpdateData(false);
}
 void CMSCalculatorDlg::OnBnClickedBtn8()
{
 m_display += _T("8");
 UpdateData(false);
 }
void CMSCalculatorDlg::OnBnClickedBtn9()
{
 m_display += _T("9");
UpdateData(false);
}

 void CMSCalculatorDlg::OnBnClickedBtnSquared()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = pow(m_input,2.0);
 else
m_output = pow(m_input,0.5);
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
m_display =_T("");  
}
void CMSCalculatorDlg::OnBnClickedBtnCubed()
 {
UpdateData(true);
 m_input = _tstof(m_display);
if(m_invert == false)
m_output = pow(m_input,3.0);
else
m_output = pow(m_input,1/3);
  m_display.Format(_T("%.4f"), m_output); // converter
UpdateData(false); 
m_display =_T("");
}


 void CMSCalculatorDlg::OnBnClickedBtnPower()
 {
 UpdateData(true);
m_input = _tstof(m_display);
if(m_invert == false)
m_output = pow(m_input,m_input);
else
m_output = pow(m_input,m_input);
  m_display.Format(_T("%.4f"), m_output); // converter
UpdateData(false); 
 m_display =_T("");     
 }
 void CMSCalculatorDlg::OnBnClickedBtnSine()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = sin(m_input);
 else
m_output = asin(m_input);
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T(""); 
 }
 void CMSCalculatorDlg::OnBnClickedBtnCosine()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = cos(m_input);
 else
m_output = acos(m_input);
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T("");     
 }
 void CMSCalculatorDlg::OnBnClickedBtnTangent()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = tan(m_input);
 else
m_output = atan(m_input);
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T(""); 
 }
 void CMSCalculatorDlg::OnBnClickedBtnSineh()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = sinh(m_input);
 else
m_output = log(m_input + sqrt(m_input * m_input + 1));
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T(""); 
 }
 void CMSCalculatorDlg::OnBnClickedBtnCosineh()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = cosh(m_input);
 else
m_output = log(m_input + sqrt(m_input * m_input - 1));
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T("");
 }
 void CMSCalculatorDlg::OnBnClickedBtnTangenth()
 {
 UpdateData(true);
 m_input = _tstof(m_display);
 if(m_invert == false)
m_output = tanh(m_input);
 else
m_output = 0.5*log(1+m_input/1-m_input);
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T("");
 }
 void CMSCalculatorDlg::OnBnClickedBtnFactorial()
 {
 UpdateData(true);
 m_input = _tstof(m_display);   
 for(int i=1; i <= m_input;i++)
{
    m_output = m_output*i;
}
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T("");
 }


void CMSCalculatorDlg::OnBnClickedBtnInvfuc()
 {
 UpdateData(true);
 m_input = _tstof(m_display);   
 m_output = 1/m_input;
 m_display.Format(_T("%.4f"), m_output); // converter
 UpdateData(false); 
 m_display =_T("");
 }

您尚未提供 CMSCalculatorDlg::OnEnChangeEdtDisplayCMSCalculatorDlg::OnBnClickedChkInverse 的定义。

您已经声明了这些方法,但尚未定义它们。添加缺少的定义后,链接器将很高兴。

消息(简化)是:

error: unresolved symbol "OnEnChangeEdtDisplay()"

和。。。(大惊喜),浏览您的代码,我没有看到具有该名称的函数!

认为该功能在哪里定义?
如果您同意它未定义,您期望程序在没有它的情况下如何成功链接?