MFC确定/取消对话框按钮覆盖?

时间:2011-06-20 17:04:57

标签: c++ button mfc

语言: C ++

开发环境: Microsoft Visual C ++

使用的库: MFC

对MFC来说很新,所以请耐心等待。我有一个通过DoModal()启动的对话框。我正在尝试向此对话框添加按钮,以取代默认的“确定”和“取消”按钮。现在,我无法弄清楚如何做到这一点。我删除了“确定”和“取消”按钮,并添加了新的ID,添加了事件处理程序,以及一些简单的代码,以便在按下时执行,但我无法使其工作。

我怀疑它与DoModal()期望OK或Cancel的响应这一事实有关,但没有别的。我不是很确定。任何帮助将不胜感激!

编辑:删除了代码以供参考。

void CPrefsDlg::Launch() {

[ ... ]

  CSAPrefsDialog dlg;

  INT_PTR nRet = -1;
  nRet = dlg.DoModal();

  // Handle the return value from DoModal
  switch ( nRet )
  {
  case -1: 
     AfxMessageBox("Dialog box could not be created!");
     break;
  case IDABORT:
     // Do something
     break;
  case IDOK: // This works just fine.
     exit(0);
     break;
  case IDSAVEONE: // This does not work.
     MessageBox("Save One");
     break;
  default:
     break;
  };
}

void CPrefsDlg::SaveOne()
{
// I tried adding in my own handler for 'Save One'...this does not work.
MessageBox("Save one");
}

2 个答案:

答案 0 :(得分:5)

要连接对话框以终止并返回IDSAVEONE,您需要在“保存一个”按钮上添加一个点击处理程序,并让它调用EndDialog:

void CSAPrefsDialog::OnBnClickedSaveone()
{
    EndDialog(IDSAVEONE);
}

如果你通过对话框编辑器添加点击处理程序(例如双击你的按钮),那么将生成必要的框架代码供你连接;否则,您需要将以下行添加到对话框类的BEGIN_MESSAGE_MAP部分:

ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::OnBnClickedSaveone)

但是(因为AJG85只是打败我发布)取决于操作是什么,速度有多快以及是否要在首选项对话框中报告错误,您可能只想执行额外的功能点击了处理程序。

答案 1 :(得分:3)

MFC内置了ok和cancel按钮的ID。那些是IDOK和IDCANCEL。您可以通过返回DoModal()来处理这些问题,也可以更好地覆盖对话框类中的OnOK()OnCancel()方法来执行您想要的操作。

您可以通过在消息映射中添加一行来调用您的处理程序来执行此操作:

编辑:对于您添加到我在下面的示例代码中添加的对话框的按钮,同样适用:

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ON_BN_CLICKED(IDOK, &OnBnClickedOk)
    ON_BN_CLICKED(IDSAVEONE, &OnBnClickedSave)
END_MESSAGE_MAP()

void MyDialog::OnBnClickedOk()
{
   // do extra stuff when they click OK

   CDialog::OnOK(); // call base class version to complete normal behavior
}

void MyDialog::OnBnClickedSave()
{
   // this would be called for your save button with custom id IDSAVEONE

   // note: no base class call here as it's specific to your dialog
}