[C++] Программа "Ааааа глаза режет"

spais

Сообщения
30
Симпатии
75
#1
Итак, эта программа убавляет яркость по наступлению вечера.
Данная программа будет дорабатываться , просьба для самых глазастых - скидывайте свои баги, глюки, недоработки.

C++:
#include <windows.h> //Для WinMain и диалогов
#include <tchar.h> // Шо бы все корректо работало

#define NIGHT "1.ico" //Макросы картинок
#define DAY "2.ico"

NOTIFYICONDATA Icon = { 0 }; //переменная иконки

void SetBrightness(HDC hDC, int wBrightness) //изменение яркости
{
    BOOL bReturn = FALSE;
    HDC hGammaDC = hDC;

    if (hDC == NULL) //Если данных нет, то мы их берем
    {
        hGammaDC = GetDC(NULL);
    }

    if (hGammaDC != NULL) // лень писать
    {
        WORD GammaArray[3][256];
        for (int iIndex = 0; iIndex < 256; iIndex++)
        {
            int iArrayValue = iIndex * (wBrightness + 128);
            if (iArrayValue > 65535)
            {
                iArrayValue = 65535;
            }
            GammaArray[0][iIndex] =
                GammaArray[1][iIndex] =
                GammaArray[2][iIndex] = (WORD)iArrayValue;
        }
        bReturn = SetDeviceGammaRamp(hGammaDC, GammaArray);
    }

    if (hDC == NULL)
    {
        ReleaseDC(NULL, hGammaDC);
    }


}

LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam) //Закрытие программы по нажатию пкм по иконке
{
    switch (message)
    {

    case WM_USER:
        if (lParam == WM_RBUTTONDOWN)
            if (MessageBox(NULL, TEXT("Завершить работу?"), TEXT("Ы"), MB_YESNO) == IDYES)
                DestroyWindow(window);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(window, message, wParam, lParam);
    }
    return 0;
}

int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int) //Начало
{

    SYSTEMTIME time; //Берем время(что бы прибавлять или убавлять яркость)
    GetLocalTime(&time);

    WNDCLASSEX main = { 0 }; //Создание окна
    main.cbSize = sizeof(WNDCLASSEX);
    main.hInstance = instance;
    main.lpszClassName = TEXT("Main");
    main.lpfnWndProc = WndProc;
    RegisterClassEx(&main);
//Создание окна
    HWND window = CreateWindowEx(0, TEXT("Main"), NULL, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL);
//Создание иконки
    Icon.cbSize = sizeof(NOTIFYICONDATA);
    Icon.hWnd = window;
    Icon.uVersion = NOTIFYICON_VERSION;
    Icon.uCallbackMessage = WM_USER;

    //Если вечер то ставим иконку луны и сбавляем яркость
    if (time.wHour >= 18 || time.wHour <= 6)
    {
        SetBrightness(NULL, 100);
        Icon.hIcon = (HICON)LoadImage(NULL, TEXT(NIGHT), IMAGE_ICON, 512, 512, LR_LOADFROMFILE);
    }
    //Если день то иконку солнца
    else

        Icon.hIcon = (HICON)LoadImage(NULL, TEXT(DAY), IMAGE_ICON, 512, 512, LR_LOADFROMFILE);

    Icon.uFlags = NIF_MESSAGE | NIF_ICON;
    Shell_NotifyIcon(NIM_ADD, &Icon);
    MSG message;
    //цикл пока мы не завершим программу нажав пкм
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    SetBrightness(NULL, 128);//восстанавливаем яркость
    Shell_NotifyIcon(NIM_DELETE, &Icon);//удаляем иконку

    return 0;
}
//конец


Пожалуйста войдите или зарегистрируйтесь чтобы просматривать скрытый текст.
(для работы уберите у картинки нужного цвета букву после цифры и поместите рядом с .ехе файлом программы)
 

spais

Сообщения
30
Симпатии
75
#2
UPD:
Добавлено
-Много чего я сам не помню
-
Добавлен 2 поток для изменения яркости при наступлении 7 часов
-Что-то вырезал из кода но уже не помню что
C++:
#include <windows.h>
#include <thread>//для работы с потоками

#define ICON "1.ico"

NOTIFYICONDATA Icon = { 0 };

void SetBrightness(HDC hDC, int wBrightness)
{
    BOOL bReturn = FALSE;
    HDC hGammaDC = hDC;

    if (hDC == NULL)
    {
        hGammaDC = GetDC(NULL);
    }

    if (hGammaDC != NULL)
    {
        WORD GammaArray[3][256];
        for (int iIndex = 0; iIndex < 256; iIndex++)
        {
            int iArrayValue = iIndex * (wBrightness + 128);
            if (iArrayValue > 65535)
            {
                iArrayValue = 65535;
            }
            GammaArray[0][iIndex] =
                GammaArray[1][iIndex] =
                GammaArray[2][iIndex] = (WORD)iArrayValue;
        }
        bReturn = SetDeviceGammaRamp(hGammaDC, GammaArray);
    }

    if (hDC == NULL)
    {
        ReleaseDC(NULL, hGammaDC);
    }


}

LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_USER:
        if (lParam == WM_RBUTTONDOWN)
            if (MessageBox(NULL, TEXT("Завершить работу?"), TEXT("Ы"), MB_YESNO) == IDYES)
                DestroyWindow(window);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(window, message, wParam, lParam);
    }
    return 0;
}

void Timing() //Эту функцию я добавил
{

    SYSTEMTIME time;
    GetLocalTime(&time);

    int Hour = 19 - time.wHour; // Смотрим сколько осталось до 19 часов
    int Min = 60 - time.wMinute; // И сколько минут до 00
    if (Hour <= 0 || Hour >= 13) // Если Hour <= 0 (а это бывает если сейчас от 19 до 24 часов) или больше 13(от 0 часов до 6)
    {
        SetBrightness(NULL, 90); // сбавляем яркость
    }
    else
    {
        --Hour;
        Hour = Hour * 360000; // Перевод в миллисекунды
        Min = Min * 6000; // То же самое
        int sleep = Min + Hour;
        Sleep(sleep); // Ждем наступления 19 часов
        SetBrightness(NULL, 90); // Убавляем яркость
    }

}




int WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int)
{
    std::thread thr(Timing); //Объявляем 2 поток
    thr.detach();//Отделяем его от основного


    WNDCLASSEX main = { 0 };
    main.cbSize = sizeof(WNDCLASSEX);
    main.hInstance = instance;
    main.lpszClassName = TEXT("Main");
    main.lpfnWndProc = WndProc;
    RegisterClassEx(&main);

    HWND window = CreateWindowEx(0, TEXT("Main"), NULL, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL);

    Icon.cbSize = sizeof(NOTIFYICONDATA);
    Icon.hWnd = window;
    Icon.uVersion = NOTIFYICON_VERSION;
    Icon.uCallbackMessage = WM_USER;
    Icon.hIcon = (HICON)LoadImage(NULL, TEXT(ICON), IMAGE_ICON, 512, 512, LR_LOADFROMFILE);
    Icon.uFlags = NIF_MESSAGE | NIF_ICON;
    Shell_NotifyIcon(NIM_ADD, &Icon);
   

    MSG message;

    while (GetMessage(&message, NULL, 0, 0))
    {
       
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    SetBrightness(NULL, 128);
    Shell_NotifyIcon(NIM_DELETE, &Icon);

    return 0;
}
 

spais

Сообщения
30
Симпатии
75
#3
UPD
-Немного изменил работу потока
-Добавил смену иконок при наступлении 19 часов, НО иконки меняются только когда появляется диалоговое окно(я это исправлю, но нужно время)
C++:
#include <windows.h>
#include <thread>


bool night = false;
NOTIFYICONDATA Icon = { 0 };

void SetBrightness(HDC hDC, int wBrightness)
{
    BOOL bReturn = FALSE;
    HDC hGammaDC = hDC;

    if (hDC == NULL)
    {
        hGammaDC = GetDC(NULL);
    }

    if (hGammaDC != NULL)
    {
        WORD GammaArray[3][256];
        for (int iIndex = 0; iIndex < 256; iIndex++)
        {
            int iArrayValue = iIndex * (wBrightness + 128);
            if (iArrayValue > 65535)
            {
                iArrayValue = 65535;
            }
            GammaArray[0][iIndex] =
                GammaArray[1][iIndex] =
                GammaArray[2][iIndex] = (WORD)iArrayValue;
        }
        bReturn = SetDeviceGammaRamp(hGammaDC, GammaArray);
    }

    if (hDC == NULL)
    {
        ReleaseDC(NULL, hGammaDC);
    }


}

LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_USER:
        if (lParam == WM_RBUTTONDOWN)
            if (MessageBox(NULL, TEXT("Завершить работу?"), TEXT("Ы"), MB_YESNO) == IDYES)
                DestroyWindow(window);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(window, message, wParam, lParam);
    }
    return 0;
}

void Timing()
{

    SYSTEMTIME time;
    GetLocalTime(&time);

    int Hour = 19 - time.wHour;
    int Min = 60 - time.wMinute;
    if (Hour <= 0 || Hour >= 13)
    {
        SetBrightness(NULL, 90);
        night = true;

    }
    else
    {
        --Hour;
        Hour = Hour * 360000;
        Min = Min * 6000;
        int sleep = Min + Hour;
        Sleep(sleep);
        SetBrightness(NULL, 90);
        night = true;
    }

}




int WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int)
{
    std::thread thr(Timing);
    


    WNDCLASSEX main = { 0 };
    main.cbSize = sizeof(WNDCLASSEX);
    main.hInstance = instance;
    main.lpszClassName = TEXT("Main");
    main.lpfnWndProc = WndProc;
    RegisterClassEx(&main);

    HWND window = CreateWindowEx(0, TEXT("Main"), NULL, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL);

    Icon.cbSize = sizeof(NOTIFYICONDATA);
    Icon.hWnd = window;
    Icon.uVersion = NOTIFYICON_VERSION;
    Icon.uCallbackMessage = WM_USER;
    


    MSG message;

    while (GetMessage(&message, NULL, 0, 0))
    {

        TranslateMessage(&message);
        DispatchMessage(&message);
        if (night)
        {
            Shell_NotifyIcon(NIM_DELETE, &Icon);
            Icon.hIcon = (HICON)LoadImage(NULL, TEXT("1.ico"), IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
            Icon.uFlags = NIF_MESSAGE | NIF_ICON;
            Shell_NotifyIcon(NIM_ADD, &Icon);
        }
        else
        {
            Shell_NotifyIcon(NIM_DELETE, &Icon);
            Icon.hIcon = (HICON)LoadImage(NULL, TEXT("2.ico"), IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
            Icon.uFlags = NIF_MESSAGE | NIF_ICON;
            Shell_NotifyIcon(NIM_ADD, &Icon);
        }
    }

    SetBrightness(NULL, 128);
    Shell_NotifyIcon(NIM_DELETE, &Icon);
    thr.join();
    return 0;

}
 

spais

Сообщения
30
Симпатии
75
#4
UPD
-Добавил звук при клике на иконку
Для работы(если Visual Studio) добавить в Проект -> Компоновщик -> Ввод -> Дополнительные зависимости -> winmm.lib
C++:
LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {

    case WM_USER:
        if (lParam == WM_RBUTTONDOWN)
        {
            PlaySound("Resource\\click.wav", 0, SND_ASYNC | SND_FILENAME);/*Resource это папка куда я закинул файл со звуком(там должны быть обязательно 2 обратных слеша*/
            if (MessageBox(NULL, TEXT("Завершить работу?"), TEXT("Ы"), MB_YESNO) == IDYES)

                DestroyWindow(window);
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(window, message, wParam, lParam);
    }
    return 0;
}