Как установить фокус на 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


person rec    schedule 15.12.2008    source источник
comment
Я только что попытался продублировать ваше тестовое приложение в VC6 и XP - оно работает правильно, хотя граница кнопки по умолчанию чередуется между setfocus и OK.   -  person Mark Ransom    schedule 16.12.2008


Ответы (4)



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

person Mark Ransom    schedule 15.12.2008
comment
Хорошо, я удалил UpdateWindow, моя исходная проблема все еще сохраняется. - person rec; 16.12.2008

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

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

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

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

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

person rec    schedule 16.12.2008
comment
Ага, я неправильно понял вопрос! Извините, я мог бы придумать этот ответ вчера. Вы продолжали подчеркивать слово «фокус», а пунктирная линия — это официальный индикатор фокуса. - person Mark Ransom; 17.12.2008

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

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

person user1144651    schedule 24.06.2014