CDialog中的应用按钮

Posted

技术标签:

【中文标题】CDialog中的应用按钮【英文标题】:Apply button in CDialog 【发布时间】: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() 上的值?

任何帮助将不胜感激。

【问题讨论】:

【参考方案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@ 覆盖。在这种情况下,您需要在对话框本身中进行绘画。

【讨论】:

以上是关于CDialog中的应用按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2013 中使用 CDialog 类启用按钮的属性页

CDialog更新输入框值

winfrom 点击按钮button弹框显示颜色集

拆分按钮控件在 MFC 对话框中消失

如果代码正确,为什么我在OK按钮上有这些错误? [关闭]

多个按钮共用一个消息响应函数