PCBMatchDlg.cpp
上传用户:bxq2008bxq
上传日期:2022-07-18
资源大小:6138k
文件大小:5k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. // PCBMatchDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "PCBMatch.h"
  5. #include "PCBMatchDlg.h"
  6. #include "SelectDevice.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  11. class CAboutDlg : public CDialog
  12. {
  13. public:
  14. CAboutDlg();
  15. // 对话框数据
  16. enum { IDD = IDD_ABOUTBOX };
  17. protected:
  18. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  19. // 实现
  20. protected:
  21. DECLARE_MESSAGE_MAP()
  22. };
  23. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  24. {
  25. }
  26. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28. CDialog::DoDataExchange(pDX);
  29. }
  30. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  31. END_MESSAGE_MAP()
  32. // CPCBMatchDlg 对话框
  33. CPCBMatchDlg::CPCBMatchDlg(CWnd* pParent /*=NULL*/)
  34. : CDialog(CPCBMatchDlg::IDD, pParent)
  35. {
  36. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  37. }
  38. void CPCBMatchDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. }
  42. BEGIN_MESSAGE_MAP(CPCBMatchDlg, CDialog)
  43. ON_WM_SYSCOMMAND()
  44. ON_WM_PAINT()
  45. ON_WM_QUERYDRAGICON()
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. // CPCBMatchDlg 消息处理程序
  49. BOOL CPCBMatchDlg::OnInitDialog()
  50. {
  51. CDialog::OnInitDialog();
  52. // 将“关于...”菜单项添加到系统菜单中。
  53. // IDM_ABOUTBOX 必须在系统命令范围内。
  54. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  55. ASSERT(IDM_ABOUTBOX < 0xF000);
  56. CMenu* pSysMenu = GetSystemMenu(FALSE);
  57. if (pSysMenu != NULL)
  58. {
  59. CString strAboutMenu;
  60. strAboutMenu.LoadString(IDS_ABOUTBOX);
  61. if (!strAboutMenu.IsEmpty())
  62. {
  63. pSysMenu->AppendMenu(MF_SEPARATOR);
  64. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  65. }
  66. }
  67. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  68. //  执行此操作
  69. SetIcon(m_hIcon, TRUE); // 设置大图标
  70. SetIcon(m_hIcon, FALSE); // 设置小图标
  71. // TODO: 在此添加额外的初始化代码
  72.     InitVideo();
  73. return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
  74. }
  75. void CPCBMatchDlg::OnSysCommand(UINT nID, LPARAM lParam)
  76. {
  77. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  78. {
  79. CAboutDlg dlgAbout;
  80. dlgAbout.DoModal();
  81. }
  82. else
  83. {
  84. CDialog::OnSysCommand(nID, lParam);
  85. }
  86. }
  87. // 如果向对话框添加最小化按钮,则需要下面的代码
  88. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  89. //  这将由框架自动完成。
  90. void CPCBMatchDlg::OnPaint()
  91. {
  92. if (IsIconic())
  93. {
  94. CPaintDC dc(this); // 用于绘制的设备上下文
  95. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  96. // 使图标在工作矩形中居中
  97. int cxIcon = GetSystemMetrics(SM_CXICON);
  98. int cyIcon = GetSystemMetrics(SM_CYICON);
  99. CRect rect;
  100. GetClientRect(&rect);
  101. int x = (rect.Width() - cxIcon + 1) / 2;
  102. int y = (rect.Height() - cyIcon + 1) / 2;
  103. // 绘制图标
  104. dc.DrawIcon(x, y, m_hIcon);
  105. }
  106. else
  107. {
  108. CDialog::OnPaint();
  109. }
  110. }
  111. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  112. //
  113. HCURSOR CPCBMatchDlg::OnQueryDragIcon()
  114. {
  115. return static_cast<HCURSOR>(m_hIcon);
  116. }
  117. void CPCBMatchDlg::InitVideo(void)
  118. {
  119. HRESULT hr = m_EnumDevice.EnumDevice();
  120.     int index = 0;
  121. if(hr != S_OK)
  122. {
  123. this->MessageBox(_T("没有找到视频采集设备!"));
  124. exit(1);
  125. }
  126. if(m_EnumDevice.outlist.GetCount() > 1)
  127. {
  128. CSelectDevice SelectDeviceDlg;
  129. SelectDeviceDlg.outlist.Append(m_EnumDevice.outlist);
  130. if(IDOK == SelectDeviceDlg.DoModal())
  131. {
  132.             index = SelectDeviceDlg.DeviceIndex;
  133. }
  134. else
  135. {
  136. exit(1);
  137. }
  138. }
  139.     hr = m_BuildGraph.InitCaptureVideo(m_EnumDevice.GetCaptureDevice(index));
  140. if(hr != S_OK)
  141. {
  142. this->MessageBox(_T("视频采集设备初始化失败!"));
  143. exit(1);
  144. }
  145. else
  146. {
  147. AfxBeginThread(ThreadVideo,this, THREAD_PRIORITY_NORMAL);
  148. }
  149. }
  150. UINT ThreadVideo(LPVOID param)
  151. {
  152.     CPCBMatchDlg *pDlg = (CPCBMatchDlg *)param;
  153. pDlg->CaptureVideo(IDC_STATIC_VFW);
  154.     return 0;
  155. }
  156. HRESULT CPCBMatchDlg::CaptureVideo(int nID)
  157. {
  158. AM_MEDIA_TYPE mt;
  159. HRESULT hr = m_BuildGraph.pGrabber->GetConnectedMediaType(&mt);
  160. if (FAILED(hr))
  161. {
  162. // Return error code.
  163. return E_FAIL;
  164. }
  165. // Examine the format block.
  166. VIDEOINFOHEADER *pVih;
  167. if ((mt.formattype == FORMAT_VideoInfo) && 
  168. (mt.cbFormat >= sizeof(VIDEOINFOHEADER)) &&
  169. (mt.pbFormat != NULL) ) 
  170. {
  171. pVih = (VIDEOINFOHEADER*)mt.pbFormat;
  172. }
  173. else 
  174. {
  175. // Wrong format. Free the format block and return an error.
  176. FreeMediaType(mt);
  177. return VFW_E_INVALIDMEDIATYPE; 
  178. }
  179. byte *pBuffer = new byte[m_BuildGraph.cbBuffer];
  180. if (!pBuffer) 
  181. {
  182. // Out of memory. Return an error code.
  183. return E_FAIL;
  184. }
  185. HDC hdc = this->GetDlgItem(nID)->GetDC()->GetSafeHdc();
  186. this->GetDlgItem(nID)->MoveWindow(10,10,pVih->bmiHeader.biWidth,pVih->bmiHeader.biHeight);
  187. while(1)
  188. {
  189. hr = m_BuildGraph.pGrabber->GetCurrentBuffer(&m_BuildGraph.cbBuffer, (long*)pBuffer);
  190. if(hr == S_OK)
  191. {
  192. SetDIBitsToDevice(
  193. hdc, 0, 0, 
  194. pVih->bmiHeader.biWidth,
  195. pVih->bmiHeader.biHeight,
  196. 0, 0, 
  197. 0,
  198. pVih->bmiHeader.biHeight,
  199. pBuffer,
  200. (BITMAPINFO*)&pVih->bmiHeader,
  201. DIB_RGB_COLORS
  202. );
  203. }
  204. Sleep(70);
  205. }
  206. // Free the format block when you are done:
  207. FreeMediaType(mt);
  208. }