1

我想单击一个按钮并将其显示为“按下”,直到计时器终止。

我遇到的问题是,我使用CButton::SetState(TRUE)的函数OnBnClickedButton1()总是被调用两次,更糟糕的是,当我按下对话框中的另一个按钮或隐藏对话框窗口时,它会再次被调用。

(更新:我现在已经在家里用 WindowsXP 在 VS6 下测试了相同的代码,它按预期工作正常。在工作中(VS2010 和 Window 10)这个代码不起作用。)

头文件

class CTestDialog : public CDialog
{
    CButton btnButton1;

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

文件

...
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);
}
4

1 回答 1

0

这是没有希望的。SetState(TRUE) 非常可疑,可能不适合像按钮一样的按钮。MSDN 说:

“设置按钮控件是否高亮”。

我尝试过使用不同的按钮(Nornal-、Radio-、CheckBox-、MFCButton)。对于所有这些按钮: SetState 正在强制再次调用消息处理程序。(不知道为什么!?)

我现在使用Check-Box Button 并设置类似推送的样式。并调用CButton::SetCheck()而不是 SetState()。

于 2016-04-21T11:26:48.140 回答