【问题标题】:Apply button in CDialogCDialog中的应用按钮
【发布时间】:2014-10-15 04:55:22
【问题描述】:

我有一个对话框,在按下 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() 上的值?

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        CDialog派生类中声明一个变量,最好是public。然后就在OnOK 将此变量分配给适当的值。调用者会直接使用它。

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

        调用站点:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-12
          • 2013-12-01
          • 2018-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多