在CDialog中应用按钮

时间:2014-10-15 04:55:22

标签: c++ visual-c++ mfc dialog modal-dialog

我有一个对话框,按下按钮OK后,程序使用对话框中的数据绘制图表。我需要绘制绘图而不必像IDOK一样关闭对话框,因此应用按钮。 绘制对话框的代码是,

INT_PTR val = dlg->DoModal();
if (    val == IDOK) {
  //draw plot
}

onOK和onApply的代码

void DLg::OnOK() {

    GetDataGrid();
    CDialog::OnOK();
}

void DLg::OnBnClickedApply()
{
    GetDataGrid();
}

如何在不关闭对话框的情况下让DoModal()在onApply()上返回值?

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

模态对话框无法返回值并使对话框保持打开状态。您可以将对话框设置为非模态,或者在主窗口中发布来自OnBnClickedApply函数的消息,使其绘制绘图。

答案 1 :(得分:1)

我倾向于将绘图放入一个单独的线程中,并在需要的地方调用它。所以你可以

(1)再次在“应用”按钮中调用OnDrawPlot

if (    val == IDOK) {
   AfxBeginThread(...);//draw plot
}
void DLg::OnBnClickedApply()
{
   AfxBeginThread(...);//draw plot
}

(2)使用EndDialog方法将返回值发送回DoModal

What parameters are there in EndDialog ? 可以找到一个示例here.

答案 2 :(得分:1)

CDialog派生类中声明一个变量,最好是public。然后只需OnOK将此变量赋值为适当的值。调用者可以直接使用它。

class Dlg : public CDialog
{
public:
   int TheVariable;
...
};

致电网站:

if(dlg.DoModal()==IDOK)
{
    dlg.TheVariable; // Use the variable
}

但是,如果您需要绘制对话框本身(而不是其他已启动对话框的窗口),则不要调用CDialog::OnOK或{{1}在EndDialog覆盖中在这种情况下,您需要在对话框中进行绘画。