Будильник

Після того як користувач задасть повідомлення, час і зробить клацання на кнопці ОК, вікно програми зникає з екрана (згортається). У встановлений час вікно Будильник з’являється на екрані. Відмінною особливістю програми є  те, що значок, який позначає працюючу програму (коли вікно згорнуто), відображається не в панелі завдань, а в системній області панелі завдань (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);
    }
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *