【问题标题】:How to get the value of a text box in MFC when the text box contains a float value当文本框包含浮点值时如何在MFC中获取文本框的值
【发布时间】:2019-03-12 04:48:36
【问题描述】:

我正在 MFC 中编写程序,但遇到了一个问题。我有一个使用 Visual Studio 中的工具栏创建的文本框。

我的文本框ID是IDC_TEXT1,我需要从文本框中获取值(float不是string强>)。我该怎么做?

【问题讨论】:

    标签: c++ visual-studio mfc


    【解决方案1】:

    您可以通过调用GetDlgItemTextstd::stod 来获取值,如下例所示:

    class CAboutDlg : public CDialogEx
    {
        CString m_txt;
        double m_num;
    public:
        CAboutDlg() noexcept;
    
    // Dialog Data
    #ifdef AFX_DESIGN_TIME
        enum { IDD = IDD_ABOUTBOX };
    #endif
    
    protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnBnClickedOk();
    };
    
    CAboutDlg::CAboutDlg() noexcept : CDialogEx(IDD_ABOUTBOX)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
        ON_BN_CLICKED(IDOK, &CAboutDlg::OnBnClickedOk)
    END_MESSAGE_MAP()
    
    // App command to run the dialog
    void CSO55114372App::OnAppAbout()
    {
        CAboutDlg aboutDlg;
        aboutDlg.DoModal();
    }
    
    // CSO55114372App customization load/save methods
    
    void CSO55114372App::PreLoadState()
    {
        BOOL bNameValid;
        CString strName;
        bNameValid = strName.LoadString(IDS_EDIT_MENU);
        ASSERT(bNameValid);
        GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT);
        bNameValid = strName.LoadString(IDS_EXPLORER);
        ASSERT(bNameValid);
        GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EXPLORER);
    }
    
    void CSO55114372App::LoadCustomState()
    {
    }
    
    void CSO55114372App::SaveCustomState()
    {
    }
    
    // CSO55114372App message handlers
    
    void CAboutDlg::OnBnClickedOk()
    {
        GetDlgItemText(IDC_EDIT2, m_txt);
        std::wstring s((LPCTSTR)m_txt);
        m_num = std::stod(s);
        CDialogEx::OnOK();
    }
    

    【讨论】:

    • 感谢帮助。但是 m_num = std::stod(s);对我不起作用,所以我改写了这个(双)_wtof(s.c_str());
    • 不客气。你也可以使用 std::stof() 但它对你很有用!
    【解决方案2】:

    我只是想向您展示将编辑控件映射到float 值的第二种方式。这是通过使用ClassWizard

    • 右键单击控件并选择添加变量...

    • 设置变量categoryvalueaccessprivate,指定name 最后将变量类型设置为float

    • 点击下一步(如果需要)并设置数字范围进行输入。

    • 点击完成

    查看DoDataExchange 方法。它看起来像这样:

    void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, m_fValue);
        DDV_MinMaxFloat(pDX, m_fValue, 1, 100);
    }
    

    当您需要使用编辑控件的当前值时,输入UpdataData(TRUE); 这会将变量编辑控件的内容同步。调试模式下的断点示例:

    【讨论】:

    • 在您的回答中,当我单击按钮时,如何将文本框的值设置为零?我的文本框名称是 m_txt1
    • 您只需将变量赋值为零,然后调用 UpdateData(FALSE) 即可更新控件。
    • 我尝试过像这样使用m_txt1.SetString(0)并添加了UpdateData(FALSE)但它不起作用
    • 没有。请记住,我们已将控件映射到浮点变量。您将浮点变量赋值为 0。
    • 先生,我已经得到了答案。谢谢你的帮助。我是根据你的建议做的,我得到了结果,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2014-07-28
    • 2014-04-25
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多