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::OnOK
或 EndDialog
987654328@ 覆盖。在这种情况下,您需要在对话框本身中进行绘画。
【讨论】:
以上是关于CDialog中的应用按钮的主要内容,如果未能解决你的问题,请参考以下文章