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 ().