MFC OK / Отмена отмены кнопки диалога? - PullRequest
2 голосов
/ 20 июня 2011

Язык: C ++

Среда разработки: Microsoft Visual C ++

Используемые библиотеки: MFC

Довольно плохо знаком с MFC, так что терпите меня. У меня есть диалог, который запускается через DoModal (). Я пытаюсь добавить кнопки в этот диалог, которые заменят стандартные кнопки «ОК» и «Отмена». Прямо сейчас я не могу понять, как это сделать. Я удалил кнопки «ОК» и «Отмена» и добавил новые с новыми идентификаторами, добавленными обработчиками событий и просто небольшим простым кодом для их выполнения при нажатии, но не смог заставить его работать.

Я подозреваю, что это как-то связано с тем, что DoModal () ожидает ответы от OK или Отмена, но больше ничего. Я не совсем уверен, хотя. Любая помощь будет принята с благодарностью!

РЕДАКТИРОВАТЬ: добавлен сокращенный код для справки.

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 ]

5 голосов
/ 20 июня 2011

Чтобы подключить ваш диалог к ​​завершению и возврату IDSAVEONE, вам нужно добавить обработчик кликов к кнопке «Сохранить один» и вызвать его EndDialog:

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

Если вы добавляете обработчик кликов через диалоговое окноредактор (например, дважды щелкнув по вашей кнопке), после чего будет сгенерирован необходимый каркасный код для подключения;в противном случае вам нужно будет добавить следующую строку в ваш BEGIN_MESSAGE_MAP раздел в вашем диалоговом классе:

ON_BN_CLICKED(IDSAVEONE, &CSAPrefsDialog::OnBnClickedSaveone)

, но (поскольку AJG85 просто опередил меня в публикации) в зависимости от того, какая операция выполняется, как быстро она выполняетсяи хотите ли вы сообщать об ошибках в диалоговом окне настроек или нет, вы можете вместо этого просто выполнить дополнительную функцию в обработчике, на который нажали.

3 голосов
/ 20 июня 2011

MFC имеет встроенные идентификаторы для кнопок ОК и Отмена.Это IDOK и IDCANCEL.Вы можете обрабатывать их в переключателе с помощью возврата DoModal() или, возможно, лучше было бы переопределить OnOK() и OnCancel() методы в вашем диалоговом классе, чтобы делать то, что вы хотите.добавив строку в карту сообщений для вызова вашего обработчика:

Edit: То же самое работает для кнопок, которые вы добавляете в диалог, который я добавил в мой пример кода ниже:

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
}
...