1

ボタンをクリックして、タイマーが終了するまで「押された」ことを示したい。

CButton::SetState(TRUE)私が抱えている問題は、関数を使用するOnBnClickedButton1()と常に2回呼び出され、さらに悪いことに、ダイアログで別のボタンを押すか、ダイアログウィンドウを非表示にすると、再度呼び出されます。

(更新: WindowsXP を使用した VS6 で自宅で同じコードをテストしましたが、期待どおりに動作します。職場 (Windows 10 を使用した VS2010) では、このコードは動作しません。)

ヘッダーファイル

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

1 に答える 1

0

絶望的です。SetState(TRUE) は非常に怪しげで、おそらくボタンのようなプッシュには適していません。MSDN は次のように述べています。

「ボタンコントロールをハイライトするかどうかを設定する」.

さまざまなボタン(Nornal-、Radio-、CheckBox-、MFCButton)で試しました。このすべてのボタンについて: SetState は、メッセージ ハンドラーの再呼び出しを強制しています。(なぜだかわからない!?)

ここで、チェック ボックスボタンを使用して、プッシュのようなスタイルを設定します。SetState()の代わりにCButton::SetCheck()を呼び出します。

于 2016-04-21T11:26:48.140 に答える