Информация об изменениях

Сообщение Re[7]: Как изменить цвет кнопки? от 22.11.2019 16:37

Изменено 22.11.2019 16:42 Carc

Re[7]: Как изменить цвет кнопки?
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, CEMb, Вы писали:


CEM>>Можно ещё завести таймер и "трясти" кнопку ±3 пикселя вверх-вниз, вправо-влево


ЕМ>Подозреваю, что это скорее насторожит и создаст опасение перед нажатием кнопки, нежели побудит ее нажать.

Как вариант есть еще два фокуса привлечь внимание
Вариант первый: Блинковать пару-тройку раз. Скрыть — показать. С каким нить таймаутом в 400 мс примено.

Вариант второй: Тоже блинковать элементом, если он с текстом. Менять ему шрифт: стандартный (который был изначально), этот же но полужирный (FW_BOLD).

Помогает привлечь внимание пользователя.


Как-то так примерно
//функция потока блинкования элемента UI 
DWORD __stdcall BlinkProc_ByVisible(LPVOID lp)
{
    //const std::auto_ptr<BLINK_BY_VIS_PARAM> pParam((BLINK_BY_VIS_PARAM*)lp);

    //const HWND hwnd=(HWND)lp;
    //const HWND hwnd =pParam->hwnd;
        const HWND hwnd=(HWND)lp;
    ASSERT(IsWindow(hwnd));
    if (!IsWindow(hwnd))
        return 1;

    //if (pParam->nSleepBefore)
    //    Sleep(pParam->nSleepBefore);

    //if (!IsWindow(hwnd))
    //    return 1;
    
    enum {TMT_AFTERHIDE=100, TMT_AFTERSHOW=400};

    for(int i=0; i < 3; i++) {
        ::ShowWindow(hwnd,SW_HIDE);
        Sleep(TMT_AFTERHIDE);

        ShowWindow(hwnd,SW_SHOW);
        Sleep(TMT_AFTERSHOW);

        if (!IsWindow(hwnd))
            return 1;
    } 

    return 0;
}

//ну и запуск как-то так
void DoBlinkCtrl(const HWND hwnd)
{
DWORD tid;
const HANDLE hThread=CreateThread(NULL,0,BlinkProc_ByVisible,(LPVOID)hwnd,0,&id);
ASSERT(hThread);
if (hThread)
    CloseHandle(hThread);

}



PS: полвину закоментено, ибо код из реального проекта, там много чего добавляется по сути. Таймауты задержки, возможность дергать через сообщения внешний код перед блинковкой, и после и.т.д. Ну это детали и нюансы, суть та же.
Re[7]: Как изменить цвет кнопки?
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, CEMb, Вы писали:


CEM>>Можно ещё завести таймер и "трясти" кнопку ±3 пикселя вверх-вниз, вправо-влево


ЕМ>Подозреваю, что это скорее насторожит и создаст опасение перед нажатием кнопки, нежели побудит ее нажать.

Как вариант есть еще два фокуса привлечь внимание
Вариант первый: Блинковать пару-тройку раз. Скрыть — показать. С каким нить таймаутом в 400 мс примено.

Вариант второй: Тоже блинковать элементом, если он с текстом. Менять ему шрифт: стандартный (который был изначально), этот же но полужирный (FW_BOLD).

Помогает привлечь внимание пользователя.


Как-то так примерно
//функция потока блинкования элемента UI 
DWORD __stdcall BlinkProc_ByVisible(LPVOID lp)
{
    //const std::auto_ptr<BLINK_BY_VIS_PARAM> pParam((BLINK_BY_VIS_PARAM*)lp);

    //const HWND hwnd=(HWND)lp;
    //const HWND hwnd =pParam->hwnd;
        const HWND hwnd=(HWND)lp;
    ASSERT(IsWindow(hwnd));
    if (!IsWindow(hwnd))
        return 1;

    //if (pParam->nSleepBefore)
    //    Sleep(pParam->nSleepBefore);

    //if (!IsWindow(hwnd))
    //    return 1;
    
    enum {TMT_AFTERHIDE=100, TMT_AFTERSHOW=400};

    for(int i=0; i < 3; i++) {
        ::ShowWindow(hwnd,SW_HIDE);
        Sleep(TMT_AFTERHIDE);

        ShowWindow(hwnd,SW_SHOW);
        Sleep(TMT_AFTERSHOW);

        if (!IsWindow(hwnd))
            return 1;
    } 

    return 0;
}

//ну и запуск как-то так
void DoBlinkCtrl(const HWND hwnd)
{
DWORD tid;
const HANDLE hThread=CreateThread(NULL,0,BlinkProc_ByVisible,(LPVOID)hwnd,0,&id);
ASSERT(hThread);
if (hThread)
    CloseHandle(hThread);

}



PS: половина закоментирована, ибо код из реального проекта, там много чего добавляется по сути. Таймауты задержки, возможность дергать через сообщения внешний код перед блинковкой, способы отрисовки и после и.т.д.

Ну это детали и нюансы, суть та же.