DXAppView.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:6k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**   * HandVu - a library for computer vision-based hand gesture   * recognition.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License   * as published by the Free Software Foundation; either version 2   * of the License, or (at your option) any later version.   *   * This program is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software   * Foundation, Inc., 59 Temple Place - Suite 330,    * Boston, MA  02111-1307, USA.   *   * $Id: DXAppView.cpp,v 1.6 2004/10/19 01:44:06 matz Exp $ **/ #include "stdafx.h"
  2. #include "Common.h"
  3. #include "DXApp.h"
  4. #include "DXAppDoc.h"
  5. #include "DXAppView.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #endif
  9. // CDXAppView
  10. IMPLEMENT_DYNCREATE(CDXAppView, CScrollView)
  11. BEGIN_MESSAGE_MAP(CDXAppView, CScrollView)
  12.   ON_WM_SIZE()
  13. ON_WM_MOUSEMOVE()
  14. ON_WM_LBUTTONDOWN()
  15. ON_WM_LBUTTONUP()
  16. END_MESSAGE_MAP()
  17. // CDXAppView construction/destruction
  18. CDXAppView::CDXAppView()
  19. : m_video_scale(-1),
  20.   m_trap_mouse(false)
  21. {
  22. }
  23. CDXAppView::~CDXAppView()
  24. {
  25. }
  26. BOOL CDXAppView::PreCreateWindow(CREATESTRUCT& cs)
  27. {
  28. return CView::PreCreateWindow(cs);
  29. }
  30. void CDXAppView::OnInitialUpdate()
  31. {
  32. CScrollView::OnInitialUpdate();
  33. SetScrollSizes(MM_TEXT, CSize(0, 0));
  34. }
  35. void CDXAppView::OnSize(UINT nType, int cx, int cy) 
  36. {
  37. CScrollView::OnSize(nType, cx, cy);
  38.   VERBOSE2(4, "ApV: OnSize %d %d", cx, cy);
  39.   SetVideoWindowSize(cx, cy);
  40. // Invalidate(true);
  41. }
  42. void CDXAppView::SetVideoWindowSize(int width, int height) 
  43. {
  44.   CDXAppDoc* pDoc = GetDocument();
  45. ASSERT_VALID(pDoc);
  46.   int source_width, source_height;
  47.   pDoc->GetDXManager()->GetVideoSourceSize(&source_width, &source_height);
  48.   if (source_height<0) {
  49.     source_height = -source_height;
  50.   }
  51.   CRect rc;
  52.   GetClientRect( &rc );
  53.   if (width==0 && height==0) {
  54.     width = source_width;
  55.     height = source_height;
  56. //      MoveWindow(&rc);
  57.   } else {
  58.     width = max(width, source_width);
  59.     height = max(height, source_height);
  60.     double ratio = (double)source_width/(double)source_height;
  61.     width = min(width, (int)((double)height*ratio));
  62.     height = min(height, (int)((double)width/ratio));
  63.   }
  64.   pDoc->GetDXManager()->SetVideoWindowPosition( rc.left, rc.top, width, height );
  65.   m_video_scale = (double)(rc.right-rc.left)/(double)source_width;
  66.   m_local_fixed_mouse.x = m_virtual_mouse.x = (rc.right-rc.left)/2;
  67.   m_local_fixed_mouse.y = m_virtual_mouse.y = (rc.bottom-rc.top)/2;
  68.   SetScrollSizes(MM_TEXT, CSize(source_width, source_height));
  69.   VERBOSE2(4, "ApV: scroll size %d %d", source_width, source_height);
  70. }
  71. void CDXAppView::OnMouseMove(UINT nFlags, CPoint point) 
  72. {
  73.   if (m_trap_mouse) {
  74.     /*
  75.     VERBOSE2(3, TEXT("ApV: pt %d %d"), point.x, point.y));
  76.     VERBOSE2(3, TEXT("ApV: fx %d %d"), m_local_fixed_mouse.x, m_local_fixed_mouse.y));
  77.     VERBOSE2(3, TEXT("ApV: gg %d %d"), m_fixed_mouse.x, m_fixed_mouse.y));
  78.     CPoint glob = m_fixed_mouse;
  79.     ScreenToClient(&glob);
  80.     VERBOSE2(3, TEXT("ApV: cc %d %d"), glob.x, glob.y));
  81.     */
  82.     if (point.x==m_local_fixed_mouse.x && point.y==m_local_fixed_mouse.y) {
  83.       return;
  84.     }
  85.     INPUT input;
  86.     input.type = INPUT_MOUSE;
  87.     input.mi.dx = m_local_fixed_mouse.x-point.x;
  88.     input.mi.dy = m_local_fixed_mouse.y-point.y;
  89.     input.mi.mouseData = 0;
  90.     input.mi.dwFlags = MOUSEEVENTF_MOVE;
  91.     input.mi.time = 0;
  92.   //  VERBOSE2(3, TEXT("ApV: will send %d %d"), input.mi.dx, input.mi.dy));
  93.     int put = SendInput(1, &input, sizeof(INPUT));
  94.     ASSERT(put==1);
  95.     CRect rc;
  96.     GetClientRect( &rc );
  97.     m_virtual_mouse.x += point.x-m_local_fixed_mouse.x;
  98.     m_virtual_mouse.y += point.y-m_local_fixed_mouse.y;
  99.   //  VERBOSE2(3, TEXT("ApV: actual %d %d"), m_virtual_mouse.x, m_virtual_mouse.y));
  100.     if (m_virtual_mouse.x<rc.left) m_virtual_mouse.x = rc.left;
  101.     if (m_virtual_mouse.x>rc.right) m_virtual_mouse.x = rc.right;
  102.     if (m_virtual_mouse.y<rc.top) m_virtual_mouse.y = rc.top;
  103.     if (m_virtual_mouse.y>rc.bottom) m_virtual_mouse.y = rc.bottom;
  104.     double x = (double)m_virtual_mouse.x/(double)(rc.right-rc.left);
  105.     double y = (double)m_virtual_mouse.y/(double)(rc.bottom-rc.top);
  106.     CDXAppDoc* pDoc = GetDocument();
  107.   ASSERT_VALID(pDoc);
  108.     pDoc->GetDXManager()->HV()->OnMouseMove(nFlags, x, y);
  109.   } else {
  110.     // don't trap mouse
  111.     CRect rc;
  112.     GetClientRect( &rc );
  113.     double x = (double)point.x/(double)(rc.right-rc.left);
  114.     double y = (double)point.y/(double)(rc.bottom-rc.top);
  115.     x = min(x, 1.0);
  116.     y = min(y, 1.0);
  117.     CDXAppDoc* pDoc = GetDocument();
  118.   ASSERT_VALID(pDoc);
  119.     pDoc->GetDXManager()->HV()->OnMouseMove(nFlags, x, y);
  120.    return CScrollView::OnMouseMove(nFlags, point);
  121.   }
  122. }
  123. /* left button: click to set left-upper corner starting point of area
  124. */
  125. void CDXAppView::OnLButtonDown(UINT nFlags, CPoint point) 
  126. {
  127. }
  128. /* left button: after dragging, releasing button sets lower-right corner
  129. * of area. update the Doc.
  130. */
  131. void CDXAppView::OnLButtonUp(UINT nFlags, CPoint point) 
  132. {
  133.   CRect rc;
  134.   GetClientRect( &rc );
  135.   double x = (double)point.x/(double)(rc.right-rc.left);
  136.   double y = (double)point.y/(double)(rc.bottom-rc.top);
  137.   CDXAppDoc* pDoc = GetDocument();
  138. ASSERT_VALID(pDoc);
  139.   pDoc->GetDXManager()->HV()->OnLButtonUp(nFlags, x, y);
  140. }
  141. void CDXAppView::OnDraw(CDC* /*pDC*/)
  142. {
  143. // CDXAppDoc* pDoc = GetDocument();
  144. // ASSERT_VALID(pDoc);
  145. }
  146. // CDXAppView diagnostics
  147. #ifdef _DEBUG
  148. void CDXAppView::AssertValid() const
  149. {
  150. CView::AssertValid();
  151. }
  152. void CDXAppView::Dump(CDumpContext& dc) const
  153. {
  154. CView::Dump(dc);
  155. }
  156. CDXAppDoc* CDXAppView::GetDocument() const // non-debug version is inline
  157. {
  158. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDXAppDoc)));
  159. return (CDXAppDoc*)m_pDocument;
  160. }
  161. #endif //_DEBUG
  162. // CDXAppView message handlers