⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 signal.cpp

📁 Beginning Visual C++ 6源码。Wrox。
💻 CPP
字号:
// Signal.cpp : Implementation of CSignal

#include "stdafx.h"
#include "ATLSignal.h"
#include "OurConstants.h"
#include "TrafficSignal.h"
#include "Signal.h"

/////////////////////////////////////////////////////////////////////////////
// CSignal

HRESULT CSignal::OnDraw(ATL_DRAWINFO& di)
{
   RECT& rc = *(RECT*)di.prcBounds;           // Get control rectangle
   HDC hDC = di.hdcDraw;                      // Get the device context
   COLORREF clrBackGround;                    // Control background color
   OLE_COLOR clrClientBackColor;              // Client background color

   // Get client backgound color and convert to COLORREF
   GetAmbientBackColor(clrClientBackColor);                      // Get background
   ::OleTranslateColor(clrClientBackColor,NULL,&clrBackGround);  // & convert

   HBRUSH hbrBackground = CreateSolidBrush(clrBackGround); // Create brush
   FillRect(hDC,&rc,hbrBackground);           // Fill control area

   // Define position and height of the traffic signal
   m_TrafficSignal.SetPosition((rc.right+rc.left)/2,rc.bottom);
   m_TrafficSignal.SetHeight(rc.bottom-rc.top);

   m_TrafficSignal.Draw(hDC);                 // Draw the signal
	return S_OK;
}

LRESULT CSignal::OnLButtonDown(UINT uMsg, WPARAM wParam,
                               LPARAM lParam, BOOL& bHandled)
{
   // If the signal is stopped, start it
   // If the signal is running, stop it
   m_bSignalGo = !m_bSignalGo;
   if(m_bSignalGo)
      StartSignal();
   else
      StopSignal();
   return 0;
}


// Start the signal
void CSignal::StartSignal()
{
   // Setup a timer with the required interval
   m_TrafficSignal.SetSignalState(m_bStartRed ? STOP : GO);
   m_nTimerID = SetTimer(m_nTimerID, (UINT)m_lStopOrGoTime);

   if (!m_nTimerID)
      exit(1);               // No timer so exit

   Invalidate();             // Get the control redrawn
}

// Stop the signal
void CSignal::StopSignal()
{
   KillTimer(m_nTimerID);    // Destroy the timer
   Invalidate();             // Redraw the control
}

LRESULT CSignal::OnTimer(UINT nIDEvent, WPARAM wParam,
                         LPARAM lParam, BOOL& bHandled)
{
   UINT nInterval = 0;                         // Interval in milliseconds

   // Step to the next signal state and set the time interval
   // based on the new state
   int nNewState = m_TrafficSignal.NextState();  // Go to next state

   switch (nNewState)
   {
      case STOP: case GO:
         nInterval = (UINT)m_lStopOrGoTime;      // Stop or Go interval
         break;

      default:
         nInterval = m_nChangeTime;              // Transient interval
   }

	Fire_SignalChanged(nNewState);
   Invalidate();                                 // Redraw the signal
   KillTimer(m_nTimerID);               // Make sure the old timer is dead

   // Set a new timer event
   m_nTimerID = SetTimer(m_nTimerID, nInterval);
   if (!m_nTimerID)                               // No timer...
      exit(1);                                   // ...so end the program

   return 0;
}

STDMETHODIMP CSignal::get_StartRed(BOOL *pVal)
{
   *pVal = m_bStartRed;
	return S_OK;
}

STDMETHODIMP CSignal::put_StartRed(BOOL newVal)
{
   m_bStartRed = newVal;
	return S_OK;
}

STDMETHODIMP CSignal::get_StopOrGoTime(long *pVal)
{
   *pVal = m_lStopOrGoTime;
	return S_OK;
}

STDMETHODIMP CSignal::put_StopOrGoTime(long newVal)
{
   m_lStopOrGoTime = newVal;
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -