我有一个对话框,按下按钮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()上返回值?
任何帮助都将不胜感激。
答案 0 :(得分:3)
模态对话框无法返回值并使对话框保持打开状态。您可以将对话框设置为非模态,或者在主窗口中发布来自OnBnClickedApply
函数的消息,使其绘制绘图。
答案 1 :(得分:1)
我倾向于将绘图放入一个单独的线程中,并在需要的地方调用它。所以你可以
(1)再次在“应用”按钮中调用OnDrawPlot
if ( val == IDOK) {
AfxBeginThread(...);//draw plot
}
void DLg::OnBnClickedApply()
{
AfxBeginThread(...);//draw plot
}
(2)使用EndDialog方法将返回值发送回DoModal
答案 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
覆盖中在这种情况下,您需要在对话框中进行绘画。