Pedindo confirmação antes de fechar sua aplicação .NET

14 F Y

Seu usuário pode fechar sem querer sua aplicação. Foi maximizar a janela, errou e clicou no botão de fechar… já era. O mesmo para menus ou outras opções de encerrar o programa. Em alguns casos isso não é tão ruim, basta abrir novamente. Mas em outros, as consequências podem ser bem sérias. Exibir uma confirmação de que o usuário realmente deseja fechar a aplicação é interessante nesses casos.

Confirmação para fechar o programa

Exibir esta dialog para confirmação no .NET Framework é bem simples. O primeiro passo é tratar o evento FormClosing da tela principal de sua aplicação. Ao disparo deste evento, seu método irá receber como parâmetro uma instância da classe FormClosingEventArgs.

Esta classe possui duas propriedades:

  • CloseReason. Esta propriedade informa qual o motivo de sua aplicação estar sendo encerrada. Por exemplo, seu valor pode informar que o programa está sendo fechado pois o sistema operacional está sendo desligado ou pois o usuário pediu, entre várias outras razões. Esta propriedade é read-only.
  • Cancel. Esta propriedade informa se o fechamento da aplicação deve ser cancelado. Se ao final do método o valor desta propriedade for true, seu programa não será encerrado. Seu valor padrão é false.

No método tratando o evento FormClosing, você deve primeiro observar a propriedade CloseReason. Escreva uma verificação para evitar que a confirmação seja mostrada quando o sistema está sendo desligado, por exemplo.

Depois, exiba uma dialog através de MessageBox.Show, informando qual deve ser o texto, o título, o ícone e quais botões devem estar na dialog. O normal é como na imagem acima: Um texto explicando o que pode acontecer caso a aplicação seja fechada, ícone de aviso (Warning) e botões Sim/Não.

Usando o retorno do MessageBox.Show (uma instância de DialogResult, que informa qual botão foi pressionado na tela de confirmação), verifique se o usuário escolheu não fechar a aplicação. Caso isto tenha acontecido, mude o valor da propriedade Cancel de sua instância de FormClosingEventArgs para true.

Para ficar mais claro, segue um exemplo do código deste método, para criar a confirmação da imagem do começo do post:

private void FormClosingEvt(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.WindowsShutDown)
    {
        DialogResult result = MessageBox.Show(
            "Closing the application will stop changing your background image.\n\nAre you sure you want to leave?",
            "Are you sure?", MessageBoxButtons.YesNo,
            MessageBoxIcon.Warning);

        if (result == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

Atribuindo este método para o evento de FormClosing do formulário principal de sua aplicação e alterando as mensagens para algo que se encaixe melhor no contexto do seu programa, você terá uma janela de confirmação evitando o fechamento acidental de sua aplicação.

Qualquer dúvida, deixe um comentário e responderei assim que puder.


Adicionando um menu ao ícone na bandeja

12 F Y

Depois de mostrar como colocar um ícone na bandeja para a sua aplicação e a mostrar o balão de notificação a partir deste ícone, irei neste post descrever o passo-a-passo para atribuir um menu para este ícone de sua aplicação .NET. Este menu será acessado através do clique com o botão direito do mouse sobre o ícone.

ContextMenuStrip na toolbar do Visual Studio 2008

O primeiro passo é adicionar um controle ContextMenuStrip ao seu formulário. Como ilustrado na imagem acima, o controle se encontra na aba Menus & Toolbars da Toolbox do VS2008.

Clique e arraste para dentro do seu form, e a representação do seu controle ficará embaixo, fora do form, assim como o NotifyIcon fica quando é arrastado. Quando você clicar no controle, irá aparecer um menu no formulário. Não se preocupe, ele está ali apenas para facilitar seu trabalho durante a edição do menu, e não aparecerá naquele lugar durante a execução da sua aplicação.

Edit Items

Configure o menu de acordo com seu desejo, mudando sua aparência e adicionando itens. Tudo isso pode ser feito através da tela Edit Items, disponível ao clicar na imagem de “play” que surge ao clicar no componente.

Quando acabar, é só adicionar os eventos de clique para cada item do menu. Isto não pode ser feito através da tela Edit Items. Para acessar os eventos, deixe a janela de propriedades do Visual Studio visível e clique no componente. Quando o menu aparecer no form, clique no item desejado. Depois, clique no botão com um “raio” na janela de propriedades para exibir os eventos, e escolha qual evento você deseja adicionar algum comportamento. Provavelmente você irá escrever código para o evento Click.

Depois de atribuir o que deve acontecer quando cada item do menu for clicado, é hora de atribuir este menu ao seu ícone da bandeja. Para isso, clique no componente do ícone, e na janela de propriedades altere o valor da propriedade ContextMenuStrip para o menu que você acabou de criar. Isto irá associar este menu ao seu ícone, e automaticamente quando o ícone for clicado, seu menu irá ser mostrado para o usuário. No meu projeto de exemplo, o resultado é o seguinte:

Ícone na bandeja com menu

Pronto, é só isso! Seu menu está funcionando. Se forem bem escolhidos, os itens deste menu irão refletir as atividades mais comuns e que não exigem que toda a interface seja mostrada. Através deste menu, o usuário poderá então ser mais produtivo ao utilizar a aplicação.

Apesar de meu exemple ter sido feito em C#, o passo-a-passo deste artigo (e dos anteriores também) pode ser utilizado tranquilamente para quem prefere usar VB.NET.

Clique aqui para baixar um projeto com o código final deste exemplo. Este projeto tem o mínimo de código necessário para colocar o ícone na bandeja, exibir balões de notificação e atribuir um menu para o ícone.


Exibindo balões em ícones da bandeja

11 F Y

No post anterior, expliquei como colocar um ícone na bandeja para sua aplicação .NET. Mostrei apenas o básico, mas que já é suficiente para alguns usos. Outras características possíveis de se adicionar nestes botões, como os balões de notificação e os menus, trazem um poder muito grande ao seu pequeno ícone.

Configurando e exibindo balões de notificação para ícones na bandeja

Estes são aqueles balões que gerenciadores de download mostram quando um arquivo acaba de ser baixado, ou que o Windows mostra quando há algum problema de segurança, tipo anti-vírus desatualizado ou firewall desabilitado.

Balão de Notificação

Usá-los é bem simples. Você pode configurar um balão padrão, para mostrar quando o mouse é deixado em cima do ícone por exemplo, ou exibir um balão para avisar de algum evento ocorrido na execução de sua aplicação como o término de um download, no caso dos gerenciadores citado anteriormente.

Propriedades de NotifyIcon para o Balão

Para configurar um balão padrão, basta atribuir valores para as propriedades BalloonTipIcon, BalloonTipText e BaloonTipTitle de NotifyIcon, na janela de propriedades. Para mostrar o balão, chame a seguinte linha de código:

notifyIcon1.ShowBalloonTip(10000);

Onde, 10000 é um timeout, um tempo em milissegundos até o balão desaparecer. De acordo com algumas fontes que li, mesmo que você bote 3000ms por exemplo, o sistema operacional vai deixar por no mínimo entre 10 e 30 segundos. No teste que fiz com o XP, o mínimo foram 10s.

Para fazer o balão aparecer quando o mouse passa por cima do ícone*, basta chamar a linha de código acima no evento de MouseMove do seu NotifyIcon. O resultado desta chamada para as propriedades com os valores da imagem acima é o seguinte:

Balão com dados setados na janela de propriedades

Para mostrar um balão com outro texto, algo que necessite por exemplo de dados de tempo de execução, eu recomendo não alterar aquelas propriedades, mas sim chamar outra assinatura deste método. Esta outra assinatura recebe mais três parâmetros além do timeout:

notifyIcon1.ShowBalloonTip(timeout, tituloDoBalao, textoDoBalao, tipoDoBalao);

O título e o texto são auto-explicativos. O tipo do balão é um valor do tipo ToolTipIcon que definirá a imagem que aparece dentro do balão. Este parâmetro pode assumir o valor ToolTipIcon.Info, que diz que o balão representa uma informação qualquer, ToolTipIcon.Error, no qual o balão representa um erro e ToolTipIcon.Warning, que irá conter um aviso para o usuário.

De cima para baixo: Info, Error e Warning

Para exibir o balão, basta em qualquer lugar de seu código, chamar a linha de código acima passando os parâmetros desejados. Você pode avisar sobre algum evento que aconteceu durante a execução da sua aplicação, e mesmo que o usuário esteja com a atenção em outra aplicação, poderá ver o aviso através do balão.

Fica para o próximo post o tutorial de como colocar um menu, acessível ao clicar com o botão direito no ícone da bandeja, onde o usuário poderá acessar algumas funcionalidades de sua aplicação.

* Não recomendo mostrar o balão ao passar o mouse por cima do ícone, pois dificulta clicar no ícone e a também complica a exibição do menu.


Colocando um ícone na bandeja do sistema para sua aplicação .NET

10 F Y

Se você está escrevendo um programa que irá rodar a maior parte do tempo em background, com pouca ou mesmo nenhuma intervenção do usuário, utilizar um ícone na bandeja do sistema (system tray, aquele lugar ao lado do relógio… também é conhecido como barra de notificação) pode ser uma mão na roda. Além de economizar o espaço de uma janela na sua barra de tarefas, você pode colocar um menu com algumas atividades mais comuns, fazendo com que o usuário não precise nem restaurar a aplicação para executar algumas tarefas.

Neste post, vou demonstrar como colocar um ícone na barra de notificação. No próximo post, mostrarei como configurar e exibir um balão de dica para o ícone e depois em outro post, como adicionar um menu de acesso rápido para o ícone.

Além disso, irei disponibilizar um projeto de exemplo com código para as funcionalidades que estou falando nestes dois posts.

Colocando um ícone na bandeja para sua aplicação

Controle NotifyIcon no Visual Studio 2008

Em uma aplicação Windows Forms, o .NET Framework nos oferece o controle NotifyIcon, que será o responsável por representar o ícone da aplicação na bandeja do sistema. Para utilizá-lo, basta clicar no controle NotifyIcon na aba Commom Controls da Toolbox (veja figura acima), e arrastá-lo para o form principal de sua aplicação. Pode soltá-lo em qualquer lugar do form, pois o Visual Studio irá colocá-lo fora do form, como ilustrado na figura abaixo:

Controle NotifyIcon inserido no form

Com o controle adicionado, é necessário definir o ícone, através da janela de propriedades do Visual Studio. Observe que mesmo que o form já tenha um ícone configurado, você deve atribuir um ícone para este componente.

Depois de escolher um ícone, se o programa for executado, o ícone será colocado na bandeja, mas ainda sem nenhuma funcionalidade, como ilustrado na figura abaixo. O programa continuará sempre ocupando espaço na barra de tarefas, mesmo que esteja minimizado, e qualquer clique no ícone será inútil, pois ainda não definimos nada para ser realizado ao disparo dos eventos do mouse.

Ícone na bandeja e aplicação rodando

Para a aplicação deixar de aparecer na barra de tarefas quando for minimizada, deve-se adicionar o seguinte código no evento Resize do seu formulário principal (Com o formulário selecionado, na janela de propriedades clique no raio para ver os eventos, e depois dê dois cliques em Resize):

C#:

if (this.WindowState == FormWindowState.Minimized)
{
    this.Hide();
}

VB.NET:

If (Me.WindowState = FormWindowState.Minimized) Then
    Me.Hide()
End If

Desta forma, quando a janela for minimizada, a aplicação deixará de existir na barra de tarefas. O ícone da bandeja terá então a responsabilidade de restaurar a janela do programa. Para inserir este comportamento, o seguinte código deve ser executado quando o evento Click ou DoubleClick (à sua escolha) do seu NotifyIcon for disparado:

C#:

this.Show();
this.WindowState = FormWindowState.Normal;

VB.NET:

Me.Show()
Me.WindowState = FormWindowState.Normal

Desta forma, quando o ícone for clicado, a janela volta a aparecer e é restaurada. Pronto, sua aplicação quando é minimizada fica apenas na bandeja.

Para um resultado um pouco mais “sofisticado”, você pode também alterar a propriedade Visible do NotifyIcon para false quando a janela estiver visível, retornando o valor para true quando o usuário minimizar novamente a aplicação. Desta forma, obtêm-se o efeito de “minimize to tray”, comum em alguns programas como o Winamp, por exemplo.

Clique aqui para ver o próximo post, onde explico como exibir o balão de notificação.

Para um tutorial de como atribuir um menu ao ícone de sua aplicação, siga este link.


Introdução ao C# e ao Visual Studio 2005

12 F Y

Opa pessoal, Acabei de escrever um post para o blog da célula acadêmica CIN.NET, da qual sou membro comprometido, sobre a aula de Introdução ao C# e ao Visual Studio 2005 que dei na última quinta feira. Quem quiser, dá uma olhada: http://cindotnet.wordpress.com/2008/04/12/introducao-ao-c-e-ao-visual-studio-2005/

Célula Acadêmica CIn.NET