Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Projecto de meteorologia---C#---
12-02-2011, 19:37
Mensagem: #17
RE: Projecto de meteorologia---C#---
(12-02-2011 13:28)rei007 Escreveu:  Ora bem,

Para não haver mais problemas vou passar a explicar o que se encontra nesse projecto. Pelos vistos estou a lidar com alguém que se encontra no inicio dos inicios da programação em C# e por consequente este encontra-se a trabalhar/aprender com alguém, que ainda por cima é professora, que pelos vistos não entende nada do assunto ao afirmar que não encontra o código, enfim...

O projecto que eu te enviei é todo ele feito em Visual Studio 2010, para o caso de precisares de abrir o projecto e compilares para tu e a tua "sotra" conseguirem visualizar o assunto.

Existe dois ficheiros chamados de "NewsTicker.cs" e "NewsTicker.Designer.cs" que no seu conjunto forma aquilo que nós, programadores de .NET, chamamos User Controls (mais informação aqui http://www.dotnet-guide.com/usercontrol11.html) e que neste caso eu usei para criar um objecto composto, neste caso uma evolução do objecto Painel (Panel).

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PPLWareTicker
{
    public partial class NewsTicker : Panel
    {
        private Timer mScroller;    // Scroll timer
        private int mOffset;        // Offset of scrolled text
        private string mText;       // Text to scroll
        private Size mPixels;       // Width of text in pixels
        private Bitmap mBuffer;     // Double-buffering buffer

        public NewsTicker()
        {
            mScroller = new Timer();
            mScroller.Interval = 1;
            mScroller.Enabled = false;
            mScroller.Tick += DoScroll;
        }

        [Browsable(true)]
        public override string Text
        {
            get { return mText; }
            set
            {
                mText = value;
                mScroller.Enabled = mText.Length > 0;
                mPixels = TextRenderer.MeasureText(mText, this.Font);
                mOffset = this.Width;
            }
        }

        private void DoScroll(object sender, EventArgs e)
        {
            // Adjust offset and paint
            mOffset -= 1;
            if (mOffset < -mPixels.Width) mOffset = this.Width;
            Invalidate();
        }
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            // Do nothing
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            if (mBuffer == null || mBuffer.Width != this.Width || mBuffer.Height != this.Height)
                mBuffer = new Bitmap(this.Width, this.Height);
            Graphics gr = Graphics.FromImage(mBuffer);
            Brush bbr = new SolidBrush(this.BackColor);
            Brush fbr = new SolidBrush(this.ForeColor);
            gr.FillRectangle(bbr, new Rectangle(0, 0, this.Width, this.Height));
            gr.DrawString(mText, this.Font, fbr, mOffset, 0);
            e.Graphics.DrawImage(mBuffer, 0, 0);
            bbr.Dispose();
            fbr.Dispose();
            gr.Dispose();
        }
    }
}

Este é o código do Ticker!

Para não haver dúvidas vou passar a explicar o que significa cada uma das linhas.

Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

Este pequeno bloco de texto são directivas/referências/bibliotecas que te permitem o acesso a componentes "pré-fabricados".

Código:
namespace PPLWareTicker

Este bloco mostra a criação simples de um Alias que mais tarde algures no projecto vai ser invocado como uma directiva/referência/biblioteca.

Código:
public partial class NewsTicker : Panel

Neste bloco é onde eu digo que vou criar um novo objecto chamado de "NewsTicker" que é derivado do objecto "Panel", isto é, vai conter todas as propriedades do "Panel" e mais algumas ou simplesmente as do "Panel" mas melhoradas.

Código:
private Timer mScroller;    // Scroll timer
private int mOffset;        // Offset of scrolled text
private string mText;       // Text to scroll
private Size mPixels;       // Width of text in pixels
private Bitmap mBuffer;     // Double-buffering buffer

Neste ponto eu estou a instanciar as variáveis globais que vou necessitar para colocar o Ticker a funcionar. O mScroller é um variável do tipo Timer (Tempo) que vai estipular a velocidade do Scroller (Texto que vai correr).

O mOffset é uma variável do tipo inteiro, que é onde coloco o tamanho, em largura, do objecto NewsTicker para saber qual o tamanho do Scroller para saber quando é que este tem de começar e quando é que vai acabar para voltar a começar.

O mText é uma variável do tipo string, que é onde eu indico qual o texto a apresentar.

O mPixels é o variável do tipo Size, que é onde eu declaro o tamanho em pixeis que o texto vai ocupar no ecrã, podendo sair fora do objecto NewsTicker.

O mBuffer é uma variável do tipo Bitmap, onde eu vou criar a imagem que vai ser apresentada/"pintada" no ecrã com o respectivo texto na respectiva posição que é para apresentar.

Código:
public NewsTicker()
        {
            mScroller = new Timer();
            mScroller.Interval = 1;
            mScroller.Enabled = false;
            mScroller.Tick += DoScroll;
        }

Aqui instancio o objecto "NewsTicker". Basicamente é onde tudo começa. Todos os objectos têm uma função deste género, pois é o que declara propriamente o tipo que a "Form" vai "levar".

Como podes verificar eu inicio a variável mScroller estipulando um intervalo de tempo de 1 milisegundo, que no inicio se encontra desligado e que tem como por evento, quando activo, o evento DoScroll.

Código:
[Browsable(true)]
        public override string Text
        {
            get { return mText; }
            set
            {
                mText = value;
                mScroller.Enabled = mText.Length > 0;
                mPixels = TextRenderer.MeasureText(mText, this.Font);
                mOffset = this.Width;
            }
        }

Aqui eu faço uma sobreposição ao método Text do objecto "Panel", isto é, faço uma "melhoria" ao método Text que já existia no "Panel" e que o meu novo objecto adoptou.

Neste caso a alteração remete-se a quando eu recebo informação ("set") em que a minha variável mText recebe o respectivo valor que eu quero apresentar no Scroller. Se inserirmos efectivamente algum texto, nem que seja um espaço, ele vai activar o nosso Timer, depois vai passar para a variável mPixel, quantidade de pixeis que o nosso texto, num determinado tipo de Font, contem e depois o mOffset vai obter o tamanho em largura do objecto.

Código:
private void DoScroll(object sender, EventArgs e)
        {
            // Adjust offset and paint
            mOffset -= 1;
            if (mOffset < -mPixels.Width) mOffset = this.Width;
            Invalidate();
        }

Aqui é o evento do Timer em que eu desincremento o mOffset de forma a provocar a "ilusão" de movimento. Quando o mOffset passar a ser menor que o valor negativo da quantidade de pixeis este volta a ter o valor do tamanho em largura criando a "ilusão" de ter voltado ao ponto inicial.

Código:
protected override void OnPaintBackground(PaintEventArgs e)
        {
            // Do nothing
        }

Isto tal como o comentário indica, não faz nada. Está aqui só por estar porque é inerente ao objecto "Panel" de acordo com as regras de programação orientada a objectos.

Código:
protected override void OnPaint(PaintEventArgs e)
        {
            if (mBuffer == null || mBuffer.Width != this.Width || mBuffer.Height != this.Height)
                mBuffer = new Bitmap(this.Width, this.Height);
            Graphics gr = Graphics.FromImage(mBuffer);
            Brush bbr = new SolidBrush(this.BackColor);
            Brush fbr = new SolidBrush(this.ForeColor);
            gr.FillRectangle(bbr, new Rectangle(0, 0, this.Width, this.Height));
            gr.DrawString(mText, this.Font, fbr, mOffset, 0);
            e.Graphics.DrawImage(mBuffer, 0, 0);
            bbr.Dispose();
            fbr.Dispose();
            gr.Dispose();
        }

Aqui é onde tudo acontece. Ele verifica se o buffer se encontra vazio, se sim instancia, se não passa ao passo seguinte, pois o buffer já contem a instância de imagem.
Depois cria os gráficos a partir desse buffer. A seguir criamos as brushs que vão pintar o fundo e o texto de determinada cor e depois criamos um rectângulo.
A seguir adicionamos o texto com a respectiva font e cor e Offset e desenhamos o gráfico no ecrã.

Depois destruimos as variáveis gráficos e bruchs.

Isto é o básico dos básicos de um Scroller. Pode ser feito com Panel, Labels, TextBox mas eu optei por um Panel porque penso que seja o mais correcto.

Depois na Form é só usares como usas qualquer outro objecto no Visual Studio. Depois de criares o teu User Control e realizares o primeiro Build (podes compilar, mas são duas coisas completamente diferente, pois o compilar implicar Build e Deploy e neste caso eu só indico que basta que faças o build) de forma a que o objecto por ti criado apareça na ToolBox, onde se encontra todos os objectos, como ComboBox, DataGrids, TextBox, etc., e possas arrastar para a tua Form e utilizar e parametrizar o mesmo.

Espero que tenhas entendido.

Se não entendeste aconselho-te vivamente a dedicares-te a outra coisa qualquer em vez da programação.

Este exemplo que te apresentei encontras em qualquer parte da net. Simplesmente fiz transposição para um projecto básico para não andares a pesquisar no meio de código desnecessário.

grande lição,Wink
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Mensagem neste Tópico
RE: Projecto de meteorologia---C#--- - miukita - 12-02-2011 19:37

Saltar Fórum:


Utilizadores a ver este tópico: 1 Visitante(s)