如何显示基于 MFC 的应用程序类文件的输出

How to display output from a MFC based application class file

本文关键字:MFC 应用程序 输出 文件 何显示 显示      更新时间:2023-10-16

我是编程初学者,我制作了一个基于 MFC 的 GUI 应用程序,并通过 Cptr 将变量链接到类文件。现在我需要打印该类文件的输出。输出是变量值,因此我无法显示字符串。

我制作了一个输出对话框及其类和头文件,但无法将值从一个类传输到另一个类,并且这些值未打印在"输出"对话框中。我尝试了TRACE和OutputDebugString,但没有成功,我不确定传输值是否是正确的选择。

类文件代码:

std::cout << HV_Tmid_1 << std::endl;
std::cout << HV_Tmid_2 << std::endl;
std::cout << HV_Tmid_3 << std::endl;
std::cout << HV_Tmid_4 << std::endl;
std::cout << LV_Tmid_1 << std::endl;
std::cout << LV_Tmid_2 << std::endl;
std::cout << LV_Tmid_3 << std::endl;
std::cout << LV_Tmid_4 << std::endl;

输出对话框类代码:

// Output.cpp : implementation file
//
#include "stdafx.h"
#include "Thermal Tool.h"
#include "Output.h"
#include "afxdialogex.h"
#include "TT.h"
#include <iostream>
#include <sstream>
#include <string>

// Output dialog
IMPLEMENT_DYNAMIC(Output, CDialog)
Output::Output(CWnd* pParent /*=nullptr*/)
    : CDialog(IDD_OUTPUT, pParent)
{
    m_d_hvmid1 = _T("");
    m_d_hvmid2 = _T("");
    m_d_hvmid3 = _T("");
    m_d_hvmid4 = _T("");
    m_d_lvmid1 = _T("");
    m_d_lvmid2 = _T("");
    m_d_lvmid3 = _T("");
    m_d_lvmid4 = _T("");
}
Output::~Output()
{
}
void Output::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_HV_MID1, m_d_hvmid1);
    DDX_Text(pDX, IDC_HV_MID2, m_d_hvmid2);
    DDX_Text(pDX, IDC_HV_MID3, m_d_hvmid3);
    DDX_Text(pDX, IDC_HV_MID4, m_d_hvmid4);
    DDX_Text(pDX, IDC_LV_MID1, m_d_lvmid1);
    DDX_Text(pDX, IDC_LV_MID2, m_d_lvmid2);
    DDX_Text(pDX, IDC_LV_MID3, m_d_lvmid3);
    DDX_Text(pDX, IDC_LV_MID4, m_d_lvmid4);
}

BEGIN_MESSAGE_MAP(Output, CDialog)
END_MESSAGE_MAP()

// Output message handlers
void Output::AssignDlgToPtr1()
{
        m_d_hvmid1.Format(_T("%f"), Cptr.HV_Tmid_1);
        m_d_hvmid2.Format(_T("%f"), Cptr.HV_Tmid_2);
        m_d_hvmid3.Format(_T("%f"), Cptr.HV_Tmid_3);
        m_d_hvmid4.Format(_T("%f"), Cptr.HV_Tmid_4);
        m_d_lvmid1.Format(_T("%f"), Cptr.LV_Tmid_1);
        m_d_lvmid2.Format(_T("%f"), Cptr.LV_Tmid_2);
        m_d_lvmid3.Format(_T("%f"), Cptr.LV_Tmid_3);
        m_d_lvmid4.Format(_T("%f"), Cptr.LV_Tmid_4);
}

输出也显示为空,因为

void CThermalToolDlg::OnCalculate()
{
    UpdateData();
    if (!Validate()) return;
    AssignDlgToPtr();
    Cptr.OnCalculate();
    // need to add something here to run Output Dialog class before displaying output box
    // AssignDlgToPtr1() is not a member in this class;
    Output Dlg;
    Dlg.DoModal();
    UpdateData(FALSE);
}

我希望在输出对话框中打印字符串值。如果有人能为我提供正确的代码或指出我正确的教程,我将不胜感激。

你提到CPtr的成员是双打。假设m_d_?vmid?成员变量被声明为 CString ,您可以使用:

void Output::AssignDlgToPtr1()
{
    m_d_hvmid1.Format( _T("%f"), Cptr.HV_Tmid_1 );
    m_d_hvmid2.Format( _T("%f"), Cptr.HV_Tmid_2 );
    m_d_hvmid3.Format( _T("%f"), Cptr.HV_Tmid_3 );
    m_d_hvmid4.Format( _T("%f"), Cptr.HV_Tmid_4 );
    m_d_lvmid1.Format( _T("%f"), Cptr.LV_Tmid_1 );
    m_d_lvmid2.Format( _T("%f"), Cptr.LV_Tmid_2 );
    m_d_lvmid3.Format( _T("%f"), Cptr.LV_Tmid_3 );
    m_d_lvmid4.Format( _T("%f"), Cptr.LV_Tmid_4 );
}

问题中添加更多代码后更新AddignDlgToPtr1()永远不会被调用。对话框本身不知道何时调用它。最好的方法可能是覆盖OnInitDialog

BOOL Output::OnInitDialog()
{
   CDialog::OnInitDialog();
   AssignDlgToPtr1();
   UpdateData(FALSE);
   return TRUE;  // return TRUE unless you set the focus to a control
   // EXCEPTION: OCX Property Pages should return FALSE
}

或者,您也可以覆盖 UpdateData(...( 方法,但由于您只想显示结果并且看起来您不关心编辑,因此上述方法最简单。

此外,"UpdateData(FALSE("在对话框关闭后在调用方代码中执行...该行代码不是必需的。

另一种选择是将调用代码更改为:

void CThermalToolDlg::OnCalculate()
{
    UpdateData();
    if (!Validate()) return;
    AssignDlgToPtr();
    Cptr.OnCalculate();
    // need to add something here to run Output Dialog class before displaying output box
    // AssignDlgToPtr1() is not a member in this class;
    Output Dlg;
    Dlg.AssignDlgToPtr1();
    Dlg.DoModal();
    // UpdateData(FALSE);
}

。假设AddignDlgToPtr1((是公开的...