【问题标题】:How do I Send global value between two dialog如何在两个对话框之间发送全局值
【发布时间】:2013-06-21 07:24:33
【问题描述】:

现在,我在两个对话框中有两个结构如下

GetDialog.h
struct GetDlgData{
int     nStatic1;
int     nStatic2;
CString strEdit1;   
CString strEdit2;       
};
GetDlgData g_structData;
CStatic m_staticGet1;
CStatic m_staticGet2;
CEdit m_editGet1;
CEdit m_editGet2;
void SetGetValue();
GetDlgData GetGetValue(){return g_structData;}
virtual BOOL OnInitDialog();

DoModalGetDataDlg.h
struct DoData {
  int   nStatic1;
  int   nStatic2;
  CString strEdit1; 
  CString strEdit2;     
};
CStatic m_staticDo1;
CStatic m_staticDo2;
CEdit m_editDo1;
CEdit m_editDo2;
DoData g_structData;
void SetDoValue();  
DoData GetDoValue() { return g_structData;}
afx_msg void OnBnClickedButtonDo();

我想将值发送到另一个对话框,保存在结构中

DoModalGetDataDlg.cpp
void CDoModalGetDataDlg::SetDoValue()
{
CString strTemp;

strTemp.Empty();
m_staticDo1.GetWindowText(strTemp);
g_structData.nStatic1 = _ttoi(strTemp);

strTemp.Empty();
m_staticDo2.GetWindowText(strTemp);
g_structData.nStatic2 = _ttoi(strTemp);

m_editDo1.GetWindowText(g_structData.strEdit1);

m_editDo2.GetWindowText(g_structData.strEdit2);
}

void CDoModalGetDataDlg::OnBnClickedButtonDo()
{
DoData structData;
SetDoValue();

CGetDialog GetDlg;
GetDlg.DoModal();
}

对话框初始化时在GetDlg.cpp中获取数据

BOOL CGetDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetGetValue();

return TRUE;  // return TRUE unless you set the focus to a control
}

void CGetDialog::SetGetValue()
{
 CDoModalGetDataDlg DoDlg(AfxGetMainWnd());
 memcpy(&g_structData, &DoDlg.GetDoValue(), sizeof(GetDlgData));

 CString strTemp;
 strTemp.Empty();
 strTemp.Format(_T("%d"), g_structData.nStatic1);
 m_staticGet1.SetWindowText(strTemp);

 strTemp.Empty();
 strTemp.Format(_T("%d"), g_structData.nStatic2);
 m_staticGet2.SetWindowText(strTemp);

 m_editGet1.SetWindowText(g_structData.strEdit1);

 m_editGet2.SetWindowText(g_structData.strEdit2);
}

但值是随机的,在 memcpy 区域。怎么解决...

非常感谢!

【问题讨论】:

    标签: mfc struct dialog


    【解决方案1】:

    您对CDoModalGetDataDlg DoDlg(AfxGetMainWnd()); 的调用会创建CDoModalGetDataDlg 的新实例,它不会“连接”到该类的现有实例。

    你可以在调用DoModal()之前设置值,比如

    void CDoModalGetDataDlg::OnBnClickedButtonDo()
    {   DoData structData;
        SetDoValue();
    
        CGetDialog GetDlg;
        memcpy(&GetDlg.g_structData, &GetDoValue(), sizeof(GetDlgData));
        GetDlg.DoModal();
    }
    

    【讨论】:

    • 您是否删除了CGetDialog::SetGetValue() 中的memcpy(&g_structData, &DoDlg.GetDoValue(), sizeof(GetDlgData)); 代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多