繁体   English   中英

MFC CString:双重不显示

[英]MFC CString: double not displaying

我有两个变量m_GridSize和m_TimeDisplay,它们根据此处称为“世界”的变量进行更新。 现在,MFC程序将显示单词“ Grid size:”和“ Time:”,但不会显示双精度的实际值。 我正在使用Visual Studio Community 2013制作Win32 GUI应用程序。

我在使用CString Format函数时遇到麻烦。

编辑以包含完整代码:

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

}

有什么方法可以解决此问题,以使double的值显示在GUI中? 我已经尝试过这里显示的答案

C ++ MFC转换为CString

但数字根本不显示。 没有语法错误。 如果我使用%d并将值替换为整数,则该代码有效,但不适用于double值,这是我在初始类中使用的值。

我已经解决了这个问题。

事实证明,这个问题与我的GUI有关。 事实证明,静态文本在Visual Studio对话框编辑器中有设置的长度设置(可通过资源视图访问),并且长度太短,无法容纳包含“ Grid size:”的字符串和实际数字。 (最初的两个静态文本最初只能容纳两个数字),我通过在GUI中扩展静态文本的宽度来修复它,从而解决了该问题。

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

顾名思义, Static文本控件一旦创建就不会更改。 当您使用SetWindowText更改其内容时,它们不会自动重绘,这是DDX_Text调用以设置新文本的方式。 您需要通知Windows内容已更改,并且控件需要重新粉刷:

GetDlgItem(IDC_ST_GRIDSIZE)->InvalidateRect(NULL);

暂无
暂无

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

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