• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Como remover o focos de uma TextBox sem colocar focos noutro controlo?

15 mensagens neste tópico

Imaginem uma simples aplicação em .NET onde o único controlo no Form é uma TextBox, a qual tem a propriedade TabStop = false. Fora isto, existe um NotifyIcon que irá fazer aparecer (.Show()) ou esconder (.Hide()) o respectivo Form.

Quando a aplicação inicia, a TextBox não tem focos, nem irá ter até eu lhe dar focos manualmente seleccionando-a. Supondo agora que eu dei o focos manualmente, quero que ao clicar no NotifyIcon quando for esconder o Form, remover o focos da TextBox para que dá próxima vez que clicar no NotifyIcon para voltar a mostrar o Form, a TextBox não tenha focos. Da mesma forma que não tinha da primeira vez que executei a aplicação.

Não faço ideia de como fazer isto porque não vejo uma única propriedade ou método, tanto no Form como na TextBox, que me permita controlar isto. Mas tem de a existir uma maneira, afinal de contas, a aplicação começa sem focos na TextBox, tem de dar para tirar.

Lembrem-se, não existe mais nenhum controlo no Form, não dá para dar focos a esse controlo removendo assim o focos da TextBox e também não vou criar um controlo que ficara invisível para lhe dar focos, escondendo assim o focos da TextBox. Isto é uma solução parva que eu queria evitar...

Ideias?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Criar uma instância de quê? Do Form? Da TextBox? Seja de qual for, isso não faz grande sentido e obrigaria-me a mudar radicalmente a forma como funciona a minha aplicação e eu não quero isso.

Mais nenhuma solução?

Como disse anteriormente: "Mas tem de a existir uma maneira, afinal de contas, a aplicação começa sem focos na TextBox, tem de dar para tirar." Será que não dá mesmo? Acho muito estranho...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que uma coisa é começar sem focus outra é retirar.

Quando a aplicação inicia vai tentar meter o focus no primeiro controlo com tabStop que "encontrar". Se não encontrar nenhum..não mete em nenhum.

Assim que o focus é atribuido a um controlo apenas pode ser mudado para outro controlo, acho que não existe o que tu queres que é dizer que nenhum controlo tem focus, daí ter dito para criares uma nova instância!

Se existir alguma coisa só talvez a nível de sistema operativo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estou a perceber o que estás a dizer.

Bem, isso estraga-me completamente os planos, mas faz sentido o que dizes... :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

também não vou criar um controlo que ficara invisível para lhe dar focos, escondendo assim o focos da TextBox. Isto é uma solução parva que eu queria evitar...

Na realidade nunca vi um requisito igual a este  :), mas é um como outro qualquer!

Não se existe uma maneira elegante de o fazer mas podes criar um controlo em runtime, atribuir-lhe o focus, e depois eliminá-lo. O utilizador nem nota e o focus desaparece.

Mais ou menos (não testado a 100%):

{ 
    TextBox tb = new TextBox(); 
    tb.Visible = false; 
    this.Controls.Add(tb); 
    tb.Select(); 
    tb.Dispose(); 
} 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por incrível que pareça, não funcionou lol... A TextBox ficou na mesma com o focos. Tive foi de mudar de .Select() para .Focus() porque são coisas diferentes.

Misturado no evento de clique no NotifyIcon tenho uma animação que apresenta ou esconde o form, e pelos meus testes, essa animação está fazer com que este método não funcione. Mas agora também não tenho tempo nem paciência para resolver isto, vai ficar assim para já.

Obrigado a todos na mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por incrível que pareça, não funcionou lol... A TextBox ficou na mesma com o focos. Tive foi de mudar de .Select() para .Focus() porque são coisas diferentes.

Misturado no evento de clique no NotifyIcon tenho uma animação que apresenta ou esconde o form, e pelos meus testes, essa animação está fazer com que este método não funcione. Mas agora também não tenho tempo nem paciência para resolver isto, vai ficar assim para já.

Obrigado a todos na mesma.

Depois de ter colocado a mensagem testei em VB e funcionou bem!

Não queres mostrar a animação para testar ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É complicado estar aqui a postar o código para animação. É uma mistura de APIs do Windows com um método próprio para mostrar/esconder o Form chamando a API e especifico para a minha aplicação misturando ainda BackgroundWorker's que estão no próprio Form da aplicação.

Ias ter trabalho a separar o código e adaptar à tua solução e sinceramente, não vale a pena. Se quiseres mesmo testar, é mais fácil implementares a API do AnimateWindow e criares um código simples para mostrar/esconder o Form.

Deixo aqui o código da API que uso se não quiseres estar à procura:

//--------------------------------------------------------------------------
// Enumerated flags for the AnimateWindow API
//--------------------------------------------------------------------------
[FlagsAttribute()]
internal enum AnimateWindowFlags {
AW_HOR_POSITIVE = 0x00001,
AW_HOR_NEGATIVE = 0x00002,
AW_HIDE         = 0x10000,
AW_SLIDE        = 0x40000
}

//--------------------------------------------------------------------------
// Apply various animations to windows forms
//--------------------------------------------------------------------------
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool AnimateWindow(IntPtr hWnd, int time, AnimateWindowFlags flags);

E depois chama assim:

AnimateWindow(this.Handle, 1000, AW_HOR_POSITIVE | AW_SLIDE); // Mostrar
AnimateWindow(this.Handle, 1000, AW_HOR_POSITIVE | AW_SLIDE | AW_HIDE); // Esconder

Se funcionar, pode ser que o problema esteja em algum código meu. E eu estava a tentar adicionar o teu pedaço de código ao evento NotifyIcon_Click após esconder o Form (para que dá próxima vez que o mostrasse, a TextBox não tivesse focos), mas também tentei após apresentar o Form e em ambos, mas não funcionou em nenhum.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se funcionar, pode ser que o problema esteja em algum código meu. E eu estava a tentar adicionar o teu pedaço de código ao evento NotifyIcon_Click após esconder o Form (para que dá próxima vez que o mostrasse, a TextBox não tivesse focos), mas também tentei após apresentar o Form e em ambos, mas não funcionou em nenhum.

Depois vou tentar.

Eu utilizei um timer com um interval de 5000 e no timer.tick utilizava aquele código. Então eu seleccionava manualmente e ele "des-seleccionava".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, mas isso funcionou como viste. Eu também consegui por a funcionar mas tinha que de certa forma desactivar as animações...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Que efeito de abertura/fecho?

O fade de abertura e fecho do form? Ou não usas no FireNotes ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uso, mas não no blend (que tu chamas fade :confused:). O blend é feito manualmente com um ciclo for de 0 a 100 para mudar a opacidade. Mas nas opções podes mudar uma certa opção que não me lembra agora o nome de "Blend" para "Slide" e esse efeito, o slide, sim, já usa o AnimateWindow.

Até porque no código que postei acima só tens a constante AW_SLIDE, falta-te a AW_BLEND para o efeito de blend. Só não estou a usar porque usar a API introduziu alguns problemas, e fazer manual resolveu esses problemas. Só ainda não fiz o slide manual (já tentei) porque é mais complicado e introduziu uma série de problemas que eu ignorei porque não estava para me chatear a tentar resolvê-los.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora