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,
|