【问题标题】:MFC OK/Cancel Dialog Button Override?MFC 确定/取消对话框按钮是否覆盖?
【发布时间】:2011-06-20 17:04:57
【问题描述】:

语言: C++

开发环境:Microsoft Visual C++

使用的库: MFC

对 MFC 还很陌生,所以请耐心等待。我有一个通过 DoModal() 启动的对话框。我正在尝试向此对话框添加按钮,以替换默认的“确定”和“取消”按钮。现在,我无法完全弄清楚如何做到这一点。我删除了 OK 和 Cancel 按钮,并添加了具有新 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");
}

【问题讨论】:

  • @Jon:您需要发布一些演示问题的代码,并说明“我无法让它工作”的意思。
  • 我已经添加了一些代码。如果还不清楚,请告诉我。
  • @Rup 编辑了上面的代码以反映我以前拥有的也不起作用的代码。
  • 点击保存后,您能看到返回的值是多少吗?除非您将 ::SaveOne 处理程序连接到消息映射宏中,否则您的处理程序将无法工作 - 不记得您需要的语法,抱歉,但类向导应该为您完成。
  • ... 并且处理函数需要在对话框类上,而不是在调用类上。

标签: c++ button mfc


【解决方案1】:

要连接您的对话框以终止并返回 IDSAVEONE,您需要向 Save One 按钮添加一个单击处理程序并让它调用 EndDialog:

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

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

ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::OnBnClickedSaveone)

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

【讨论】:

  • 我决定授予您最佳答案,因为您引导我完成了它......我实际上是根据您的评论来解决这个问题的,AJ 发布了类似的内容。我希望我能把它给你们俩,但我会把它给你们的:)
  • 谢谢,我也为 AJG +1。抱歉,我花了这么长时间才弄清楚 - 我已经多年没有使用 MFC 了。
【解决方案2】:

MFC 为确定和取消按钮内置了 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
}

【讨论】:

  • 需要注意的是,如果您按下 Esc 键或单击对话框右上角的关闭 (X) 按钮,也会调用 OnCancel。
  • @Mark 注意,同样设置为接受按钮的按钮将在按 Enter 时触发,默认为OnOK。我相信这个属性被命名为 Default Button
猜你喜欢
  • 2013-06-18
  • 1970-01-01
  • 2012-01-10
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多