Как установить фокусировку на CButton, чтобы граница и пунктирная линия фокуса были видны? - PullRequest
1 голос
/ 16 декабря 2008

Я создал простое диалоговое приложение и в 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

Ответы [ 4 ]

4 голосов
/ 17 декабря 2008

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

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

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}
0 голосов
/ 24 июня 2014

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

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

0 голосов
/ 16 декабря 2008

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

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

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

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

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

0 голосов
/ 16 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...