Клавиша ввода не запускает действие кнопки по умолчанию IDOK
У меня есть класс, полученный из CDialog. Его определение интерфейса имеет несколько графических блоков и несколько кнопок после, определенных в файле ресурсов как:
IDD_SELECT_ITEMS DIALOGEX 0, 0, 462, 274
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Select"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
CONTROL "",IDC_ITEM1,"Static",SS_BLACKFRAME,13,18,59,52
//...
CONTROL "",IDC_ITEM18,"Static",SS_BLACKFRAME,373,178,59,52
LTEXT "Select",IDC_STATIC,7,256,40,8
PUSHBUTTON "All",IDC_ALL,47,253,50,14
PUSHBUTTON "None",IDC_NONE,101,253,50,14
PUSHBUTTON "Filter ...",IDC_FILTER,155,253,60,14
DEFPUSHBUTTON "OK",IDOK,353,253,50,14
PUSHBUTTON "Cancel",IDCANCEL,405,253,50,14
END
Когда я запускаю форму, нажатие клавиши Enter не запускает действие, связанное с кнопкой IDOK, потому что кнопка IDC_ALL сфокусирована, а Enter выполняет свое действие, что нежелательно.
В своей процедуре инициализации,
BOOL CSelectDialog::OnInitDialog()
{
CDialog::OnInitDialog();
//...
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Я перепробовал все, чтобы сосредоточиться на кнопке IDOK, но безуспешно. До такой степени, что надоело чередовать комментирование и раскомментирование строк, которые я добавил:
BOOL CSelectParts::OnInitDialog()
{
SendDlgItemMessage(IDOK, DM_SETDEFID, 0);
CDialog::OnInitDialog();
// ...
this->SetDefID(IDOK);
GetDlgItem(IDOK)->SendMessage(BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
SendDlgItemMessage(IDOK, BN_SETFOCUS, 0, 0);
SendDlgItemMessage(IDC_ALL, WM_KILLFOCUS, 0, 0);
SendDlgItemMessage(IDOK, DM_SETDEFID, 0,0);
::SetFocus(GetDlgItem(IDOK)->GetSafeHwnd());
GetDlgItem(IDOK)->SetFocus();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Чем ближе я подошел, тем больше
SendDlgItemMessage(IDOK, WM_SETFOCUS, 0, 0);
который сделал очень странную вещь: он нарисовал прямоугольник фокуса на двух кнопках, как вы можете видеть на картинке:
но клавиша Enter еще не вызывала кнопку по умолчанию!
Я даже пытался добавить метод OnOK
void CSelectDialog::OnOK()
{
__super::OnOK();
}
Пока нет успеха!
Еще один эксперимент: я добавил запись в карту сообщений класса:
ON_COMMAND(IDOK, OnOK)
Все еще неудачно!
Как мне удастся ввести клавишу Enter, чтобы выполнить действие кнопки IDOK?