Диалог, полученный из CDialog, возвращает -1 после DoModal (MFC / C ++) - PullRequest
0 голосов
/ 11 января 2011

Я создал диалог, созданный на основе CDialog (MFC делает это автоматически), но мне пришлось переопределить метод OnInitDialog, чтобы выполнить инициализацию ComboBox:

BOOL CLogin::OnInitDialog()
{
 CDialog::OnInitDialog();

 InitCommonControls();

 if ( FillInCombo() != 0 )
  //erro ao tentar ler leitoras
  return TRUE;

 return TRUE;
}

Метод FillInCombo вызывает класс PCSC для заполнения этой комбинации всеми доступными устройствами чтения смарт-карт.

Однако при отладке происходит странное поведение. При попытке выбрать элемент в комбо, он закрывается автоматически (фактически генерирует событие OnClose), а DoModal возвращает -1.

Затем, затем, приложение больше никогда не будет загружено правильно, если я не очистлю решения и не соберу его заново.

 CLogin SmartNetData;
 int ret = SmartNetData.DoModal();
 switch ( ret )
 {
    case IDOK:
    break;
    case -1: 
    // strange error
    OnOK();
    return TRUE;
    case IDABORT:
    case IDCANCEL:
    OnOK();
    return TRUE;
 };

Спасибо за любую возможную помощь в этом.

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Я понял, что проблема возникает из-за выпадающего списка. Я не уверен почему. Я заменил его на ListBox, и я не получаю проблем.

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Я подозреваю, что что-то идет не так в вашем OnInitDialog ().

Я предлагаю вам перейти к этапам отладки:
а) удалить InitCommonControls () в OnInitDialog ()
б) удалить FillInCombo () в OnInitDialog ()
c) удалить InitCommonControls () и FillInCombo () в OnInitDialog ()

После удаления по одному, проверьте с помощью возвращаемого значения DoModal.

0 голосов
/ 11 января 2011

Я думаю вы делаете InitCommonControls() в неправильном месте.Это должно быть сделано один раз в вашей программе.Он инициализирует библиотеку общих элементов управления.Не элементы управления в вашем диалоге.

Обычно я включаю это в процедуру запуска приложения, прежде чем открывать окна.

...