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

📄 tbareditctrlint.cpp

📁 BCAM 1394 Driver
💻 CPP
字号:
//-----------------------------------------------------------------------------
//  (c) 2002 by Basler Vision Technologies
//  Section:  Vision Components
//  Project:  BCAM
//  $Header: TBarEditCtrlInt.cpp, 3, 02.10.2002 14:31:30, Nebelung, H.$
//-----------------------------------------------------------------------------
/**
\file     TBarEditCtrlInt.cpp
\brief    implementation of the CTBarEditCtrlInt class.
*/
//////////////////////////////////////////////////////////////////////

#include <atlbase.h>
#include <atlapp.h>
extern  CAppModule _Module;
#include <atlwin.h>

#include "ChkRecursion.h"
#include "TBarEditCtrlInt.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction

CTBarEditCtrlInt::CTBarEditCtrlInt(bool bPostMsgEnabled /*= true*/)
: CTBarEditCtrlBase(bPostMsgEnabled)
{
  m_nFormatWidth     = 1;
  m_nFormatPrecision = 1;
  m_pFmtFnc                            = NULL;
  m_nLineSize                              = 0;
  m_nPageSize                              = 0;
}

CTBarEditCtrlInt::~CTBarEditCtrlInt()
{
}

//////////////////////////////////////////////////////////////////////
// 

bool CTBarEditCtrlInt::SetRangeMin(int nRangeMin, bool bRedraw /*= true*/)
{
  return SetRange(nRangeMin, m_nRangeMax, bRedraw);
}

bool CTBarEditCtrlInt::SetRangeMax(int nRangeMax, bool bRedraw /*= true*/)
{
  return SetRange(m_nRangeMin, nRangeMax, bRedraw);
}

bool CTBarEditCtrlInt::SetRange(int nRangeMin, int nRangeMax, bool bRedraw /*= true*/)
{
  if ( nRangeMin >= nRangeMax )
    return false;
  
  m_nRangeMin = nRangeMin;
  m_nRangeMax = nRangeMax;
  
  return UpdateRange(bRedraw);
}

int CTBarEditCtrlInt::GetRangeMin() const
{
  return m_nRangeMin;
}

int CTBarEditCtrlInt::GetRangeMax() const
{
  return m_nRangeMax;
}

void CTBarEditCtrlInt::GetRange(int& nMin, int& nMax) const
{
  nMin = GetRangeMin();
  nMax = GetRangeMax();
}

//////////////////////////////////////////////////////////////////////
// 

bool CTBarEditCtrlInt::UpdateRange(bool bRedraw /*= true*/)
{
  // compute absolute range to determine if scaling is necessary
  m_nRangeAbs      = abs(m_nRangeMin) + abs(m_nRangeMax);
  
  // assume no scaling necessary
  m_nScaleFactor   = 1;
  m_nScaleRangeMin = m_nRangeMin;
  m_nScaleRangeMax = m_nRangeMax;
  
  if ( m_nRangeAbs >= SHRT_MAX )
  {
    __int64 nScaleFactor;
    
    // scaling is necessary
    nScaleFactor   = ((__int64) m_nRangeAbs * 1000) / (SHRT_MAX-1);
    nScaleFactor   = (nScaleFactor + 999) / 1000;
    m_nScaleFactor = (int) nScaleFactor;
    
    if ( m_nRangeAbs % m_nScaleFactor != 0 )
      m_nScaleFactor++;
    
    m_nScaleRangeMin = (m_nRangeMin / m_nScaleFactor) - 1;
    m_nScaleRangeMax = (m_nRangeMax / m_nScaleFactor) + 1;
    
    //              ATLTRACE("CTBarEditCtrlInt::UpdateRangeInt f=%d, min=%d, max=%d\n", m_nScaleFactor, m_nScaleRangeMin, m_nScaleRangeMax);
  }
  
  CTrackBarCtrl::SetRange(m_nScaleRangeMin, m_nScaleRangeMax, bRedraw);
  
  UpdateRangeText();
  
  // update line and page size
  if ( m_nLineSize != 0 )
    SetLineSize(m_nLineSize);
  
  if ( m_nPageSize != 0 )
    SetPageSize(m_nPageSize);
  
  // call impl of parent class (if overridden)
  return NotifyRangeChanged(bRedraw);
}

void CTBarEditCtrlInt::UpdateRangeText()
{
  char    szBuf[256];
  
  FmtValue(szBuf, m_nRangeMin);
  if ( m_ctrlTxtL.IsWindow() )
    m_ctrlTxtL.SetWindowText(szBuf);
  
  FmtValue(szBuf, m_nRangeMax);
  if ( m_ctrlTxtR.IsWindow() )
    m_ctrlTxtR.SetWindowText(szBuf);
}

bool CTBarEditCtrlInt::NotifyRangeChanged(bool bRedraw /*= true*/)
{
  // limit value to range
  if ( LimitValue() && m_bWantReturn )
  {
    m_bOnChange2Parent = m_bOnUpdate2Parent = true;                         // notify parent
    
    // update controls
    UpdateValue();
    UpdateThumb(m_nValue);
    
    return true;
  }
  return false;
}

//////////////////////////////////////////////////////////////////////
// 

/**********
* SetValue - Set the value
*                                              Posting of EN_UPDATE and EN_CHANGE is *forced*, if WantReturn is active
*
* \param               nValue                          the value to set
* \param               bTrackThumb             if true, the thumb position will be set. Is mostly used internal
* \return      true                                    if the given value is out of bounds and is corrected
*/
bool CTBarEditCtrlInt::SetValue(int nValue, bool bTrackThumb /*= true*/)
{
  // force posting EN_UPDATE and EN_CHANGE
  if ( m_bWantReturn )
    m_bOnChange2Parent = m_bOnUpdate2Parent = true;                         // notify parent
  
  return InternalSetValue(nValue, bTrackThumb);
}

/**********
* InternalSetValue - Set the value
*                                                                              Posting of EN_UPDATE and EN_CHANGE is *not* forced, if WantReturn is active
*
* \param               nValue                          the value to set
* \param               bTrackThumb             if true, the thumb position will be set. Is mostly used internal
* \return      true                                    if the given value is out of bounds and is corrected
*/
bool CTBarEditCtrlInt::InternalSetValue(int nValue, bool bTrackThumb /*= true*/)
{
  m_nValue = nValue;
  
  // limit value to range
  bool    bNotChgd = !LimitValue();
  
  // update controls
  UpdateValue();
  UpdateThumb(m_nValue, bTrackThumb);
  
  return bNotChgd;
}

bool CTBarEditCtrlInt::DDXValue(UINT /*nID*/, int &nValue, BOOL bSave, BOOL /* bValidate = false*/)
{
  if ( bSave )
  {
    nValue = GetValue();
    return true;
  }
  
  return SetValue(nValue);
}

bool CTBarEditCtrlInt::DDXValue(UINT /*nID*/, long &nValue, BOOL bSave, BOOL /* bValidate = false*/)
{
  if ( bSave )
  {
    nValue = GetValue();
    return true;
  }
  
  return SetValue(nValue);
}

/**********
* GetValue - Get the value
*/
int CTBarEditCtrlInt::GetValue()
{
  return m_nValue;
}

/**********
* SetLineSize - see MSDN
*/
int CTBarEditCtrlInt::SetLineSize(int nLogSize)
{
  int     nNewSize, nCurSize;
  
  nNewSize                = nLogSize / m_nScaleFactor;
  nCurSize                = CTBarCtrlBase::SetLineSize(nNewSize);
  m_nLineSize     = nLogSize;
  
  return nCurSize * m_nScaleFactor;
}

/**********
* GetLineSize - see MSDN
*/
int CTBarEditCtrlInt::GetLineSize(void)
{
  return CTBarCtrlBase::GetLineSize() * m_nScaleFactor;
}

/**********
* SetPageSize - see MSDN
*/
int CTBarEditCtrlInt::SetPageSize(int nLogSize)
{
  int     nNewSize, nCurSize;
  
  nNewSize                = nLogSize / m_nScaleFactor;
  nCurSize                = CTBarCtrlBase::SetPageSize(nNewSize);
  m_nPageSize     = nLogSize;
  
  return nCurSize * m_nScaleFactor;
}

/**********
* GetPageSize - see MSDN
*/
int CTBarEditCtrlInt::GetPageSize(void)
{
  return CTBarCtrlBase::GetPageSize() * m_nScaleFactor;
}

void CTBarEditCtrlInt::SetPrecision(int nPrecision, int nWidth /*= 0*/)
{
  m_nFormatWidth     = nWidth;
  m_nFormatPrecision = nPrecision;
  
  UpdateRange(true);
  
  UpdateValue();
  UpdateThumb(m_nValue, false);
}

//////////////////////////////////////////////////////////////////////
// 

int     CTBarEditCtrlInt::FmtValue(char *szBuf, int nValue)
{
  int     nCharsPrinted;
  
  if ( m_pFmtFnc != NULL )
    nCharsPrinted = (m_pFmtFnc)(szBuf, nValue, m_nFormatWidth, m_nFormatPrecision);
  else
    nCharsPrinted = sprintf(szBuf, _T("%*d"), m_nFormatWidth, nValue);
  
  return nCharsPrinted;
}

void CTBarEditCtrlInt::UpdateValue()
{
  char    szBuf[128];
  
  FmtValue(szBuf, m_nValue);
  
  if ( CEditCtrlBase::IsWindow() )
    if ( strcmp(m_szWndTxt, szBuf) )
      CEditCtrlBase::SetWindowText(szBuf);
}

bool CTBarEditCtrlInt::LimitValue()
{
  if ( m_nValue < m_nRangeMin )
  {
    m_nValue = m_nRangeMin;
    return true;
  }
  
  if ( m_nValue > m_nRangeMax )
  {
    m_nValue = m_nRangeMax;
    return true;
  }
  
  return false;
}

//////////////////////////////////////////////////////////////////////
// 

void CTBarEditCtrlInt::UndoInput()
{
  int             nValue = 0, nStartPos, nEndPos;
  
  // get current caret position
  CEditCtrlBase::GetSel(nStartPos, nEndPos);
  
  // set last know value
  SetValue(m_nValue);
  
  // restore caret
  CEditCtrlBase::SetSel(nStartPos, nEndPos);
}

bool CTBarEditCtrlInt::UpdateEditText()
{
  static                          int     nRecursivCalls = 0;
  CChkRecursion   cChkRecursion(&nRecursivCalls);
  
  if ( cChkRecursion.Check(2) )
  {
    //              ATLTRACE("CTBarEditCtrlInt::UpdateEditText !!!max. recursion!!!\n");
    return false;
  }
  
  char    szBuf[256];
  int             nValue = 0, nStartPos, nEndPos;
  
  // get current caret position
  CEditCtrlBase::GetSel(nStartPos, nEndPos);
  
  // get current edit text and value
  if ( CEditCtrlBase::GetWindowText(szBuf, sizeof(szBuf)-1) )
  {
    nValue = atoi(szBuf);
    
    // force SetValue(), even if value doesn't differ!
    if ( strcmp(m_szWndTxt, szBuf) )
      m_szWndTxt[0] = '\0';
  }
  
  // if the value has changed...
  // ... reflect value to all associated controls
  // ... reposition the caret
  if ( nValue != m_nValue )
  {
    InternalSetValue(nValue);
    CEditCtrlBase::SetSel(nStartPos, nEndPos);
    return true;
  }
  
  return false;
}

//////////////////////////////////////////////////////////////////////
// 

bool CTBarEditCtrlInt::GoCenterValue()
{
  if ( m_bWantReturn )
    m_bOnChange2Parent = m_bOnUpdate2Parent = true;
  
  return SetValue(m_nRangeMin + (m_nRangeAbs / 2));
}

//////////////////////////////////////////////////////////////////////
// 

LRESULT CTBarEditCtrlInt::HScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
  static  bool    bEventThumbPosition = false;
  int             nThumbPos = (short) HIWORD(wParam);
  
  bHandled           = false;
  m_bOnChange2Parent = false;
  m_bOnUpdate2Parent = false;
  bool notifyParent = false;
  
  switch( LOWORD(wParam) )
  {
  case TB_TOP:
  case TB_BOTTOM:                                 // pos1/home
  case TB_LINEUP:
  case TB_LINEDOWN:                               // cursor up/down
  case TB_PAGEUP:
  case TB_PAGEDOWN:                               // page up/down
    InternalSetValue(CTBarCtrlBase::GetPos() * m_nScaleFactor, false);
    notifyParent = m_bLiveUpdateEnabled;
    break;
  case TB_THUMBPOSITION:  // User has dragged
    bEventThumbPosition = true;
    InternalSetValue(nThumbPos * m_nScaleFactor);
    notifyParent = m_bLiveUpdateEnabled;
    break;
  case TB_THUMBTRACK:                     // User is dragging
    if ( !bEventThumbPosition )
    {
      InternalSetValue(nThumbPos * m_nScaleFactor);
      notifyParent = m_bLiveUpdateEnabled;
    }
    
    bEventThumbPosition = false;
    break;
  case TB_ENDTRACK:                               // end of dragging/moving
    notifyParent = true;
    
    
    break;
  default:
    break;
  }
  
  if ( notifyParent && m_bWantReturn  )
  {
    if ( m_nPostMsgID )
    {
      PostParent(WM_COMMAND, MAKELPARAM(m_nPostMsgID, EN_UPDATE), (LPARAM) m_hEditCtrl);
      PostParent(WM_COMMAND, MAKELPARAM(m_nPostMsgID, EN_CHANGE), (LPARAM) m_hEditCtrl);
    }
    else
    {
      PostParent(WM_COMMAND, MAKELPARAM(m_nEditCtrlID, EN_UPDATE), (LPARAM) m_hEditCtrl);
      PostParent(WM_COMMAND, MAKELPARAM(m_nEditCtrlID, EN_CHANGE), (LPARAM) m_hEditCtrl);
    }
    
    m_bOnChange2Parent = true;
    m_bOnUpdate2Parent = true;
    
  } 
  
  
  
  //      ATLTRACE("CTBarEditCtrlBase::OnHScroll w=%x -> t=%d\n", wParam, nThumbPos);
  return 0;
}

⌨️ 快捷键说明

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