Bem-vindo aos gráficos de relógio gráficos winforms, uma biblioteca de código-fonte aberto.
O objetivo principal deste projeto é fornecer objetos gráficos "semelhantes a um relógio" para desenvolvedores C# e VB.NET Winforms. a biblioteca foi projetada principalmente para aplicações que apresentam dados calculados em relação ao desempenho (painel de vendas da empresa, por exemplo).
cada objeto de relógio possui uma variedade de propriedades, usadas para personalização; os relógios podem incluir animação quando atualizados ou carregados.
Baixe a versão mais recente do BusinessClocks.dll para o seu computador local.
Você sempre pode encontrar a última versão no branch master do repositório.
Carregue o .dll em seu projeto winforms usando o Visual Studio.
Instruções para carregar dll em seu projeto:
Using
(C#) ou Imports
(VB.NET) ao namespace BusinessClocks.ExecutiveClocks
na parte superior do arquivo Form1
.Form1
.Exemplo de teste C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BusinessClocks.ExecutiveClocks;
namespace WindowsFormsApplication19
{
public partial class Form1 : Form
{
private BusinessClocks.ExecutiveClocks.CarClock carClock;
private GoalsClock goalsClock;
private WaitClock waitClock;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
carClock = new BusinessClocks.ExecutiveClocks.CarClock(300, 150, 0.8F, true);
carClock.ShowInnerCutForPerformance = false;
carClock.BarBackColor = Color.Pink;
carClock.Create(true);
this.Controls.Add(carClock.ClockPanel);
goalsClock = new GoalsClock(200, 200, 0.8F);
goalsClock.Create(true);
goalsClock.Clock.Location = new Point(0, carClock.ClockPanel.Location.Y + carClock.ClockPanel.Height + 5);
this.Controls.Add(goalsClock.Clock);
waitClock = new WaitClock(150, 150, "Loading...");
waitClock.Clock.Location = new Point(0, goalsClock.Clock.Location.Y + goalsClock.Clock.Height + 5);
waitClock.LoadFont("ARIAL", 8, FontStyle.Regular);
waitClock.SetArrayColors(new Color[] { Color.FromArgb(0, 100, 100), Color.FromArgb(0, 136, 136), Color.FromArgb(0, 170, 170), Color.FromArgb(0, 204, 204) });
waitClock.OuterCircleWeight = 8;
waitClock.InnerCircleWeight = 5;
waitClock.Create(true);
this.Controls.Add(waitClock.Clock);
}
}
}
Exemplo de teste Visual Basic.NET
Imports BusinessClocks.ExecutiveClocks
Public Class Form1
Private carClock As BusinessClocks.ExecutiveClocks.CarClock
Private goalsClock As GoalsClock
Private waitClock As WaitClock
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' car clock (with precentage bar)
carClock = New BusinessClocks.ExecutiveClocks.CarClock(300, 150, 0.8, True)
carClock.ShowInnerCutForPerformance = False
carClock.BarBackColor = Color.Pink
carClock.Create(True)
Me.Controls.Add(carClock.ClockPanel)
' goals clock
goalsClock = New GoalsClock(200, 200, 0.8)
goalsClock.Create(True)
goalsClock.Clock.Location = New Point(0, carClock.ClockPanel.Location.Y + carClock.ClockPanel.Height + 5)
Me.Controls.Add(goalsClock.Clock)
' waitclock
waitClock = New WaitClock(150, 150, "Loading...")
waitClock.Clock.Location = New Point(0, goalsClock.Clock.Location.Y + goalsClock.Clock.Height + 5)
waitClock.LoadFont("ARIAL", 8, FontStyle.Regular)
waitClock.SetArrayColors(New Color() {Color.FromArgb(0, 100, 100), Color.FromArgb(0, 136, 136) _
, Color.FromArgb(0, 170, 170), Color.FromArgb(0, 204, 204)})
waitClock.OuterCircleWeight = 8
waitClock.InnerCircleWeight = 5
waitClock.Create(True)
Me.Controls.Add(waitClock.Clock)
End Sub
End Class
Nota: Todos os relógios (WaitClock e CarClock por enquanto) herdam GoalsClock
Propriedades:
Clock:
Instância do objeto gráfico que representa o relógio, inicializado após a chamada Create()
.ClockWidth
: obtém ou define a largura do relógio.ClockHeight
: obtém ou define a altura do relógio.xPos
e Ypos
: obtém a posição x ou y do retângulo que contém o relógio.ClockBackGroundColor
: obtém ou define a cor de fundo do relógio.FontColor
: obtém ou define a cor da fonte do texto que descreve a porcentagem PercentOfGoals
.ClockFont
: obtém ou define a fonte do texto que descreve a porcentagem PercentOfGoals. Observe:font
porque o getter desta propriedade está chamando a função LoadFont()
para calcular o tamanho e estilo da fonte adequado em relação ao tamanho do relógio usando o elgoritem interno.LoadFont()
para redefinir a fonte.InnerCircleColor
: Obtém ou define a cor do arco interno.InnerCircleWeight
: Obtém ou define o peso do pixel (largura) do arco interno.OuterCircleColor
: Obtém ou define a cor do arco externo.OuterCircleWeight
: Obtém ou define o peso do pixel (largura) do arco externo.PercentOfGoals
: obtém ou define o valor do relógio. por exemplo valor de 0,1F = 10%, valor de 0,5F = 50%, valor de 1,1F = 110% etc...GoalsPercentDecimalValue
: Obtém o valor deciaml do relógio.Animate
(campo): Obtém ou define um valor que indica se a animação será ativada ou não.AnimationLength
: obtém ou define a velocidade da animação (milissegundos) com base na enumeração AnimationLength: SuperFast = 1, Fast = 4, ModerateFast = 8, Moderate = 15, ModerateSlow = 28, Slow = 50, SuperSlow = 80.TimerInterval
: obtém ou define o intervalo de ticks do cronômetro interno. o valor recomendado é 4 (padrão) para agilizar o tempo de atualização, use um valor mais baixo.Métodos:
Create(ByVal AnimateClock As Boolean)
: Inicializando o objeto relógio, deve ser chamado depois que todas as propriedades forem definidas (desenvolvedores, observem: este método é substituível/virtual).RefreshClock(ByVal AnimateClock As Boolean)
: Atualiza e redesenha os gráficos do objeto relógio, chame este método após alterar as propriedades (PercentOfGoals, InnerCircleColor por exemplo). A maioria das propriedades do relógio chamará esse método quando seu valor for alterado. (desenvolvedores, observem: este método é substituível/virtual).LoadFont()
: Retorna o tamanho e estilo da fonte adequado em relação ao tamanho do relógio usando o egoritem interno.LoadFont()
para redefinir a fonte.Dispose()
: O método é implementado a partir da interface IDisposable (no assembly mscorlib.dll), quando chamado, o objeto clock será descartado e todos os objetos GDI serão liberados da memória.Propriedades:
ClockPanel
(campo): use para conter dentro do objeto Clock
se a barra de texto for necessária. Importante: Quando BaseBar = True
o objeto Clock
será hospedado dentro ClockPanel
para apresentar uma barra de texto de performance abaixo do relógio.BaseBar = True
use este controle (e não a propriedade Clock) para obter o relógio com a barra de texto.BaseBar = False
nunca utilize esta propriedade, o resultado será NullReferenceException
pois ela não será inicializada (Leia a edição 6 que foi aberta pelo usuário lordofscripts: #6). LowPerformance
: Obtém ou define a indicação de baixo desempenho, esta propriedade está vinculada à propriedade LowPerFormanceColor e seu valor definirá a área gráfica do relógio de baixo desempenho com a cor LowPerFormanceColor .
MediumPerformance
: Obtém ou define a indicação de desempenho Médio, esta propriedade está vinculada à propriedade MediumPerFormanceColor e seu valor definirá a área gráfica do relógio de desempenho Médio com a cor MediumPerFormanceColor .
HighPerformance
: Obtém ou define a indicação de Alto desempenho, esta propriedade está vinculada à propriedade HighPerFormanceColor e seu valor definirá a área gráfica do relógio de Alto desempenho com a cor HighPerFormanceColor .
HighPerFormanceColor
: Obtém ou define a área gráfica de Alto desempenho do relógio com a cor selecionada (vinculada à propriedade HighPerFormance
).
MediumPerFormanceColor
: Obtém ou define a área de desempenho do meio gráfico no relógio com a cor selecionada (vinculada à propriedade MediumPerformance
).
LowPerFormanceColor
: Obtém ou define a área gráfica de baixo desempenho do relógio com a cor selecionada (vinculada à propriedade LowPerformance
).
NeedleBaseColor
: Obtém ou define a cor de fundo da base da agulha (ponteiro do relógio).
NeedleBaseWeight
: Obtém ou define o peso do pixel (espessura) da base da agulha (ponteiro do relógio).
NeedleOuterColor
: obtém ou define a cor de fundo da área externa da agulha (ponteiro do relógio).
NeedleOuterWeight
: obtém ou define o peso do pixel (espessura) da área externa da agulha (ponteiro do relógio).
NeedleInnerColor
: Obtém ou define a cor de fundo da área interna da agulha (ponteiro do relógio).
NeedleInnerWeight
: Obtém ou define o peso do pixel (espessura) da área interna da agulha (ponteiro do relógio).
ShowInnerCutForPerformance
: obtém ou define um valor que indica se o corte interno visual (barra) que representa o desempenho será desenhado no meio da borda do relógio.
InnerCutPreformanceColor
: Obtém ou define a cor do corte interno visual (barra) que representa o desempenho no meio da borda do clock.
InnerCutPerformanceWeight
: Obtém ou define o peso (espessura) do corte interno (barra) que representa o desempenho no meio da borda do clock.
BarFont
: Obtém ou define a fonte do texto que descreve a porcentagem PercentOfGoals.
BarBackColor
: Obtém ou define a cor de fundo da barra de desempenho.
BarForeColor
: Obtém ou define a cor da fonte da barra de desempenho.
BarValueDigitsForeColor
: Obtém ou define a cor da fonte dos rótulos max(100%) e min(0%) da barra.
BarValueDigitsBackColor
: Obtém ou define a cor de fundo dos rótulos max(100%) e min(0%) da barra.
BarValueDigitsFont
: Obtém ou define a fonte dos rótulos max(100%) e min(0%) da barra.
Propriedades:
waitText
: Obtém ou define o texto no meio do relógio. Métodos:
SetArrayColors(ByVal arrayOfColors() As Color)
: Define uma série de cores que mudarão após cada rotação de 360 graus. O .dll é escrito em VB.NET.
Você também pode usá-lo com projetos C#.
Dois exemplos idênticos são adicionados, para C# e para VB.NET.
Este é um projeto de código aberto: Código Fonte
Usamos SemVer para versionamento.
A classe base GoalsClock possui um campo constante Version
: use-o para verificar o número da versão da biblioteca.
Este trecho ainda está em construção, em um curto espaço de tempo
Você encontrará aqui explicações e exemplos para desenvolvedores que desejam participar do projeto e escrever seus próprios gráficos de relógio.
WaitClock
enquanto o aplicativo está executando uma tarefa longa em segundo plano usando threadsExemplo de código C# com comentários:
/*
**************************************************************************
* AUTHOR: Jonathan Applebaum *
* DESCRIPTION: An example that describes how to use WaitClock object *
* from another thread in order to execute a long task in the beckground *
* DATE: 06/01/2017 *
* ************************************************************************
*/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BusinessClocks.ExecutiveClocks;
namespace WindowsFormsApplication19
{
public partial class Form1 : Form
{
private WaitClock waitClock;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// show wait clock on a different thread until LongTask finish executing
System.Threading.Thread waitThread = new System.Threading.Thread(LoadWaitClock);
waitThread.Start();
// start a new thread to execute LongTask() parallel to the waitThread
System.Threading.Thread longTaskThread = new System.Threading.Thread(LongTask);
longTaskThread.Start();
}
// put the code of your task that you want to execute in the background in that method
private void LongTask()
{
// loop to represent a long task
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000);
}
// the "long task" inside the method finished to execute - dispose the wait clock from the GUI
panel1.Invoke(new Action(waitClock.Dispose));
// promt to screen
label1.Invoke(new Action(NotifyTaskHasFinished));
}
private void LoadWaitClock()
{
// use action delegate to update GUI changes from another thread
panel1.Invoke(new Action(AddClock));
}
private void AddClock()
{
// configure and initilize the clock
waitClock = new WaitClock(120, 120, "Loading...");
waitClock.ClockBackGroundColor = Color.White;
waitClock.FontColor = Color.Black;
waitClock.Clock.Location = new Point(5, 5);
waitClock.LoadFont("ARIAL", 8, FontStyle.Regular);
waitClock.SetArrayColors(new Color[] { Color.FromArgb(0, 100, 100), Color.FromArgb(0, 136, 136), Color.FromArgb(0, 170, 170), Color.FromArgb(0, 204, 204) });
waitClock.OuterCircleWeight = 8;
waitClock.InnerCircleWeight = 5;
waitClock.Create(true);
this.panel1.Controls.Add(waitClock.Clock);
}
private void NotifyTaskHasFinished()
{
label1.Text = "LongTask() method has finished";
}
}
}
Exemplo de código Visual Basic.NET com comentários:
' **************************************************************************
' * AUTHOR: Jonathan Applebaum *
' * DESCRIPTION: An example that describes how To use WaitClock Object *
' * from another thread in order to execute a long task in the beckground *
' * DATE: 06/01/2017 *
' * ************************************************************************
Imports BusinessClocks.ExecutiveClocks
Public Class Form1
Private waitClock As WaitClock
Private Sub Form1_Load_1(sender As Object, e As EventArgs) Handles MyBase.Load
Dim waitThread As System.Threading.Thread = New System.Threading.Thread(AddressOf LoadWaitClock)
waitThread.Start()
Dim longTaskThread As System.Threading.Thread = New System.Threading.Thread(AddressOf LongTask)
longTaskThread.Start()
End Sub
Private Sub LongTask()
For i As Integer = 0 To 9
System.Threading.Thread.Sleep(1000)
Next
Panel1.Invoke(New Action(AddressOf waitClock.Dispose))
Label1.Invoke(New Action(AddressOf NotifyTaskHasFinished))
End Sub
Private Sub LoadWaitClock()
Panel1.Invoke(New Action(AddressOf AddClock))
End Sub
Private Sub AddClock()
waitClock = New WaitClock(120, 120, "Loading...")
waitClock.ClockBackGroundColor = Color.White
waitClock.FontColor = Color.Black
waitClock.Clock.Location = New Point(5, 5)
waitClock.LoadFont("ARIAL", 8, FontStyle.Regular)
waitClock.SetArrayColors(New Color() {Color.FromArgb(0, 100, 100), Color.FromArgb(0, 136, 136), Color.FromArgb(0, 170, 170), Color.FromArgb(0, 204, 204)})
waitClock.OuterCircleWeight = 8
waitClock.InnerCircleWeight = 5
waitClock.Create(True)
Me.Panel1.Controls.Add(waitClock.Clock)
End Sub
Private Sub NotifyTaskHasFinished()
Label1.Text = "LongTask() method has finished"
End Sub
End Class