DEFPUSHBUTTON не по умолчанию фокусируется на IDCANCEL - PullRequest
1 голос
/ 20 мая 2011

Мой файл ресурсов содержит кнопку 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
}

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Кнопка по умолчанию не влияет на фокус. Это влияет на то, какая кнопка активируется клавишей ENTER, когда какой-либо не кнопочный элемент управления имеет фокус.

Вы можете использовать SetFocus в OnInitDialog (и также возвращать FALSE), чтобы изменить фокус управления при открытии диалогового окна. Или вы можете изменить порядок элементов управления в диалоговом ресурсе.


В качестве примечания, диалоговое окно, в котором задается вопрос «да / нет», обычно не должно иметь заголовка «Информация».

0 голосов
/ 18 августа 2016

Я столкнулся с той же проблемой, когда я переупорядочивал кнопки - сначала поставил кнопку фокусировки, проблема была исправлена.Использование SetFocus и возврата FALSE не работает.

0 голосов
/ 01 июня 2015

Мне недавно пришлось это сделать, и я обнаружил, что настройки по умолчанию для моих ресурсов игнорируются.Например, даже если для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...