MFC OK/Cancel对话框按钮重载?

3

语言: C++

开发环境: Microsoft Visual C++

使用的库: MFC

我对MFC还比较新,所以请谅解。我有一个通过DoModal()启动的对话框。我试图向该对话框添加按钮,以替换默认的“确定”和“取消”按钮。现在,我无法弄清楚如何做到这一点。我删除了“确定”和“取消”按钮,并添加了具有新ID的新按钮,添加了事件处理程序,并为它们编写了一些简单的代码,以便在按下按钮时执行,但我无法使其正常工作。

我怀疑这与DoModal()期望从“确定”或“取消”获得响应有关,而其他情况则不是。但我不是很确定。任何帮助都将不胜感激!

编辑:参考代码已削减。

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");
}

@Jon:您需要发布一些演示问题的代码,并明确说明“我无法使其工作”的含义。 - razlebe
1
我已经添加了一些代码。如果还不清楚,请告诉我。 - Jon
处理程序函数也需要在对话框类上,而不是调用类上。 - Rup
不,我的意思是在CSAPrefsDialog类的BEGIN_MESSAGE_MAP部分中使用ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::SaveOne)。如果您从对话框编辑器中添加单击处理程序,则会自动为您创建此内容。 - Rup
@Rup 就是这样!我没有添加函数/按钮点击的宏。非常感谢你。 - Jon
显示剩余3条评论
2个回答

5

要将对话框与IDSAVEONE终止并返回关联,您需要向Save One按钮添加单击处理程序,并使其调用EndDialog:

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

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

ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::OnBnClickedSaveone)

但是(正如AJG85刚刚超过我发布)根据操作的类型、速度以及是否想要在首选项对话框中报告错误,您可能希望只在单击处理程序中执行额外的功能。


我决定把最佳答案授予你,因为你帮助我理清了思路...我实际上是根据你的评论找到了解决方法,AJ也发表了类似的内容。我希望能够给你们两个都,但我会选择你 :) - Jon
+1:对于 EndDialog,我没有将其作为选项留给他关闭并信号保存按钮被点击。 - AJG85
谢谢,我也给AJG加一分。很抱歉我花了这么长时间才弄清楚 - 我已经好几年没用MFC了。 - Rup

4
MFC内置了确定和取消按钮的ID,分别为IDOK和IDCANCEL。您可以通过DoModal()的返回值在switch语句中处理它们,或者更好的方法是覆盖对话框类中的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
}

3
需要注意的是,如果您按下Esc键或单击对话框右上角的关闭(X)按钮,OnCancel也会被调用。 - Mark Ransom
@Mark 好的注意,同样设置为接受按钮的按钮将在按下 Enter 键时触发,默认情况下是 OnOK。我相信此属性的名称为“默认按钮”。 - AJG85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接