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

📄 imageview.cpp

📁 BCAM 1394 Driver
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    nHandle == CRectTracker::hitTop ||
    nHandle == CRectTracker::hitTopRight )
  {
    int height = m_SizeInc.cy * ( rc.Height() / m_SizeInc.cy );

    rc.top = rc.bottom - height;
    if ( rc.top < 0 )
    {
      rc.top = 0;
      rc.bottom = m_SizeInc.cy * ( rc.bottom / m_SizeInc.cy );
    }
  }
  
  if ( nHandle == CRectTracker::hitBottomLeft ||
    nHandle == CRectTracker::hitBottom ||
    nHandle == CRectTracker::hitBottomRight )
  {
    int height = m_SizeInc.cy * ( rc.Height() / m_SizeInc.cy );

    rc.bottom = rc.top + height;
    if ( rc.bottom > rcLimits.bottom )
    {
      rc.bottom = rcLimits.bottom;
      rc.top = max(0, rc.bottom - m_SizeInc.cy * ( rc.Height() / m_SizeInc.cy ));
    }
  }

  if ( nHandle == CRectTracker::hitMiddle)
  { 
    int width = rc.Width();
    int height = rc.Height();

    rc.left = max(0, ( rc.left / m_PosInc.cx ) * m_PosInc.cx);
    rc.top = max(0, ( rc.top / m_PosInc.cy ) * m_PosInc.cy );
    rc.right = rc.left + ( width / m_SizeInc.cx ) * m_SizeInc.cx;
    rc.bottom = rc.top + ( height / m_SizeInc.cy ) * m_SizeInc.cy;
    if ( rc.right > rcLimits.right )
    {
      rc.right = rcLimits.right;
      rc.left = max(0, rc.right - ( width / m_SizeInc.cx ) * m_SizeInc.cx );
    }
    if ( rc.bottom > rcLimits.bottom )
    {
      rc.bottom = rcLimits.bottom;
      rc.top = max(0, rc.bottom - ( height / m_SizeInc.cy ) * m_SizeInc.cy );
    }
  }  

#ifdef DEBUG
    assert ( rc.left % m_PosInc.cx == 0 );
    assert ( rc.top % m_PosInc.cy == 0 );
    assert ( rc.Width() % m_SizeInc.cx == 0 );
    assert ( rc.Height() % m_SizeInc.cy == 0 );
    assert ( rc.right <= rcLimits.right );
    assert ( rc.left <= rcLimits.right );
    assert ( rc.Width() % 4 == 0 );
#endif

  // copy result back
  *lpRect = rc;
  
}

void CImageView::AdjustPoint(LPPOINT lpPoint)
{
  lpPoint->x = m_PosInc.cx * ( lpPoint->x / m_PosInc.cx);
  lpPoint->y = m_PosInc.cy * ( lpPoint->y / m_PosInc.cy);
}


LRESULT CImageView::OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
{

  SetFocus();
  if ( m_bScalable )
  {
    assert( ! m_RectTracker.IsTracking() );

    CPoint Point = CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
    
    CPoint tmp = Point;
    DPtoLP(&tmp);
    
    if (HitTestTrackerBorder())
    {
      m_RectTracker.Track(*this, Point, FALSE);
    }
    else
    {
      if ( m_SensorRect.PtInRect(tmp) )
      {
        m_RectTracker.TrackRubberBand(*this, Point, FALSE);
      }
    }

    if ( m_RectTracker.IsTracking() )
      StartTimer();
  }

  return 0;
}

void CImageView::SetNewAOI()
{

  try
  {
    m_pCamera->SetAOI(m_RectTracker.m_rect);
  }
  CATCH_REPORT();

}
  
  LRESULT CImageView::OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
  {

  bHandled = FALSE;

  if ( LOWORD(lParam) == HTCLIENT )
  {
    assert ( m_pCamera != NULL );

    ShowAOISize();

    if ( ! ShowCursorPos() )
    {
      m_MainFrame.m_Sbar.SetPaneText(ID_POS_PANE, "");
    }

    if (HitTestTrackerBorder() && m_RectTracker.SetCursor(m_hWnd, LOWORD(lParam)) )
    {
      // Handled.
      bHandled = TRUE;
    }

    // Set crosshair cursor and show pixel value
    CBcamBitmap* pBitmap = m_pCamera->GetBitmap();
    if ( pBitmap != 0 )
    {
      CPoint pt;
      GetLogicalCursorPos(pt);
      if ( pBitmap->GetRect().PtInRect(pt) )
      {
        if ( ! bHandled ) 
        {
          SetCursor(m_hCursor);
          bHandled = TRUE;
        }
      }
      if ( ! ShowPixelValue(pBitmap) )
      {
        m_MainFrame.m_Sbar.SetPaneText(ID_VALUE_PANE, "");
      }
    } 
  } 
  return 0;
}

bool CImageView::ShowCursorPos()
{
  CPoint pt;
  GetLogicalCursorPos(pt);

  if ( m_SensorRect.PtInRect(pt)  )
  {
    CString str;
    str.Format(" ( %d, %3d )", pt.x, pt.y);
    m_MainFrame.m_Sbar.SetPaneText(ID_POS_PANE, str);
    return true;
  }
  return false;
}

// Show pixel value under the cursor.
bool CImageView::ShowPixelValue(CBcamBitmap* pBitmap)
{
  if ( pBitmap == NULL )
    pBitmap = m_pCamera->GetBitmap();

  if ( pBitmap != NULL )
  {
    CPoint pt;
    GetLogicalCursorPos(pt);
    if ( m_RectTracker.GetTrackerHandle() == CRectTracker::hitNothing && pBitmap->GetRect().PtInRect(pt) )
    {
      CPoint origin = pBitmap->GetOrigin();
      CString str;
      RGBTRIPLE rgb = (*pBitmap)(pt.x - origin.x, pt.y - origin.y);
      str.Format("R: %-3u G: %-3u B: %-3u", (long) rgb.rgbtRed, (long) rgb.rgbtGreen, (long) rgb.rgbtBlue );
      m_MainFrame.m_Sbar.SetPaneText(ID_VALUE_PANE, str);
      return true;
    }
  }
  return false;
}

void CImageView::ShowAOISize()
{
  if ( ! m_bActiveChild )
    return;

  CSize size;
  if ( m_VideoFormat != DCS_Format7 )
  {
    size = m_SensorSize;
  }
  else
  {
    size = m_RectTracker.m_rect.Size();
  }

  CString str;
  if ( m_VideoFormat != DCS_Format7)
  {
    str.Format(" Image Size: %d x %d", size.cx, size.cy );
  }
  else
  {
    str.Format(" AOI: (%d, %d): %d x %d", m_RectTracker.m_rect.left, m_RectTracker.m_rect.top, size.cx, size.cy);
  }
  m_MainFrame.m_Sbar.SetPaneText(ID_AOI_PANE, str);
}


void CImageView::StartTimer()
{
  m_nIdEvent = SetTimer(1, s_dwDragTimerInterval);
  ATLASSERT(m_nIdEvent);
}

void CImageView::StopTimer()
{
  KillTimer(m_nIdEvent);
}

LRESULT CImageView::OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled)
{
  // Ensure tracker visibility.

  CRect rcClient;
  GetClientRect(rcClient);

  CPoint ptCursor;
  GetCursorPos(&ptCursor);
  ScreenToClient(&ptCursor);

  if (!rcClient.PtInRect(ptCursor))
  {
    CSize offset;
    offset.cx = lcm(m_PosInc.cx, m_SizeInc.cx);
    offset.cy = lcm(m_PosInc.cy, m_SizeInc.cy);
    int ScrollCodeX = -1;
    int ScrollCodeY = -1;

    if (ptCursor.x > rcClient.right && m_ptOffset.x < m_sizeAll.cx - rcClient.Width())
    {
      ScrollCodeX = SB_LINEDOWN;
    }

    if (ptCursor.y > rcClient.bottom && m_ptOffset.y < m_sizeAll.cy - rcClient.Height())
    {
      ScrollCodeY = SB_LINEDOWN;
    }

    if (ptCursor.x < rcClient.left&& m_ptOffset.x > 0 )
    {
      ScrollCodeX = SB_LINEUP;
    }

    if (ptCursor.y < rcClient.top && m_ptOffset.y > 0)
    {
      ScrollCodeY = SB_LINEUP;
    }

    if ( ScrollCodeX != -1 || ScrollCodeY != -1 )
    {
      m_RectTracker.AdjustRect(m_RectTracker.GetTrackerHandle(), m_RectTracker.m_rect);
      if ( ScrollCodeX != -1 )
        DoScroll(SB_HORZ, ScrollCodeX, (int&) m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx );
      if ( ScrollCodeY != -1 )
        DoScroll(SB_VERT, ScrollCodeY, (int&) m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy );
      // Actualize rubbar band. This is done by sending a WM_MOUSEMOVE message, which will be processed by
      // the message loop of the TrackHandle function
      CRect rect;
      GetClientRect(&rect);
      CPoint pt;
      GetCursorPos(&pt);
      ScreenToClient(&pt);
      pt.x = max(pt.x, rect.left);
      pt.x = min(pt.x, rect.right);
      pt.y = max(pt.y, rect.top);
      pt.y = min(pt.y, rect.bottom);
      PostMessage(WM_MOUSEMOVE, MK_LBUTTON, pt.x + ( pt.y << 16 ) );
    } 

  }

  ShowAOISize();
  ShowCursorPos();

  bHandled = FALSE;

  return 0;

}


bool CImageView::SaveLayout()
{

  if ( m_pCamera == NULL )
  {
    assert(false);
    return false;
  }

  bool closeCamera = false;

  bool ret = false;

  try
  {

    if ( ! m_pCamera->IsOpen() )
    {
      m_pCamera->Activate();
      closeCamera = true;
    }

    CString keyName = APPLICATION_KEY + m_pCamera->Info.NodeId();
    CPropertyBagPtr ptrRootBag;
    try
    {
      ptrRootBag = CRegistryPropertyBag::Open(keyName);
    }
    catch ( BcamException& e)
    {
      if ( e.Error() == BCAM_E_BAG_DOES_NOT_EXIST )
        ptrRootBag = CRegistryPropertyBag::Create(keyName);
      else
        throw e;
    }

    CPropertyBagPtr ptrWindowBag;
    try
    {
      ptrWindowBag = ptrRootBag->GetBag("ImageView");
    }
    catch ( BcamException& e)
    {
      if ( e.Error() == BCAM_E_BAG_DOES_NOT_EXIST )
        ptrWindowBag = ptrRootBag->CreateBag("ImageView");
      else
        throw e;
    }


    WINDOWPLACEMENT p;
    ret =  ( ::GetWindowPlacement(GetParent(), &p) == TRUE );
    CPoint center = GetLogicalCenter();
    if ( ret )
    {
      ptrWindowBag->WriteLong("left", p.rcNormalPosition.left);
      ptrWindowBag->WriteLong("bottom", p.rcNormalPosition.bottom);
      ptrWindowBag->WriteLong("top", p.rcNormalPosition.top);
      ptrWindowBag->WriteLong("right", p.rcNormalPosition.right);
      ptrWindowBag->WriteLong("showCmd", p.showCmd);
      ptrWindowBag->WriteFloat("zoom", GetZoomLevel());
      ptrWindowBag->WriteBool("fit", IsZoomedToFit());
      ptrWindowBag->WriteLong("scrollx", center.x);
      ptrWindowBag->WriteLong("scrolly", center.y);
    }
  }
  catch(BcamException&  e )
  {
    e = e;
    ATLTRACE("Exception occured when saving window layout: %d (%s)\n", e.Error(), e.Description());
    ret = false;
  }

  if ( closeCamera )
  {
    try
    {
      m_pCamera->Deactivate();
    }
    catch(BcamException& e )
    {
      e = e;
      ATLTRACE("Exception occured when closing the device: %d (%s)\n", e.Error(), e.Description());
    }
  }

  return ret;

}



bool CImageView::RestoreLayout()
{
  bool ret = false;
  bool closeCamera = false;

  if ( m_pCamera == NULL )
  {
    assert(false);
    return false;
  }

  try
  {


    if ( ! m_pCamera->IsOpen() )
    {
      m_pCamera->Activate();
      closeCamera = true;
    }

    CString keyName = APPLICATION_KEY + m_pCamera->Info.NodeId();
    CPropertyBagPtr ptrBag = CRegistryPropertyBag::Open(keyName)->GetBag("ImageView");

    WINDOWPLACEMENT p;
    ZeroMemory(&p, sizeof(p));
    p.length = sizeof(p);
    p.rcNormalPosition.left = ptrBag->ReadLong("left");
    p.rcNormalPosition.right = ptrBag->ReadLong("right");
    p.rcNormalPosition.bottom = ptrBag->ReadLong("bottom");
    p.rcNormalPosition.top = ptrBag->ReadLong("top");
    p.showCmd = ptrBag->ReadLong("showCmd");
    double  zoom = ptrBag->ReadFloat("zoom");

    bool zoomToFit = ptrBag->ReadBool("fit");
    ::SetWindowPlacement(GetParent(), &p);

    if ( ! zoomToFit )
    {
      SetZoomLevel(zoom);
      long spx = 0;
      long spy = 0;
      try
      {
        spx = ptrBag->ReadLong("scrollx");
        spy = ptrBag->ReadLong("scrolly");
      }
      catch ( BcamException& )
      {
        /* NOP */
      }
      UpdateViewPort(&CPoint(spx, spy));

    }
    if ( zoomToFit )
      ZoomToFit();


  }
  catch(BcamException& e )
  {
    e = e;
    ATLTRACE("Exception occured when restoring window layout: %d (%s)", e.Error(), e.Description());
    ret = false;
  }

  if ( closeCamera )
  {
    try
    {
      m_pCamera->Deactivate();
    }
    catch(BcamException& e )
    {
      e = e;
      ATLTRACE("Exception occured when closing the device: %d (%s)", e.Error(), e.Description());
    }
  }

  return ret;
}


⌨️ 快捷键说明

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