如何根据父对话框中设置的变量在子 MFC 对话框中显示值?

Posted

技术标签:

【中文标题】如何根据父对话框中设置的变量在子 MFC 对话框中显示值?【英文标题】:How to display values in child MFC dialog box based on variables set in parent dialog box? 【发布时间】:2014-11-09 20:37:46 【问题描述】:

我正在处理一个 MFC 项目。在主对话框中,有一个按钮可以打开子对话框以供某些用户输入。然后,当在子框中单击“确定”时,此数据将设置为父对话框中的变量。这一点都工作得很好。

现在子框中的文本框初始化为子对话框的 OnInitDialog() 中的预设值。我希望这些值初始化为它们当前在父对话框中连接到的任何变量。

因此,例如,我有一个文本框,它设置在名为 sampleCount 的整数变量中。在我的子对话框中(仅显示此变量的代码)

void ChildBox::DoDataExchange(CdataExchange* pDX)

    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_SAMPCOUNT, sampCnt);


BOOL FNameIn::OnInitDialog()

    CDialog::OnInitDialog();
    GetDlgItem(IDC_SAMPCOUNT)->SetWindowTextA("1");
    return TRUE;

然后在我的父对话框中

void ParentDialog::OnInput()

    ChildBox dlg;
    if (dlg.DoModal() == IDOK)
    
        sampleCount = dlg.sampCnt;
    

正如我所说,这段代码一切正常,但每次我打开 ChildBox 时,sampleCount 文本框都会设置为 1。如果我输入 20,然后点击确定并将 ParentDialog 中的 sampleCount 变量设置为 20 我希望它下次打开子对话框时,在文本框中显示 20。该变量也可以由 ParentDialog 中的另一个函数自动设置,因此子对话框中输入的最后一个值并不总是正确的,它需要使用 ParentDialog 中变量 sampleCount 的当前值。

我觉得这应该很简单,但我不太明白,谢谢你的帮助。

【问题讨论】:

对不起,我在复制代码时犯了一个错误。 sampleCount 是在 ParentDialog 的初始化时声明的,所以它不会消​​失。编辑我的问题以摆脱大括号内的 int 。 另外,我在研究中遇到过几次该链接,但我无法完全弄清楚我需要什么。我可能只是没有完全理解它,或者它没有完全涵盖我需要的东西,但无论哪种方式,我似乎都无法从中得到答案。 【参考方案1】:

修改子对话框的构造函数以接受 CString 参数并将其存储到子对话框的 sampCnt 变量中。然后 MFC 代码会因为 DDX_Text 语句将其显示在控件中。

【讨论】:

【参考方案2】:

去掉GetDlgItem(IDC_SAMPCOUNT)->SetWindowTextA("1");这一行,在调用dlg.DoModal()之前设置值,比如

ChildBox dlg;
dlg.sampCnt = sampleCount;
if (dlg.DoModal() == IDOK)
   sampleCount = dlg.sampCnt;

【讨论】:

【参考方案3】:

我认为您正在创建 ChildBox 对话框的局部变量 所以,即使你给它的变量赋值,它也不会起作用。

而是创建一个ChildBox Dialog的指针变量

void ParentDialog::OnInput()

ChildBox *dlg;
if (dlg->DoModal() == IDOK)

    sampleCount = dlg->sampCnt;

dlg = NULL ;

【讨论】:

以上是关于如何根据父对话框中设置的变量在子 MFC 对话框中显示值?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问父类mfc上的变量

MFC 一个对话框类调用另一个类的成员变量

MFC如何将窗口中所有控件大小随父窗口大小改变

如何在基于 MFC 对话框的应用程序中设置主对话框的大小

MFC中怎么让子窗体大小随着父窗口的大小变化而改变?

在 MFC 中拖动子对话框时如何移动父对话框?