Variables 为mfc窗体控件中的变量赋值

Variables 为mfc窗体控件中的变量赋值,variables,visual-c++,mfc,editbox,Variables,Visual C++,Mfc,Editbox,我使用的是MFC visual studio 2013,我有一个带有两个编辑框X和Y的表单。单击“显示”按钮时,我希望X和Y之和显示在表单的静态文本框中 X+Y=Z X编辑框1 Y编辑框2 Z静态文本框,用于显示结果Z 标题(.h) 在标题中添加此函数:单击时将调用此函数 afx_msg void OnBnClickedDisplay(); 在您的CPP(.CPP) 添加侦听器 BEGIN_MESSAGE_MAP(CStackOverFlowDlg, CDialogEx) ON_B

我使用的是MFC visual studio 2013,我有一个带有两个编辑框X和Y的表单。单击“显示”按钮时,我希望X和Y之和显示在表单的静态文本框中

X+Y=Z

X编辑框1 Y编辑框2 Z静态文本框,用于显示结果Z

标题(.h)
在标题中添加此函数:单击时将调用此函数

afx_msg void OnBnClickedDisplay();
在您的CPP(.CPP)
添加侦听器

BEGIN_MESSAGE_MAP(CStackOverFlowDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_DISPLAY, OnBnClickedDisplay) // Add listener
END_MESSAGE_MAP()
此部件是在您完成“添加变量”后自动生成的

计算功能

void CStackOverFlowDlg::OnBnClickedDisplay()
{
    
    UpdateData (TRUE);// Load Data From dialog to Variables
    
    int iResult = m_x+m_y;// Calculate Somme

    // Formatting
    CString strResult;
    strResult.Format(_T("%d"), iResult);

    // Update result on Dialog
    GetDlgItem (IDC_STATIC_RESULT)->SetWindowTextA(strResult);
}

陆地追踪者给出了一个很好的开始。不过,我在一个关键方面与他的解决方案不同

与使用
GetDlgItem
直接处理值不同,我将为静态控件添加一个变量(您已经给ID
IDC\u static\u RESULT
)。它将与您已经创建的
mux
muy
差不多,但显然有其他名称(例如
muz

然后是一个关键点。当您将
value
类型变量与编辑/静态控件(或其他控件,但这些是我们现在关心的)关联时,MFC使用名为
UpdateData
的函数在控件和关联变量之间移动数据。调用
UpdateData()
更新数据(真),将数据从控件复制到关联变量中。调用
UpdateData(false)
将数据从变量复制到控件中

在您的按钮处理程序中,您会希望这样做,因此会出现如下结果:

void CaddDlg::OnBnClickedButton1()
{
UpdateData();//从控件获取数据
m_z=m_x+m_y;//计算新值
UpdateData(false);//将更新的数据推回到控件
}

在这种情况下,这已经足够好了,但是对于一个复杂的对话框,
UpdateData
内容可能会很快变得非常陈旧,尤其是当您拥有相互交互的控件时。在这种情况下,通常最好忽略
变量,只使用表示控件本身的
控件
变量,这样就可以单独读取和写入控件(而
UpdateData
总是将所有控件中的值复制到相关变量中,反之亦然).

您的问题不完整。您对从控件中获取和放置数据有什么问题?我通常使用只读的CEdit框,而不是使用静态框。这样,最终用户可以选择/复制框中的内容。不能对静态控件执行复制操作,但可以对CEdit控件执行复制操作。只读是资源标志之一。你说它是MFC,但你标记它为winforms?它是MFC应用程序,对话框。还有几件事。应该避免使用
GetDlgItem
,除非专门化
DDX
处理程序。应使用控制成员。应避免调用
UpdateData
。如果这是一个更大的画面的一部分,其他数据将被无意中修改。否则,你在这里做了很多工作@确实,我同意你的看法。我不是getDlgItem和UpdateData的超级粉丝,但我只是想为他简化一些事情,你也可以使用GetDlgItemText。请参阅:将对updatedata的调用数乘以性能如何?非常感谢你!非常感谢。它正在工作。@landstapper:UpdateData花费的大部分时间都在调用
SetWindowText
中。换句话说,您几乎只是在重新发明(部分)
UpdateData
。作为一个或多或少的独立点,我们也在这里处理用户交互,因此只要对话框在不到20毫秒的时间内更新,它看起来就是即时的——而且
UpdateData
足够快,即使在25 MHz 486上运行的控件远多于您应该一次显示的控件。
void CStackOverFlowDlg::OnBnClickedDisplay()
{
    
    UpdateData (TRUE);// Load Data From dialog to Variables
    
    int iResult = m_x+m_y;// Calculate Somme

    // Formatting
    CString strResult;
    strResult.Format(_T("%d"), iResult);

    // Update result on Dialog
    GetDlgItem (IDC_STATIC_RESULT)->SetWindowTextA(strResult);
}