11-12

mail@pastecode.io avatar
unknown
c_cpp
a year ago
5.3 kB
1
Indexable
Never
#include <windows.h>
#include <windowsx.h>
#include "Timer.h"
/*Глобальные переменные*/
char szCurrentTime[40];//Для формирования выводимой строки
HWND hwndMain;
/*Главная функция WinMain*/
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    char szClassName[] = "MainWindow";
    char szTitle[] = "Текущее время";
    MSG Msg;
    WNDCLASS wc;

    /* Регистрация класса главного окна */
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInst;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
    wc.lpszClassName = szClassName;
    RegisterClass(&wc);

    /* Создание главного окна и отображение его на экране */
    hwndMain = CreateWindowEx(WS_EX_TOPMOST, szClassName, szTitle,
        WS_CAPTION | WS_SYSMENU, 0, 0, XSIZE, YSIZE,
        HWND_DESKTOP, NULL, hInst, NULL);
    ShowWindow(hwndMain, SW_SHOWNORMAL);

    /* Организация цикла обнаружения сообщений */
    while (GetMessage(&Msg, NULL, 0, 0))
        DispatchMessage(&Msg);
    return 0;
}

/* Оконная функция главного окна */
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hwnd, WM_TIMER, OnTimer);
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hwnd, WM_GETMINMAXINFO, OnGetMinMaxInfo);
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
    default:
        return(DefWindowProc(hwnd, msg, wParam, lParam));
    }
}

/*Функция обработки сообщения и создания главного окна*/
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT)
{
    OutDateTime();//Первый вывод текущего времени
    SetTimer(hwnd, 1, 1000, NULL);//Установка таймера с периодом 1 с
    return TRUE;
}

/*Функция обработки события WM_PAINT главного окна*/
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    SetBkMode(hdc, TRANSPARENT);//Прозрачный фон под текстом
    TextOut(hdc, 5, 0, szCurrentTime, strlen(szCurrentTime));//Вывод строки
    EndPaint(hwnd, &ps);//Освобождение контекста устройства
}

/*Функция обработки сообщения WM_GETMINMAXINFO*/
void OnGetMinMaxInfo(HWND, LPMINMAXINFO lpmmi)
{
    lpmmi->ptMinTrackSize.x = XSIZE;//Минимальный
    lpmmi->ptMinTrackSize.y = YSIZE;//и максимальный
    lpmmi->ptMaxTrackSize.x = XSIZE;//размеры главного
    lpmmi->ptMaxTrackSize.y = YSIZE;//окна совпадают
}

/*Функция обработки сообщения WM_DESTROY*/
void OnDestroy(HWND hwnd)
{
    KillTimer(hwnd, 1);//Перед завершением уничтожим таймер 
    PostQuitMessage(0);
}

/*Функция обработки сообщений WM_TIMER*/
void OnTimer(HWND, UINT)
{

}

/*Функция получения текущего времени и преобразования его в символы*/
void OutDateTime()
{
    const char* szDay[7] = { "Вс","Пн","Вт","Ср","Чт","Пт","Сб", };
    const char* szMonth[13] = { "","Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек" };
    char szT[20];
    SYSTEMTIME SystemTime;//Структура для получения системного времени
    GetLocalTime(&SystemTime);//Получим текущее местное время
    strcat_s(szCurrentTime, szDay[SystemTime.wDayOfWeek]);//День недели
    strcat_s(szCurrentTime, " ");//Разделяющий пробел
    strcat_s(szCurrentTime, szMonth[SystemTime.wMonth]);//Месяц
    strcat_s(szCurrentTime, " ");//Разделяющий пробел
    wsprintf(szT, "%d", SystemTime.wDay);//Дата в символы
    strcat_s(szCurrentTime, szT);//Добавим ее
    strcat_s(szCurrentTime, " ");//Разделяющий пробел
    wsprintf(szT, "%d", SystemTime.wYear);//Год в символы
    strcat_s(szCurrentTime, szT);//Добавим его
    strcat_s(szCurrentTime, "---");//Разделяющие символы
    wsprintf(szT, "%d", SystemTime.wHour);//Часы в символы
    strcat_s(szCurrentTime, szT);//Добавим их
    strcat_s(szCurrentTime, ":");//Разделяющее двоеточие
    wsprintf(szT, "%d", SystemTime.wMinute);//Минуты в символы
    strcat_s(szCurrentTime, szT);//Добавим их
    strcat_s(szCurrentTime, ":");//Разделяющее двоеточие
    wsprintf(szT, "%d", SystemTime.wSecond);//Секунды в символы
    strcat_s(szCurrentTime, szT);//Добавим их
    InvalidateRect(hwndMain, NULL, TRUE);//перерисовка окна
}