[英]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中? 我已經嘗試過這里顯示的答案
但數字根本不顯示。 沒有語法錯誤。 如果我使用%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.