
Joskus se pyörä vaan kannattaa keksiä uudestaan. Tämmöinen tapaus tuli eteen kun koitin etsiä sopivaa herätyskello ohjelmaa. No mitäs ongelmaa tässä voi olla eikun surffailua www.download.com:iin ja alarm hakusanaksi. Ongelmaksi muodostui 739 osumaa. Eri ohjelmien vertailu vie ikuisuuden.
Herätyskello on ohjelmoinnin kannalta helppo tehtävä. Tuntuu että jokainen harrastelija on väsännyt oman ohjelman jossa on miljoona eri ominaisuutta ja minä olisin kaivannut vain jotain pientä ja yksinkertaista.
Eli mahdollisimman minimalistinen toteutus. Formi on mahdollisimman pieni ettei se vie ruudulta tilaa. Eli luodaan pieni työkaluikkuna. Erilaisia formin asetuksia:
- BackColor 233;233;233
- FormBorderStyle FixedToolWindow
- MaximizeBox False
- MaximumSize 156;70
- Opacity 80%
- ShowInTaskBar False
Kuten kuvasta näkyy on käytössä on kaksi lapsi ikkunaa. DateTimePicker ja CheckBox. DateTimePickerin asetuksia on yksinkertaistettu, tiputin sekunnit ja kalenteri mahdollisuuden pois.
- CustomFormat HH:mm
- Format Custom
- ShowUpDown True
Valintalaatikko joka näyttää napilta on valittu Appearance: button kohdasta. Näin saadaan aika minimalistinen ulkomuoto. Yleensä herätyskellot pitää jonkinlaista ääntä mutta itse pidän enemmän visuaalisista tehosteista. Ikkuna pomppaa eteen hälyyttäessä ja värisee (Windows live messangerin tapaan).
// Simple alarm clock.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Alarm
{
public partial class Alarm : Form
{
private DateTime AlarmTime;
private bool AlarmState = false;
public Alarm()
{
InitializeComponent();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
// If alarm is running then change it to back to normal.
if (AlarmState == true)
{
AlarmState = false;
checkBox1.Text = "Set alarm";
TopMost = false;
Timer.Interval = 60000;
Timer.Stop();
return;
}
if (checkBox1.Checked == false)
{
Timer.Stop();
dateTimePicker1.Enabled = true;
return;
}
AlarmTime = dateTimePicker1.Value;
RolloverTime();
Timer.Start();
dateTimePicker1.Enabled = false;
}
private void RolloverTime()
{
// If the user selects a time already passed, it must be for tomorrow
if (DateTime.Now.TimeOfDay.CompareTo(AlarmTime.TimeOfDay) > 0)
{
AlarmTime = new DateTime(DateTime.Now.Year,
DateTime.Now.Month, DateTime.Now.Day + 1,
AlarmTime.Hour, AlarmTime.Minute, AlarmTime.Second);
}
// Otherwise, set it for today
else
{
AlarmTime = new DateTime(DateTime.Now.Year,
DateTime.Now.Month, DateTime.Now.Day,
AlarmTime.Hour, AlarmTime.Minute, DateTime.Now.Second);
}
}
private void AlarmTimer_Tick(object sender, EventArgs e)
{
AlarmState = true;
checkBox1.Text = "Turn off";
TopMost = true;
NudgeMe(this);
Timer.Interval = 5000;
Timer.Start();
}
private void Alarm_Load(object sender, EventArgs e)
{
dateTimePicker1.Value = dateTimePicker1.Value.AddMinutes(10);
}
static void NudgeMe(Form TargetForm)
{
// Store the original location of the form.
int xCoord = TargetForm.Left;
int yCoord = TargetForm.Top;
// An integer for storing the random number each time
int rnd = 0;
// Instantiate the random generation mechanism
Random RandomClass = new Random();
for (int i = 0; i <= 500; i++)
{
rnd = RandomClass.Next(xCoord + 1, xCoord + 15);
TargetForm.Left = rnd;
rnd = RandomClass.Next(yCoord + 1, yCoord + 15);
TargetForm.Top = rnd;
}
// Restore the original location of the form
TargetForm.Left = xCoord;
TargetForm.Top = yCoord;
}
}
}