#c #mfc
#c #mfc
Вопрос:
Мой файл ресурсов содержит DEFPUSHBUTTON для IDCANCEL, но по какой-то причине они фокусируются на кнопке, которая не меняется с IDOK на IDCANCEL.
IDD_HEALTHCARDINFO DIALOGEX 0, 0, 256, 223
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Health Card Information"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
PUSHBUTTON "Yes",IDOK,67,202,50,14
DEFPUSHBUTTON "No",IDCANCEL,140,202,50,14
Внутри моего OnInitDialog () я попытался принудительно выполнить это, также отправив сообщение DM_SETDEFID.
BOOL CHealthCardInfo::OnInitDialog()
{
CDialog::OnInitDialog();
SetDefID(IDCANCEL);
SendMessage(GetDlgCtrlID(), DM_SETDEFID, IDCANCEL);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Ответ №1:
Кнопка по умолчанию не влияет на фокус. Это влияет на то, какая кнопка активируется клавишей ENTER, когда какой-либо элемент управления, не являющийся кнопкой, имеет фокус.
Вы можете использовать SetFocus
in OnInitDialog
(а также возвращать FALSE), чтобы изменить, какой элемент управления имеет фокус при открытии диалогового окна. Или вы можете изменить порядок элементов управления в диалоговом ресурсе.
В качестве дополнительного примечания, диалоговое окно, в котором задается вопрос «Да / Нет», обычно не должно иметь заголовка «Информация».
Ответ №2:
Недавно мне пришлось это сделать, и я обнаружил, что настройки по умолчанию для моих ресурсов игнорируются. Например. даже установив по умолчанию для IDCANCEL значение YES и IDOK значение NO в редакторе ресурсов, мои кнопки не отражают ресурсы. Итак, спасибо Бену за ваше понимание (и в других местах) за то, что помогли мне решить эту проблему. Я подумал, что поделюсь своим кодом, поскольку есть кое-что дополнительное — вы должны возвращать FALSE, даже если вы не установили фокус!
В OnInitDialog
// Set the style of the OK button to be BS_PUSHBUTTON.
SendDlgItemMessage( IDOK, BM_SETSTYLE, BS_PUSHBUTTON, (LONG)TRUE);
// Tell the window to make IDCANCEL the default
SendMessage( DM_SETDEFID, IDCANCEL, 0L);
// Tell IDCANCEL it's a default.
SendDlgItemMessage( IDCANCEL, BM_SETSTYLE, BS_DEFPUSHBUTTON, (LONG)TRUE);
// Set focus to IDCANCEL
GetDlgItem( IDCANCEL )->SetFocus();
// finally, even if you do not set focus, you have to return FALSE for this change of defaults to work.
return FALSE;
Комментарии:
1. Мне нравится ваш четкий и понятный подход к решению проблемы. Тем не менее, я предлагаю вам добавить недостающий параметр (дескриптор в окно, содержащее элемент управления => HWND) для полноты картины. 😉
Ответ №3:
Я столкнулся с той же проблемой, когда я изменил порядок кнопок — сначала поставил кнопку фокусировки, проблема была исправлена. Использование SetFocus и return FALSE не работает.