Как отобразить вывод из файла класса приложения на основе MFC - PullRequest
0 голосов
/ 05 апреля 2019

Я новичок в программировании, я создал приложение GUI на основе MFC и связал переменные с помощью 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);
}

Я ожидаю напечатать строковые значения в диалоговом окне вывода.Если бы кто-то мог предоставить мне правильный код или указать правильный учебник, я был бы благодарен.

1 Ответ

0 голосов
/ 05 апреля 2019

Вы упомянули, что члены 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 () является общедоступным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...