Como definir o foco para um botão para que a fronteira e se concentrar linha pontilhada são visíveis?
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:
O que eu recebo:
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);