

Після того як користувач задасть повідомлення, час і зробить клацання на кнопці ОК, вікно програми зникає з екрана (згортається). У встановлений час вікно Будильник з’являється на екрані. Відмінною особливістю програми є те, що значок, який позначає працюючу програму (коли вікно згорнуто), відображається не в панелі завдань, а в системній області панелі завдань (System Tray). Під час позиціонуванні покажчика миші на значок програми відображається час, на який установлено будильник, а в результаті натискання правої кнопки з’являється контекстне меню, команди якого дають змогу завершити роботу програми або розгорнути її вікно.
#include <vcl.h>
#pragma hdrstop
#include "DateUtils.hpp"
#include "ShellAPI.hpp"
#include "mmsystem.hpp"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int cHour, cMinute;
int alrHour, alrMinute;
AnsiString mm(int m)
{
if (m <= 9)
return "0" + IntToStr(m);
else
return IntToStr(m);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
cHour = HourOf(Now());
Label1->Caption = IntToStr(cHour);
cMinute = MinuteOf(Now());
Label3->Caption = mm(cMinute);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString st;
alrHour = UpDown1->Position;
alrMinute = UpDown2->Position;
if ((alrHour == cHour && alrMinute <= cMinute) || alrHour < cHour)
{
int r;
st.printf("Зараз %d:%s\nБудильник встановлений на %d:%s",
cHour, mm(cMinute).c_str(), alrHour, mm(alrMinute).c_str());
r = MessageDlg(st, mtWarning, TMsgDlgButtons() << mbOK << mbCancel, 0);
if (r == mrCancel)
return;
}
st = "Будильник " + IntToStr(alrHour) + ":" + mm(alrMinute);
CreateTrayIcon(1, st);
Form1->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (Form1->Visible)
{
if (HourOf(Now()) != cHour)
{
cHour = HourOf(Now());
Label1->Caption = IntToStr(cHour);
}
if (MinuteOf(Now()) != cMinute)
{
cMinute = MinuteOf(Now());
Label3->Caption = mm(cMinute);
}
Label2->Visible = !Label2->Visible;
}
else
{
TDateTime t = Now();
if (alrHour == HourOf(t) && alrMinute == MinuteOf(t))
{
PlaySound("notify.wav", 0, SND_ASYNC);
DeleteTrayIcon(1);
Form1->Show();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
Label4->Caption = IntToStr(UpDown1->Position);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UpDown2Click(TObject *Sender, TUDBtnType Button)
{
Label6->Caption = mm(UpDown2->Position);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
Timer1->Enabled = false;
Form1->Show();
DeleteTrayIcon(1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Form1->DeleteTrayIcon(1);
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateTrayIcon(int n, AnsiString Tip)
{
TNotifyIconData nidata;
nidata.cbSize = sizeof(TNotifyIconData);
nidata.hWnd = Handle;
nidata.uID = n;
nidata.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nidata.uCallbackMessage = WM_MYTRAYNOTIFY;
nidata.hIcon = Application->Icon->Handle;
StrPCopy(nidata.szTip, Tip);
Shell_NotifyIcon(NIM_ADD, &nidata);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DeleteTrayIcon(int n)
{
TNotifyIconData nidata;
nidata.cbSize = sizeof(TNotifyIconData);
nidata.hWnd = Handle;
nidata.uID = n;
Shell_NotifyIcon(NIM_DELETE, &nidata);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MYTRAYNOTIFY(TMessage &Message)
{
TPoint p;
if (Message.LParam == WM_RBUTTONDOWN)
{
GetCursorPos(&p);
SetForegroundWindow(Application->MainForm->Handle);
Form1->PopupMenu->Popup(p.x, p.y);
}
}
програмування