Как установить фокусировку на CButton, чтобы граница и пунктирная линия фокуса были видны?

Я создал простое диалоговое приложение и в CDialog по умолчанию добавил три кнопки (путем их перетаскивания) с помощью редактора Visual Studio.

Там также есть кнопки ОК и Отмена по умолчанию.

Я хочу установить фокус на кнопку 1, когда я нажимаю кнопку 3.

Я установил для свойства Flat значение true в свойствах кнопок muy.

Я закодировал это:

void CbuttonfocusDlg::OnBnClickedButton3()
{
    // TODO: Add your control notification handler code here
    GetDlgItem(IDC_BUTTON1)->SetFocus();

    Invalidate();

}

Но бодер в button1 никогда не рисуется. Каретка (пунктирная линия, обозначающая фокус) рисуется только в том случае, если я нажимал клавишу TAB в любое время до нажатия кнопки 3.

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

Что я хочу:

http://i33.tinypic.com/11t8pkl.png

Что я получаю:

http://i37.tinypic.com/160q5hw.png

15.12.2008 21:34:50
Я только что попытался скопировать ваше тестовое приложение в VC6 и XP - оно работает правильно, хотя граница кнопки по умолчанию чередуется между setfocus и OK.
Mark Ransom 16.12.2008 01:55:02
4 ОТВЕТА

При вызове UpdateWindow кнопка перерисовывается, прежде чем изменение фокуса вступит в силу. Invalidate должен быть достаточным сам по себе, окно будет перекрашено, когда все успокоится.

0
15.12.2008 21:47:43
Хорошо, я удалил UpdateWindow, моя первоначальная проблема все еще сохраняется.
rec 15.12.2008 21:54:52
РЕШЕНИЕ

Это рисует толстую границу вокруг кнопки:

static_cast<CButton*>(GetDlgItem(IDC_BUTTON1))->SetButtonStyle(BS_DEFPUSHBUTTON);

Более элегантный способ сделать это - определить переменную-член CButton в CbuttonfocusDlg и связать ее с элементом управления IDC_BUTTON1, а затем вызвать

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

Это делает кнопку, на которую я устанавливаю фокус, кнопкой по умолчанию, но учтите, что когда фокус переходит к элементу управления (внутри диалогового окна), который не является кнопкой, кнопка по умолчанию снова становится исходной кнопкой по умолчанию, установленной в ресурс диалога, в данном случае кнопка «ОК».

0
16.12.2008 15:54:22
Ага, я неправильно понял вопрос! Извините, я мог вчера придумать этот ответ. Вы продолжали подчеркивать слово «фокус», а пунктирная линия - официальный индикатор фокуса.
Mark Ransom 16.12.2008 23:03:21

Использование WM_NEXTDLGCTL.

См . «Как установить фокус в диалоговом окне» Реймонда Чена :

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
4
24.11.2016 21:36:49
+1. ОП задает неправильный вопрос, вызванный неправильным пониманием того, как работают диалоги. OP, пожалуйста, будьте осторожны, чтобы поведение, которое вы реализуете, соответствовало «нормальным» правилам интерфейса пользователя для кнопок по умолчанию и т. Д. (Т. Е. Нажатие клавиши ввода после открытия диалогового окна делает что-то интуитивно понятное).
Roel 19.12.2008 15:05:11

Я следую совету Джоэла. Но немного отличается от API, используемого в этой ссылке, мой:

PostMessage (WM_NEXTDLGCTL, (WPARAM) (pwnd-> GetSafeHwnd ()), TRUE);

0
24.06.2014 01:58:50