CButton: OnBnClicked() вызывается неправильно при использовании SetState

Я хочу нажать на кнопку и показать, что она "нажата", пока таймер не завершится.

Проблема у меня есть, когда я использую CButton::SetState(TRUE) функция OnBnClickedButton1() вызывается всегда дважды и, что еще хуже, вызывается снова, когда я нажимаю другую кнопку в диалоговом окне или скрываю диалоговое окно.

(Обновление: сейчас я тестировал тот же код дома под VS6 с WindowsXP, он работает нормально, как и ожидалось. На работе (VS2010 с Windows 10) этот код не работает.)

Заголовочный файл

class CTestDialog : public CDialog
{
    CButton btnButton1;

    enum {eTimerCoolingId = 123};
    BOOL m_bCooling;
    DWORD m_dwStartTick;
    ...
}

Файл CPP

...
DDX_Control(pDX, IDC_BUTTON1, m_btnButton1);

void CTestDialog::OnBnClickedButton1()
{
    m_bCooling = !m_bCooling;
    m_btnButton1.SetState(m_bCooling);
    m_dwStartTick = GetTickCount();

    if (m_bCooling)
        SetTimer(eTimerCoolingId,100,NULL);
    else
        KillTimer(eTimerCoolingId);
}

void CTestDlg::OnTimer(UINT nIDEvent) 
{
    int nCoolTime = 5;  // [sec]
    CString str;

    switch(nIDEvent)
    {
    case eTimerCoolingId:

        int nElapsedTime = (GetTickCount() - m_dwStartTick) / 1000;
        if (nElapsedTime > nCoolTime)
        {
            KillTimer(eTimerCoolingId);
            m_bCooling = false;
            m_btnButton1.SetState(FALSE);
            str.Format("Cooler On");
        }
        else
        {
            str.Format("Cooling.. %d [sec]", (nCoolTime - nElapsedTime));
        }
    }

   m_btnButton1.SetWindowText(str);
   CDialog::OnTimer(nIDEvent);
}

1 ответ

Это безнадежно. SetState(TRUE) очень подозрительный и, вероятно, не имеет отступов для кнопок типа push. MSDN говорит:

Msgstr "Установить, будет ли управление кнопкой выделено или нет".

Я пробовал это с разными кнопками (Nornal-, Radio-, CheckBox-, MFCButton). Для всех этих кнопок: SetState заставляет обработчик сообщений вызываться снова. (Не знаю почему!?)

Теперь я использую кнопку - флажок и устанавливаю стиль, похожий на пуш. И вызовите CButton::SetCheck() вместо SetState ().

Другие вопросы по тегам