2014-12-29 4 views
1

У меня есть поле CEdit в моем диалоговом окне, где я реализовал EN_KILLFOCUS, поэтому, когда пользователь вводит неверные данные, предупреждающее сообщение отображается, когда фокус отходит от этого поля и возвращается фокус в поле CEdit, чтобы пользователь мог ввести правильные данные. Если пользователь вводит неверные данные и нажимает кнопку «ОТМЕНА», то также отображается предупреждающее сообщение, которое нежелательно, потому что пользователь все равно пытается отменить свои действия. Я попытался реализовать PostQuitMessage, когда пользователь нажимает кнопку CANCEL, но это закрывает все приложение. Я хочу, чтобы только мой диалог закрывался, когда пользователь нажимает кнопку ОТМЕНА. Есть ли способ закрыть диалоговое окно сразу после нажатия кнопки ОТМЕНА. Это код, который я пробовал.Закройте диалоговое окно, нажав кнопку ОТМЕНА, игнорируя EN_KILLFOCUS

void CMARPropWnd::OnParentNotify(UINT message, LPARAM lParam) 
{ 
    CCDialog::OnParentNotify(message, lParam); 
    // TODO: Add your message handler code here 
    CPoint ptButtonDown(LOWORD(lParam),HIWORD(lParam)); 
    if ((message == WM_LBUTTONDOWN) && (ChildWindowFromPoint(ptButtonDown) == GetDlgItem(eMARPropWndCancelBtnId))) 
    { 
     PostQuitMessage(0); 
    } 
} 
+0

Vaidation уже реализован в другом проекте. Я ничего не могу с этим поделать :) По-настоящему оценим, есть ли какое-то решение –

+0

Вы пробовали отправить сообщение WM_CLOSE? – rrirower

ответ

0

Попытка

OnCancel(); 

вместо PostQuitMessage (0);

Обратите внимание, что OnCancel() является виртуальным методом CDialog, поэтому это «самый правильный» и будет делать любой специальный код, который может переопределить поведение CDialog по умолчанию.

+0

На самом деле OnCancel пытается закрыть диалог, реализуя EndDialog(). EndDialog перемещает фокус клавиатуры от поля CEdit, и это снова делает проверку подлинности и отображает предупреждающее сообщение, которое здесь не требуется. Так есть ли что-то другое, кроме EndDialog, которое можно использовать здесь? –

+0

Добавьте bool member 'm_bInsideOnCancel', установив его на' false' в ctor. Переопределите 'OnCancel()', установите 'm_bInsideOnCancel' в' true', затем вернитесь к вызову 'BASE_CLASS :: OnCancel();'. В методе уведомления EN_KILLFOCUS перед обработкой убедитесь, что '! M_bInsideOnCancel'. Будет ли это работать? – franji1

+0

Спасибо за ответ, но на самом деле EN_KILLFOCUS реализован в другом проекте, и у меня нет доступа к его модификации. Я не могу обработать его без добавления этой переменной-члена? –

Смежные вопросы