Como definir o foco para um botão para que a fronteira e se concentrar linha pontilhada são visíveis?

StackOverflow https://stackoverflow.com/questions/369788

Pergunta

Eu criei um aplicativo baseado em diálogo simples, e no padrão CDialog acrescentou três botões (por arrastar e soltando-os) usando o editor de Visual Studio.

O OK padrão e cancelar botões estão lá também.

Eu quero definir o foco para o botão 1 quando eu clicar no botão 3.

I definir a propriedade Plano de verdade nas propriedades de botões muy.

I codificado esta:

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

    Invalidate();

}

Mas o boder em button1 nunca é desenhado. O acento circunflexo (linha pontilhada indicando foco) só é desenhado se eu pressionei TAB qualquer momento antes de clicar no botão 3.

Eu quero o botão para parecer exatamente como parece depois que eu clicar nele. Mostrando a linha pontilhada dentro do botão programaticamente, seria um plus.

O que eu quero:

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

O que eu recebo:

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

Foi útil?

Solução 3

Esta chama a borda grossa ao redor do botão:

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

Uma maneira mais elegante de fazer isso seria definir uma variável de membro CButton em CbuttonfocusDlg e associá-lo ao controle IDC_BUTTON1, e em seguida, chamando

this->m_myButton.SetButtonStyle(BS_DEFPUSHBUTTON);

Isso faz com que o botão para o qual eu estou definindo o foco no botão padrão, mas nota que quando o foco vai para um controle (dentro da caixa de diálogo) que não é um botão, o botão padrão é mais uma vez o botão padrão original Situado no recurso de diálogo, neste caso o botão "Ok".

Outras dicas

Use WM_NEXTDLGCTL.

Reymond Chen de "Como o foco definido em um diálogo caixa ":

void SetDialogFocus(HWND hdlg, HWND hwndControl)
{
    SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
}

Ao chamar UpdateWindow, o botão está sendo redesenhado antes da mudança de foco pode ter efeito. O Invalidate deve ser suficiente por si só, a janela irá se repintado quando tudo se acalma.

Estou seguindo a sugestão de Joel. Mas um pouco diferente com a API utilizada nesse link, o meu é:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top