【问题标题】:Read text from edit control in MFC and VS2010从 MFC 和 VS2010 中的编辑控件中读取文本
【发布时间】:2012-06-19 10:09:55
【问题描述】:

我正在编写一个带有对话框窗口和一些按钮的简单 MFC 应用程序。 我还添加了一个编辑控件,以便用户插入文本字符串。

我想读取存在于编辑控件中的值并将其存储在字符串中,但我不知道该怎么做。

我没有编译错误,但我总是只读一个“。”标记。

我在文本编辑控件中添加了一个变量名filepath1,代码如下:

    // CMFC_1Dlg dialog
    class CMFC_1Dlg : public CDialogEx
    {
    // Construction
    public:
        CMFC_1Dlg(CWnd* pParent = NULL);    // standard constructor

    // Dialog Data
        enum { IDD = IDD_MFC_1_DIALOG };

        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


    // Implementation
    protected:
        HICON m_hIcon;

        // Generated message map functions
        virtual BOOL OnInitDialog();
        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
        afx_msg void OnPaint();
        afx_msg HCURSOR OnQueryDragIcon();
        DECLARE_MESSAGE_MAP()
    public:
        afx_msg void OnBnClickedButton1();
        afx_msg void OnBnClickedButton2();
        afx_msg void OnEnChangeEdit1();
        CString filePath1;
    }

    //...
void CMFC_1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialogEx::OnSysCommand(nID, lParam);
    }
}

    CMFC_1Dlg::CMFC_1Dlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CMFC_1Dlg::IDD, pParent)
        ,filePath1(("..\\Experiments\\Dirs\\"))
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }

    void CMFC_1Dlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
        DDX_Text(pDX, IDC_EDIT1, filePath1);

    }

    // then i try to get the string value with
    CString txtname=filePath1;
    _cprintf("Value %s\n", txtname); // but i always read just a "."

【问题讨论】:

  • 首先需要添加控制编辑框的控制变量。这样你就可以使用变量来读取文本了。
  • 是的,我已经按照主题中的说明添加了它。问题是这样我只能读取第一个字符而不是整个字符串。例如,如果我在文本框中写“Hello”,txtname 只包含“H”
  • 我没有看到 CEdit 变量。
  • 说实话,我对 CEdit 变量不是很了解。当我将变量添加到文本控件时,VS 将 CEdit 变量添加到我,但它不是字符串变量,那么我必须如何使用它?

标签: c++ visual-studio-2010 user-interface mfc


【解决方案1】:
_cprintf("Value %S\n", txtname.GetString());

注意大写的“S”

或者你可以投射:

_cprintf("Value %S\n", (LPCTSTR)txtname);

最好使用编辑控件。要创建CEdit变量,在VS中的编辑框上右击选择“添加成员变量”,给变量起个名字,然后点击确定。

然后您可以像这样检索编辑框中的文本:

CEdit m_EditCtrl;
// ....
CString filePath1 = m_EditCtrl.GetWindowText()

【讨论】:

  • 是的,现在可以了。但是,我意识到它总是打印初始值。如果我手动更改编辑控件中的文本值,它会继续显示旧值。使用:filePath1(("..\\Experiments\\Dirs\\")) 如果我删除它并插入一个新值,它总是打印旧值。是否有可能刷新存储用户输入的新值?
  • 我不确定这是否是所有代码,但我没有看到 CEdit 变量。您可以使用该变量通过CEdit::GetWindowText() 在编辑框中获取文本。创建CEdit变量,在VS中的编辑框右击,选择“添加成员变量”。
  • 我在 CMFC_1Dlg 中有 CEdit filePath1 变量:public CDialogEx 但我不知道如何使用它。我不需要一个字符串值来存储文本吗?
  • 您提供的代码显示 filePath1 的类型为 CString,而不是 CEdit
  • 是的,我在复制代码时犯了一个错误。可以用 GetDlgItemText(IDC_EDIT1, Edit1); 解决其中 IDC_EDIT1 是文本框。 CString 文本名称; GetDlgItemText(IDC_EDIT1, txtname); _cprintf("值 %S\n", txtname.GetString());它现在似乎工作..
【解决方案2】:

我认为您的原始代码可以用于 DDX 和 CString。使用控制变量并避免使用 DDX/DDV 函数的建议实际上是一种偏好,而不是问题。

我怀疑您正在使用 UNICODE 库进行编译,但显式调用了 ASCII 函数 _cprintf。 UNICODE 保存为两个字节,对于 ASCII 字符,其中一个为 0。如果将其传递给 ASCII 字符串函数,它将在第一个字符之后停止。

如果您使用的是 UNICODE,则调用_cwprintf 或使用tchar.h_tcprintf,它将调用编译器开关的正确版本。

提示:如果您只针对 UNICODE 并且永远不需要 MBCS 支持,那么请避免使用 tchar.h 宏,因为它们会掩盖 charTCHAR 数据类型混合的任何问题。

【讨论】:

    【解决方案3】:

    第 1 步:使用“添加变量列表”创建 CEdit 控制变量。 第 2 步:使用 GetDlgItemText() 保存该命令控件的文本。

    示例:如CEdit控制列表变量为mc_strChatPane,则GetDlgItemText(mc_strChatPane, message) 其中message为用户定义的CString变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多