简体   繁体   English

MFC CString:双重不显示

[英]MFC CString: double not displaying

I have two variables, m_GridSize and m_TimeDisplay, which update themselves according to a variable called "world" here. 我有两个变量m_GridSize和m_TimeDisplay,它们根据此处称为“世界”的变量进行更新。 Now, the MFC program will display the words "Grid size: " and "Time: ", but it will not display the actual values of the doubles. 现在,MFC程序将显示单词“ Grid size:”和“ Time:”,但不会显示双精度的实际值。 I am using Visual Studio Community 2013 to make a Win32 GUI application. 我正在使用Visual Studio Community 2013制作Win32 GUI应用程序。

I am having trouble with the CString Format function. 我在使用CString Format函数时遇到麻烦。

EDIT to include full code: 编辑以包含完整代码:

// smart_parking_guiDlg.cpp : implementation file
//

#include "stdafx.h"
#include "smart_parking_gui.h"
#include "smart_parking_guiDlg.h"
#include "afxdialogex.h"
#include "Cadd_Destination.h"
#include "Cadd_Lot.h"
#include "Cadd_Driver.h"
#include "Commands.h" // Used to handle commands
#include "Grid.h" // Contains the grid
#include <string>
#include <io.h>
#include <fcntl.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// Csmart_parking_guiDlg dialog



Csmart_parking_guiDlg::Csmart_parking_guiDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(Csmart_parking_guiDlg::IDD, pParent)
    , m_EchoSize(_T("Grid size: "))
    , m_EchoTime(_T("Time: "))
    , m_EchoStatus(_T("Open"))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        this->world = new Grid(10, 5); // default grid
}

void Csmart_parking_guiDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_ST_GRIDSIZE, m_EchoSize);
    DDX_Text(pDX, IDC_ST_TIME, m_EchoTime);
    DDX_Text(pDX, IDC_ST_STATUS, m_EchoStatus);
}

BEGIN_MESSAGE_MAP(Csmart_parking_guiDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_B_OPEN_CONFIG, &Csmart_parking_guiDlg::OnBnClickedBOpenConfig)
    ON_BN_CLICKED(IDC_B_SAVECONFIG, &Csmart_parking_guiDlg::OnBnClickedBSaveconfig)
    ON_BN_CLICKED(IDC_B_NEXTEVENT, &Csmart_parking_guiDlg::OnBnClickedBNextevent)
    ON_BN_CLICKED(IDC_B_NEWDEST, &Csmart_parking_guiDlg::OnBnClickedBNewdest)
    ON_BN_CLICKED(IDC_B_NEWLOT, &Csmart_parking_guiDlg::OnBnClickedBNewlot)
    ON_BN_CLICKED(IDC_B_NEWDRIVER, &Csmart_parking_guiDlg::OnBnClickedBNewdriver)
    ON_BN_CLICKED(IDC_B_SIMEND, &Csmart_parking_guiDlg::OnBnClickedBSimend)
    ON_BN_CLICKED(IDC_B_SHOWSTATUS, &Csmart_parking_guiDlg::OnBnClickedBShowstatus)
END_MESSAGE_MAP()


// Csmart_parking_guiDlg message handlers

BOOL Csmart_parking_guiDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // 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;
}

// 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 Csmart_parking_guiDlg::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
    {
        CDialogEx::OnPaint();
    }
}

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



void Csmart_parking_guiDlg::OnBnClickedBOpenConfig()
{
    wchar_t szFilters[] = _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||");
    // Create an Open dialog
    CFileDialog fileDlg(TRUE, _T("txt"), _T("*.txt"),
        OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters, this); // Display the file dialog. 

    // When user clicks OK, fileDlg.DoModal() returns IDOK.
    if (fileDlg.DoModal() == IDOK)
    {
        CString m_strPathname = fileDlg.GetPathName();
        CT2CA converter(m_strPathname);
        std::string fileToOpen(converter);
        // TODO: Open Grid file
        open_file(*world, fileToOpen);
        //Change the window's title to the opened file's title.
        CString fileName = fileDlg.GetFileTitle();

        SetWindowText(fileName);
    }
}


void Csmart_parking_guiDlg::OnBnClickedBSaveconfig()
{
    // TODO: Add your control notification handler code here
    // szFilters is a text string that includes two file name filters:
    // "*.my" for "MyType Files" and "*.*' for "All Files."
    TCHAR szFilters[] = _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||");

    // Create a Save dialog
    CFileDialog fileDlg(FALSE, _T("txt"), _T("*.txt"),
        OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);

    // Display the file dialog. When user clicks OK, fileDlg.DoModal() 
    // returns IDOK.
    if (fileDlg.DoModal() == IDOK)
    {
        CString pathName = fileDlg.GetPathName();
        CT2CA converter(pathName);
        std::string fileToWrite(converter);
        // Implement opening and reading file in here.
        write_file(*world, fileToWrite);
        //Change the window's title to the opened file's title.
        CString fileName = fileDlg.GetFileTitle();

        SetWindowText(fileName);
    }
}


void Csmart_parking_guiDlg::OnBnClickedBNextevent()
{
    // TODO: Add your control notification handler code here
    run_simulation(*world);
    m_GridSize = world->getGridSize(); // double
    m_TimeDisplay = world->getTime(); // double
    // THIS DOESN'T WORK
    m_EchoSize.Format(_T("Grid size: %g"), m_GridSize);
    m_EchoTime.Format(_T("Time: %g"), m_TimeDisplay);
    UpdateData(FALSE);
    GetDlgItem(IDC_ST_GRIDSIZE)->InvalidateRect(NULL);
    GetDlgItem(IDC_ST_TIME)->InvalidateRect(NULL); 
}

void Csmart_parking_guiDlg::OnBnClickedBSimend() // On clicking, simulation jumps to the very end.
{
    jump_to_end(*world);
    m_GridSize = world->getGridSize();
    m_TimeDisplay = world->getTime();
    // THIS DOESN'T WORK
    m_EchoSize.Format(_T("Grid size: %g"), m_GridSize);
    m_EchoTime.Format(_T("Time: %g"), m_TimeDisplay);
    UpdateData(FALSE);
    GetDlgItem(IDC_ST_GRIDSIZE)->InvalidateRect(NULL);
    GetDlgItem(IDC_ST_TIME)->InvalidateRect(NULL);
}

void Csmart_parking_guiDlg::OnBnClickedBNewdest()
{
    // TODO: Add your control notification handler code here
    Cadd_Destination Dlg;
    Dlg.DoModal();
}


void Csmart_parking_guiDlg::OnBnClickedBNewlot()
{
    // TODO: Add your control notification handler code here
    Cadd_Lot Dlg;
    Dlg.DoModal();
}


void Csmart_parking_guiDlg::OnBnClickedBNewdriver() // Opens a dialog to input a new driver. Only works with added destination.
{
    if (world->getDestinationCount() != 0) {
        Cadd_Driver Dlg;
        Dlg.DoModal();
    }
}

void Csmart_parking_guiDlg::OnBnClickedBShowstatus()
{
    // TODO: Add your control notification handler code here

}

Is there any way to fix this in order to make the values of the doubles show up in the GUI? 有什么方法可以解决此问题,以使double的值显示在GUI中? I have tried the answer shown here 我已经尝试过这里显示的答案

C++ MFC double to CString C ++ MFC转换为CString

but the numbers do not show up at all. 但数字根本不显示。 There are no syntax errors. 没有语法错误。 The code works if I use %d and replace the values with integers, but it doesn't work with double values, which is what I used in my initial classes. 如果我使用%d并将值替换为整数,则该代码有效,但不适用于double值,这是我在初始类中使用的值。

I have fixed the problem myself. 我已经解决了这个问题。

As it turns out, the issue had more to do with my GUI. 事实证明,这个问题与我的GUI有关。 It turns out that the Static Text has a set length set in the Visual Studio Dialog Editor (accessed through the Resource View) and the length was too short to hold both the string containing "Grid size:" and the actual numbers. 事实证明,静态文本在Visual Studio对话框编辑器中有设置的长度设置(可通过资源视图访问),并且长度太短,无法容纳包含“ Grid size:”的字符串和实际数字。 (The first Static Text initially could only hold one digit for both of them) I fixed it by extending the width of the Static Text in my GUI, and that fixed the problem. (最初的两个静态文本最初只能容纳两个数字),我通过在GUI中扩展静态文本的宽度来修复它,从而解决了该问题。

这些的大小应拉伸以包含更多数字

As implied by the name, Static text controls are not expected to change once they are created. 顾名思义, Static文本控件一旦创建就不会更改。 They don't automatically repaint when you change their content with SetWindowText , which is what DDX_Text calls to set the new text. 当您使用SetWindowText更改其内容时,它们不会自动重绘,这是DDX_Text调用以设置新文本的方式。 You need to inform Windows that the contents have changed and the control needs repainting: 您需要通知Windows内容已更改,并且控件需要重新粉刷:

GetDlgItem(IDC_ST_GRIDSIZE)->InvalidateRect(NULL);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM