TestDevCaptureDlg.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. // TestDevCaptureDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "TestDevCapture.h"
  5. #include "TestDevCaptureDlg.h"
  6. #include "afxdialogex.h"
  7. #include "xDevCapture.h"
  8. #pragma comment(lib,"DevCapture.lib")
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #endif
  12. #define TIMER1 1
  13. bool isOpenDevice=false;
  14. CTestDevCaptureDlg *mDlg;
  15. CString ImgFolderPath;
  16. CArray<CString> FileArry;
  17. int pIndex=0;
  18. int pPreviewW=140;
  19. const int edgeSapce=2;
  20. CArray<CString> previewSize;
  21. int previewWidth=640;
  22. int previewHeight=480;
  23. int RotateAngle=0;
  24. char* UnicodeToAnsi( const wchar_t* szStr )
  25. {
  26. int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );
  27. if (nLen == 0)
  28. {
  29. return NULL;
  30. }
  31. char* pResult = new char[nLen];
  32. WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );
  33. return pResult;
  34. }
  35. CString GetExePath(void)
  36. {
  37. CString m_strPath;
  38. int nPos;
  39. GetModuleFileName(NULL, m_strPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
  40. m_strPath.ReleaseBuffer();
  41. nPos = m_strPath.ReverseFind(_T('\\'));
  42. m_strPath = m_strPath.Left(nPos);
  43. return m_strPath;
  44. }
  45. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
  46. class CAboutDlg : public CDialogEx
  47. {
  48. public:
  49. CAboutDlg();
  50. // 对话框数据
  51. enum { IDD = IDD_ABOUTBOX };
  52. protected:
  53. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  54. // 实现
  55. protected:
  56. DECLARE_MESSAGE_MAP()
  57. };
  58. CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
  59. {
  60. }
  61. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  62. {
  63. CDialogEx::DoDataExchange(pDX);
  64. }
  65. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
  66. END_MESSAGE_MAP()
  67. // CTestDevCaptureDlg 对话框
  68. CTestDevCaptureDlg::CTestDevCaptureDlg(CWnd* pParent /*=NULL*/)
  69. : CDialogEx(CTestDevCaptureDlg::IDD, pParent)
  70. {
  71. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  72. }
  73. void CTestDevCaptureDlg::DoDataExchange(CDataExchange* pDX)
  74. {
  75. CDialogEx::DoDataExchange(pDX);
  76. DDX_Control(pDX, IDC_COMBO1, cb_devname);
  77. DDX_Control(pDX, IDC_COMBO2, cb_preRes);
  78. DDX_Control(pDX, IDC_LIST1, m_list);
  79. DDX_Control(pDX, IDC_COMBO3, cb_format);
  80. DDX_Control(pDX, IDC_COMBO4, cb_color);
  81. DDX_Control(pDX, IDC_COMBO5, cb_dpi);
  82. }
  83. BEGIN_MESSAGE_MAP(CTestDevCaptureDlg, CDialogEx)
  84. ON_WM_SYSCOMMAND()
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_BN_CLICKED(IDC_BUTTON1, &CTestDevCaptureDlg::OnBnClickedButton1)
  88. ON_BN_CLICKED(IDC_BUTTON2, &CTestDevCaptureDlg::OnBnClickedButton2)
  89. ON_BN_CLICKED(IDC_BUTTON3, &CTestDevCaptureDlg::OnBnClickedButton3)
  90. ON_CBN_SELCHANGE(IDC_COMBO2, &CTestDevCaptureDlg::OnCbnSelchangeCombo2)
  91. ON_WM_DESTROY()
  92. ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CTestDevCaptureDlg::OnNMDblclkList1)
  93. ON_BN_CLICKED(IDC_BUTTON6, &CTestDevCaptureDlg::OnBnClickedButton6)
  94. ON_BN_CLICKED(IDC_BUTTON5, &CTestDevCaptureDlg::OnBnClickedButton5)
  95. ON_WM_TIMER()
  96. ON_CBN_SELCHANGE(IDC_COMBO1, &CTestDevCaptureDlg::OnCbnSelchangeCombo1)
  97. ON_BN_CLICKED(IDC_CHECK2, &CTestDevCaptureDlg::OnBnClickedCheck2)
  98. ON_BN_CLICKED(IDC_BUTTON4, &CTestDevCaptureDlg::OnBnClickedButton4)
  99. ON_BN_CLICKED(IDC_BUTTON7, &CTestDevCaptureDlg::OnBnClickedButton7)
  100. ON_BN_CLICKED(IDC_BUTTON8, &CTestDevCaptureDlg::OnBnClickedButton8)
  101. ON_BN_CLICKED(IDC_BUTTON9, &CTestDevCaptureDlg::OnBnClickedButton9)
  102. ON_BN_CLICKED(IDC_BUTTON10, &CTestDevCaptureDlg::OnBnClickedButton10)
  103. ON_BN_CLICKED(IDC_BUTTON11, &CTestDevCaptureDlg::OnBnClickedButton11)
  104. ON_BN_CLICKED(IDC_BUTTON12, &CTestDevCaptureDlg::OnBnClickedButton12)
  105. ON_BN_CLICKED(IDC_CHECK3, &CTestDevCaptureDlg::OnBnClickedCheck3)
  106. ON_CBN_SELCHANGE(IDC_COMBO3, &CTestDevCaptureDlg::OnCbnSelchangeCombo3)
  107. ON_CBN_SELCHANGE(IDC_COMBO4, &CTestDevCaptureDlg::OnCbnSelchangeCombo4)
  108. ON_CBN_SELCHANGE(IDC_COMBO5, &CTestDevCaptureDlg::OnCbnSelchangeCombo5)
  109. ON_BN_CLICKED(IDC_BUTTON13, &CTestDevCaptureDlg::OnBnClickedButton13)
  110. ON_BN_CLICKED(IDC_BUTTON14, &CTestDevCaptureDlg::OnBnClickedButton14)
  111. ON_BN_CLICKED(IDC_BUTTON15, &CTestDevCaptureDlg::OnBnClickedButton15)
  112. ON_BN_CLICKED(IDC_BUTTON16, &CTestDevCaptureDlg::OnBnClickedButton16)
  113. ON_BN_CLICKED(IDC_BUTTON17, &CTestDevCaptureDlg::OnBnClickedButton17)
  114. ON_BN_CLICKED(IDC_BUTTON18, &CTestDevCaptureDlg::OnBnClickedButton18)
  115. ON_BN_CLICKED(IDC_RADIO1, &CTestDevCaptureDlg::OnBnClickedRadio1)
  116. ON_BN_CLICKED(IDC_RADIO2, &CTestDevCaptureDlg::OnBnClickedRadio2)
  117. ON_BN_CLICKED(IDC_RADIO3, &CTestDevCaptureDlg::OnBnClickedRadio3)
  118. ON_BN_CLICKED(IDC_BUTTON19, &CTestDevCaptureDlg::OnBnClickedButton19)
  119. ON_BN_CLICKED(IDC_BUTTON20, &CTestDevCaptureDlg::OnBnClickedButton20)
  120. END_MESSAGE_MAP()
  121. // CTestDevCaptureDlg 消息处理程序
  122. /*
  123. 获取设备相关信息
  124. */
  125. int CTestDevCaptureDlg::toGetCamInfo()
  126. {
  127. int iRest=-1;
  128. int DevCount=GetDeviceCount();
  129. if(DevCount<=0)
  130. {
  131. AfxMessageBox(_T("未发现合适的设备!"));
  132. return -1;
  133. }
  134. for(int i=0;i<DevCount;i++)
  135. {
  136. char nbuf[100];
  137. iRest=GetDeviceName(i,nbuf);
  138. if(iRest==0)
  139. {
  140. cb_devname.AddString((CString)nbuf);
  141. }
  142. }
  143. if(cb_devname.GetCount()>0)
  144. cb_devname.SetCurSel(0);
  145. return 0;
  146. }
  147. /*
  148. 获取设备分辨率
  149. */
  150. int CTestDevCaptureDlg::toGetCamResolution()
  151. {
  152. int iRest=-1;
  153. int resCount=GetResolutionCount(cb_devname.GetCurSel()); //获取预览分辨率数目
  154. if(resCount<=0) return -1;
  155. int width=0;
  156. int height=0;
  157. CString resStr;
  158. CArray<int> ListWidth;
  159. CArray<int> ListHeght;
  160. for(int i=0;i<resCount;i++)
  161. {
  162. iRest=GetResolution(i,width,height); //获取预览分辨率
  163. if(iRest==0)
  164. {
  165. ListWidth.Add(width);
  166. ListHeght.Add(height);
  167. resStr.Format(_T("%d*%d"),width,height);
  168. cb_preRes.AddString(resStr);
  169. }
  170. }
  171. int cmpVal=0;
  172. int pos=0;
  173. for(int i=0;i<ListWidth.GetSize();i++)
  174. {
  175. if(ListWidth.GetAt(i)>cmpVal)
  176. {
  177. cmpVal=ListWidth.GetAt(i);
  178. pos=i;
  179. }
  180. }
  181. if(cb_preRes.GetCount()>0)
  182. cb_preRes.SetCurSel(pos);
  183. return 0;
  184. }
  185. /*
  186. 打开摄像头
  187. */
  188. int CTestDevCaptureDlg::toOpenDevice()
  189. {
  190. if(isOpenDevice)
  191. CloseDevice();
  192. if(cb_devname.GetCount()>0 && cb_preRes.GetCount()>0)
  193. {
  194. int iRest=-1;
  195. int CamIndx=cb_devname.GetCurSel();
  196. CString resStr;
  197. cb_preRes.GetLBText(cb_preRes.GetCurSel(),resStr);
  198. int pos=resStr.Find('*');
  199. int previewWidth=_ttoi(resStr.Left(pos));
  200. int previewHeight=_ttoi(resStr.Right(resStr.GetLength()-pos-1));
  201. CWnd *pWnd=GetDlgItem(IDC_PICA);
  202. HWND hwnd = pWnd->GetSafeHwnd();
  203. iRest=OpenDevice(CamIndx,previewWidth,previewHeight,hwnd,true);
  204. if(iRest!=0)
  205. {
  206. isOpenDevice=false;
  207. AfxMessageBox(_T("开启设备失败!"));
  208. return -1;
  209. }
  210. else
  211. {
  212. isOpenDevice=true;
  213. }
  214. }
  215. return 0;
  216. }
  217. void CTestDevCaptureDlg::OnDestroy()
  218. {
  219. CDialogEx::OnDestroy();
  220. CloseDevice();
  221. GdiplusShutdown(m_GdiplusToken); //关闭GDI+
  222. }
  223. BOOL CTestDevCaptureDlg::OnInitDialog()
  224. {
  225. CDialogEx::OnInitDialog();
  226. // 将“关于...”菜单项添加到系统菜单中。
  227. // IDM_ABOUTBOX 必须在系统命令范围内。
  228. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  229. ASSERT(IDM_ABOUTBOX < 0xF000);
  230. CMenu* pSysMenu = GetSystemMenu(FALSE);
  231. if (pSysMenu != NULL)
  232. {
  233. BOOL bNameValid;
  234. CString strAboutMenu;
  235. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  236. ASSERT(bNameValid);
  237. if (!strAboutMenu.IsEmpty())
  238. {
  239. pSysMenu->AppendMenu(MF_SEPARATOR);
  240. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  241. }
  242. }
  243. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  244. // 执行此操作
  245. SetIcon(m_hIcon, TRUE); // 设置大图标
  246. SetIcon(m_hIcon, FALSE); // 设置小图标
  247. // TODO: 在此添加额外的初始化代码
  248. GdiplusStartup(&m_GdiplusToken, &gdiStartInput, NULL); //开启GDI+
  249. ImgFolderPath=GetExePath() + _T("\\Image");
  250. if(!PathIsDirectory(ImgFolderPath))
  251. ::CreateDirectory(ImgFolderPath,false);
  252. FileArry.RemoveAll(); //清空全部
  253. DWORD dwStyle;
  254. dwStyle = m_list.GetExtendedStyle();
  255. dwStyle = dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES|LVS_EX_CHECKBOXES|LVS_ALIGNTOP ;
  256. m_list.SetExtendedStyle(dwStyle);
  257. CRect mRect;
  258. GetDlgItem(IDC_LIST1)->GetWindowRect(&mRect);
  259. int length = mRect.right-mRect.left;
  260. if(length<pPreviewW)
  261. {
  262. pPreviewW=length-edgeSapce*2-16;
  263. if(pPreviewW<=0)
  264. pPreviewW=length;
  265. }
  266. if(FileArry.GetSize()==0 )
  267. {
  268. m_imList.DeleteImageList();
  269. m_imList.Create(pPreviewW,pPreviewW,ILC_COLOR24,10,20); // 创建图像序列CImageList对象
  270. m_list.SetImageList(&m_imList,LVSIL_SMALL); //LVSIL_SMALL LVSIL_NORMAL
  271. m_list.InsertColumn(0, _T("图像列表"), LVCFMT_CENTER, length,-1);
  272. }
  273. ((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(1);
  274. cb_format.AddString(L"jpg");
  275. cb_format.AddString(L"bmp");
  276. cb_format.AddString(L"png");
  277. cb_format.AddString(L"tif");
  278. cb_format.AddString(L"pdf");
  279. cb_format.SetCurSel(0);
  280. cb_color.AddString(L"彩色");
  281. cb_color.AddString(L"灰度");
  282. cb_color.AddString(L"黑白");
  283. cb_color.SetCurSel(0);
  284. cb_dpi.AddString(L"100");
  285. cb_dpi.AddString(L"200");
  286. cb_dpi.AddString(L"300");
  287. cb_dpi.AddString(L"400");
  288. cb_dpi.AddString(L"500");
  289. cb_dpi.AddString(L"600");
  290. cb_dpi.SetCurSel(1);
  291. SetDpi(1,200);
  292. ////////////////////////////////////////////////////////////////
  293. int iRest=-1;
  294. iRest=toGetCamInfo();
  295. if(iRest!=0)
  296. {
  297. return TRUE;
  298. }
  299. else
  300. {
  301. iRest=toGetCamResolution();
  302. }
  303. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
  304. }
  305. void CTestDevCaptureDlg::OnSysCommand(UINT nID, LPARAM lParam)
  306. {
  307. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  308. {
  309. CAboutDlg dlgAbout;
  310. dlgAbout.DoModal();
  311. }
  312. else
  313. {
  314. CDialogEx::OnSysCommand(nID, lParam);
  315. }
  316. }
  317. // 如果向对话框添加最小化按钮,则需要下面的代码
  318. // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  319. // 这将由框架自动完成。
  320. void CTestDevCaptureDlg::OnPaint()
  321. {
  322. if (IsIconic())
  323. {
  324. CPaintDC dc(this); // 用于绘制的设备上下文
  325. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  326. // 使图标在工作区矩形中居中
  327. int cxIcon = GetSystemMetrics(SM_CXICON);
  328. int cyIcon = GetSystemMetrics(SM_CYICON);
  329. CRect rect;
  330. GetClientRect(&rect);
  331. int x = (rect.Width() - cxIcon + 1) / 2;
  332. int y = (rect.Height() - cyIcon + 1) / 2;
  333. // 绘制图标
  334. dc.DrawIcon(x, y, m_hIcon);
  335. }
  336. else
  337. {
  338. CDialogEx::OnPaint();
  339. }
  340. }
  341. //当用户拖动最小化窗口时系统调用此函数取得光标
  342. //显示。
  343. HCURSOR CTestDevCaptureDlg::OnQueryDragIcon()
  344. {
  345. return static_cast<HCURSOR>(m_hIcon);
  346. }
  347. //切换摄像头
  348. void CTestDevCaptureDlg::OnCbnSelchangeCombo1()
  349. {
  350. int iRest=-1;
  351. cb_preRes.ResetContent();
  352. if(isOpenDevice)
  353. CloseDevice();
  354. iRest=toGetCamResolution();
  355. if(iRest!=0)
  356. {
  357. AfxMessageBox(_T("切换摄像头失败!"));
  358. }
  359. else
  360. {
  361. toOpenDevice();
  362. }
  363. }
  364. //打开设备
  365. void CTestDevCaptureDlg::OnBnClickedButton1()
  366. {
  367. if(cb_devname.GetCount()>0)
  368. toOpenDevice();
  369. }
  370. //关闭设备
  371. void CTestDevCaptureDlg::OnBnClickedButton2()
  372. {
  373. isOpenDevice=false;
  374. CloseDevice();
  375. CRect rect;
  376. GetDlgItem(IDC_PICA)->GetWindowRect(&rect);
  377. ScreenToClient(&rect);
  378. InvalidateRect(rect);//刷新控件
  379. }
  380. //暂停预览
  381. void CTestDevCaptureDlg::OnBnClickedButton19()
  382. {
  383. PausePreview();
  384. }
  385. //恢复预览
  386. void CTestDevCaptureDlg::OnBnClickedButton20()
  387. {
  388. ResumePreview();
  389. }
  390. //拍照
  391. void CTestDevCaptureDlg::OnBnClickedButton3()
  392. {
  393. SYSTEMTIME st;
  394. CString strDate,strTime;
  395. GetLocalTime(&st);
  396. strDate.Format(_T("%4d%d%d"),st.wYear,st.wMonth,st.wDay);
  397. strTime.Format(_T("%d%d%d%3d"),st.wHour,st.wMinute,st.wSecond,st.wMilliseconds) ;
  398. CString suffixStr=_T(".jpg");
  399. if(cb_format.GetCurSel()==0)
  400. suffixStr=_T(".jpg");
  401. if(cb_format.GetCurSel()==1)
  402. suffixStr=_T(".bmp");
  403. if(cb_format.GetCurSel()==2)
  404. suffixStr=_T(".png");
  405. if(cb_format.GetCurSel()==3)
  406. suffixStr=_T(".tif");
  407. if(cb_format.GetCurSel()==4)
  408. suffixStr=_T(".pdf");
  409. CString path=ImgFolderPath + _T("\\") + strDate + strTime + suffixStr ;
  410. CaptureFromPreview(UnicodeToAnsi(path.GetBuffer(0)),0);
  411. AddToPreview(path);
  412. }
  413. //切换分辨率
  414. void CTestDevCaptureDlg::OnCbnSelchangeCombo2()
  415. {
  416. if(isOpenDevice)
  417. {
  418. isOpenDevice=false;
  419. CloseDevice();
  420. }
  421. toOpenDevice();
  422. }
  423. //设置图片格式
  424. void CTestDevCaptureDlg::OnCbnSelchangeCombo3()
  425. {
  426. SetFormatType(cb_format.GetCurSel());
  427. }
  428. //设置色彩模式
  429. void CTestDevCaptureDlg::OnCbnSelchangeCombo4()
  430. {
  431. SetColorType(cb_color.GetCurSel());
  432. }
  433. //设置DPI
  434. void CTestDevCaptureDlg::OnCbnSelchangeCombo5()
  435. {
  436. CString resStr;
  437. cb_dpi.GetLBText(cb_dpi.GetCurSel(),resStr);
  438. SetDpi(1,_ttoi(resStr));
  439. }
  440. //去底色
  441. void CTestDevCaptureDlg::OnBnClickedCheck2()
  442. {
  443. if( ((CButton *)GetDlgItem(IDC_CHECK2))->GetCheck() )
  444. {
  445. SetDelBgColor(1);
  446. }
  447. else
  448. {
  449. SetDelBgColor(0);
  450. }
  451. }
  452. //去黑边
  453. void CTestDevCaptureDlg::OnBnClickedCheck3()
  454. {
  455. if( ((CButton *)GetDlgItem(IDC_CHECK3))->GetCheck() )
  456. {
  457. SetDelBlackEdge(1);
  458. }
  459. else
  460. {
  461. SetDelBlackEdge(0);
  462. }
  463. }
  464. //左旋
  465. void CTestDevCaptureDlg::OnBnClickedButton4()
  466. {
  467. RotateAngle--;
  468. if (RotateAngle < 0)
  469. RotateAngle = 3;
  470. SetRotateAngle(RotateAngle);
  471. }
  472. //右旋
  473. void CTestDevCaptureDlg::OnBnClickedButton7()
  474. {
  475. RotateAngle++;
  476. if (RotateAngle > 3)
  477. RotateAngle = 0;
  478. SetRotateAngle(RotateAngle);
  479. }
  480. //放大
  481. void CTestDevCaptureDlg::OnBnClickedButton8()
  482. {
  483. ZoomIn();
  484. }
  485. //缩小
  486. void CTestDevCaptureDlg::OnBnClickedButton9()
  487. {
  488. ZoomOut();
  489. }
  490. //适合大小
  491. void CTestDevCaptureDlg::OnBnClickedButton10()
  492. {
  493. BestSize();
  494. }
  495. //1:1
  496. void CTestDevCaptureDlg::OnBnClickedButton11()
  497. {
  498. TrueSize();
  499. }
  500. //对焦
  501. void CTestDevCaptureDlg::OnBnClickedButton12()
  502. {
  503. ManualFocus();
  504. }
  505. //硬件参数设置
  506. void CTestDevCaptureDlg::OnBnClickedButton13()
  507. {
  508. ShowCameraSettingWindow();
  509. }
  510. //条码识别
  511. void CTestDevCaptureDlg::OnBnClickedButton14()
  512. {
  513. char code[512];
  514. memset(code,'\0',512);
  515. RecogQrBarCode(0,code);
  516. CString content(code);
  517. if(content!=_T(""))
  518. {
  519. AfxMessageBox(content);
  520. }
  521. else
  522. {
  523. AfxMessageBox(L"未识别到条码");
  524. }
  525. }
  526. //二维码识别
  527. void CTestDevCaptureDlg::OnBnClickedButton15()
  528. {
  529. char code[512];
  530. memset(code,'\0',512);
  531. RecogQrBarCode(1,code);
  532. CString content(code);
  533. if(content!=_T(""))
  534. {
  535. AfxMessageBox(content);
  536. }
  537. else
  538. {
  539. AfxMessageBox(L"未识别到二维码");
  540. }
  541. }
  542. //图片合并测试
  543. void CTestDevCaptureDlg::OnBnClickedButton16()
  544. {
  545. CString path1=GetExePath() + _T("\\test1.jpg");
  546. CString path2=GetExePath() + _T("\\test2.jpg");
  547. AddImagePath(UnicodeToAnsi(path1.GetBuffer(0)));
  548. path1.ReleaseBuffer();
  549. AddImagePath(UnicodeToAnsi(path2.GetBuffer(0)));
  550. path2.ReleaseBuffer();
  551. CString joinPath=GetExePath() + _T("\\joinimg.jpg");
  552. MergeImages(UnicodeToAnsi(joinPath.GetBuffer(0)),0,5);
  553. joinPath.ReleaseBuffer();
  554. AddToPreview(joinPath);
  555. }
  556. //PDF合并测试
  557. void CTestDevCaptureDlg::OnBnClickedButton17()
  558. {
  559. CString path1=GetExePath() + _T("\\test1.jpg");
  560. CString path2=GetExePath() + _T("\\test2.jpg");
  561. AddImageFileToPDF(UnicodeToAnsi(path1.GetBuffer(0)));
  562. path1.ReleaseBuffer();
  563. AddImageFileToPDF(UnicodeToAnsi(path2.GetBuffer(0)));
  564. path2.ReleaseBuffer();
  565. CString joinPath=GetExePath() + _T("\\joinpdf.pdf");
  566. CombineToPDF(UnicodeToAnsi(joinPath.GetBuffer(0)));
  567. joinPath.ReleaseBuffer();
  568. AddToPreview(joinPath);
  569. }
  570. /***********************************列表操作******************************************/
  571. // 从内存加载图片,失败返回NULL
  572. Bitmap* LoadBitmapFromMemory(const void* memory, DWORD size)
  573. {
  574. Bitmap* bmp = NULL;
  575. IStream* stream = NULL;
  576. if (CreateStreamOnHGlobal(NULL, TRUE, &stream) == S_OK)
  577. {
  578. ULARGE_INTEGER uli;
  579. uli.QuadPart = size;
  580. stream->SetSize(uli);
  581. if (stream->Write(memory, size, NULL) == S_OK)
  582. bmp = ::new Bitmap(stream,FALSE);
  583. stream->Release();
  584. }
  585. return bmp;
  586. }
  587. // 从文件加载图片,不独占文件,失败返回NULL
  588. Bitmap* LoadBitmapFromFile(const TCHAR* file_name)
  589. {
  590. Bitmap* bmp = NULL;
  591. HANDLE file_handle = CreateFile(file_name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  592. if (file_handle != INVALID_HANDLE_VALUE)
  593. {
  594. DWORD temp = 0;
  595. DWORD file_size = GetFileSize(file_handle, &temp);
  596. if (file_size && !temp) // 不处理大于4G的文件
  597. {
  598. // 将图片文件读到内存后,再从内存创建Bitmap
  599. unsigned char* buffer = new unsigned char[file_size];
  600. if (ReadFile(file_handle, buffer, file_size, &temp, NULL))
  601. bmp = LoadBitmapFromMemory(buffer, temp);
  602. delete [] buffer;
  603. }
  604. CloseHandle(file_handle);
  605. }
  606. return bmp;
  607. }
  608. Bitmap* CTestDevCaptureDlg::toGetThumbnailBitmap(CString path)
  609. {
  610. CString prewPath=path;
  611. CString ImageFormat=prewPath.Right(3);
  612. if(ImageFormat=="pdf" || ImageFormat=="PDF")
  613. {
  614. //isPdf=true;
  615. prewPath = GetExePath() + _T("\\PdfLogo.bmp");
  616. }
  617. Bitmap *bmp;
  618. bmp=LoadBitmapFromFile(prewPath.GetBuffer(0));
  619. if(bmp->GetWidth()>=bmp->GetHeight())
  620. {
  621. int tbWidth = pPreviewW; //获得图片宽度,这个120和创建的120保持相同。
  622. int tbHeight = pPreviewW* bmp->GetHeight()/bmp->GetWidth(); //获得图片宽度
  623. bmp = (Bitmap*)bmp->GetThumbnailImage(tbWidth , tbHeight , NULL, NULL); //设定缩略图的大小
  624. }
  625. else
  626. {
  627. int tbHeight = pPreviewW; //获得图片宽度,这个120和创建的120保持相同。
  628. int tbWidth = pPreviewW* bmp->GetWidth()/bmp->GetHeight(); //获得图片宽度
  629. bmp = (Bitmap*)bmp->GetThumbnailImage(tbWidth , tbHeight , NULL, NULL); //设定缩略图的大小
  630. }
  631. Bitmap *AllBmp;
  632. AllBmp=::new Bitmap(pPreviewW,pPreviewW,PixelFormat24bppRGB);
  633. Pen mpen(Color::DarkGray,2);
  634. int startx=(pPreviewW-bmp->GetWidth())/2;
  635. int starty=(pPreviewW-bmp->GetHeight())/2;
  636. Graphics *myGraphics=NULL;
  637. myGraphics = Graphics::FromImage(AllBmp);
  638. myGraphics->Clear((ARGB)Color::White);
  639. myGraphics->DrawRectangle(&mpen,0,0,pPreviewW,pPreviewW);
  640. myGraphics->DrawImage(bmp,startx+2,starty+2,bmp->GetWidth()-4,bmp->GetHeight()-4);
  641. myGraphics->~Graphics();
  642. myGraphics=NULL;
  643. delete bmp;
  644. bmp=NULL;
  645. return AllBmp;
  646. }
  647. void CTestDevCaptureDlg::AddToPreview(CString fPath)
  648. {
  649. FileArry.Add(fPath);
  650. pIndex=FileArry.GetSize()-1;
  651. HBITMAP hBitmap;
  652. CBitmap *pBitmap;
  653. pBitmap = new CBitmap;
  654. Bitmap *LastBmp=toGetThumbnailBitmap(fPath);
  655. LastBmp->GetHBITMAP(NULL, &hBitmap);
  656. pBitmap->Attach(hBitmap);
  657. m_imList.Add(pBitmap,RGB(255,255,255));
  658. LastBmp->~Bitmap();
  659. LastBmp=NULL;
  660. delete pBitmap;
  661. pBitmap=NULL;
  662. int nRow;
  663. LVITEM lvItem={0};
  664. lvItem.mask = LVIF_IMAGE|LVIF_TEXT|LVIF_STATE; //文字、图片、状态
  665. lvItem.iItem = pIndex; //行号
  666. lvItem.iImage = pIndex; //图片索引号
  667. lvItem.iSubItem = 0; //子列号
  668. nRow = m_list.InsertItem(&lvItem); //第一列为图片
  669. m_list.EnsureVisible(pIndex,FALSE);
  670. }
  671. void CTestDevCaptureDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
  672. {
  673. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  674. NM_LISTVIEW *pNMListView=(NM_LISTVIEW *)pNMHDR;
  675. int nItem=pNMListView->iItem;
  676. if(nItem>=0 && nItem<m_list.GetItemCount())//判断双击位置是否在有数据的列表项上面
  677. {
  678. CString fpath=FileArry.GetAt(nItem);
  679. if(PathFileExists(fpath))
  680. ShellExecute(NULL,L"open",fpath ,NULL,NULL, SW_SHOWNORMAL);
  681. }
  682. *pResult = 0;
  683. }
  684. //全选/全不选
  685. bool isSelectAll=false;
  686. void CTestDevCaptureDlg::OnBnClickedButton6()
  687. {
  688. int count=FileArry.GetSize();
  689. if(count<0)
  690. return ;
  691. if(isSelectAll==false)
  692. {
  693. isSelectAll=true;
  694. for(int i=0;i<FileArry.GetSize();i++)
  695. {
  696. m_list.SetCheck(i,TRUE);
  697. m_list.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
  698. }
  699. }
  700. else
  701. {
  702. isSelectAll=false;
  703. for(int i=0;i<FileArry.GetSize();i++)
  704. {
  705. m_list.SetCheck(i,FALSE);
  706. m_list.SetItemState(i, 0, LVIS_SELECTED);
  707. }
  708. }
  709. }
  710. //删除
  711. void CTestDevCaptureDlg::OnBnClickedButton5()
  712. {
  713. CArray<int> deleteIndex;
  714. for(int i=0;i<FileArry.GetSize();i++)
  715. {
  716. BOOL isSelect=m_list.GetCheck(i);
  717. if(isSelect==TRUE)
  718. {
  719. deleteIndex.Add(i);
  720. }
  721. }
  722. if(deleteIndex.GetSize()<=0)
  723. return ;
  724. for(int i=deleteIndex.GetSize()-1;i>-1;i--)
  725. {
  726. m_list.DeleteItem(deleteIndex.GetAt(i));
  727. m_imList.Remove(deleteIndex.GetAt(i));
  728. CString fPath=FileArry.GetAt(deleteIndex.GetAt(i));
  729. if(PathFileExists(fPath))
  730. {
  731. DeleteFile(fPath);
  732. }
  733. FileArry.RemoveAt(deleteIndex.GetAt(i));
  734. }
  735. }
  736. void CTestDevCaptureDlg::OnTimer(UINT_PTR nIDEvent)
  737. {
  738. switch(nIDEvent)
  739. {
  740. case TIMER1:
  741. break;
  742. default:
  743. break;
  744. }
  745. CDialogEx::OnTimer(nIDEvent);
  746. }
  747. //读取身份证
  748. void CTestDevCaptureDlg::OnBnClickedButton18()
  749. {
  750. int iRest = ReadCard();
  751. if (iRest != 0)
  752. {
  753. AfxMessageBox(L"读卡失败!");
  754. }
  755. else
  756. {
  757. CString name = (CString)GeCardInfo(0);
  758. CString sex = (CString)GeCardInfo(1);
  759. CString nation = (CString)GeCardInfo(2);
  760. CString born = (CString)GeCardInfo(3);
  761. CString address = (CString)GeCardInfo(4);
  762. CString num = (CString)GeCardInfo(5);
  763. CString IssuedAt = (CString)GeCardInfo(6);
  764. CString EffectedDate = (CString)GeCardInfo(7);
  765. CString ExpiredDate = (CString)GeCardInfo(8);
  766. CString headImgPath = (CString)GeCardInfo(9);
  767. CString info = L"姓名:" + name + L"\r\n" +
  768. L"性别:" + sex + L"\r\n" +
  769. L"民族:" + nation + L"\r\n" +
  770. L"出生:" + born + L"\r\n" +
  771. L"住址:" + address + L"\r\n" +
  772. L"公民身份号码:" + num + L"\r\n" +
  773. L"签证机关:" + IssuedAt + L"\r\n" +
  774. L"有效日期:" + EffectedDate + L"-" + ExpiredDate + L"\r\n" +
  775. L"证件头像图片路径:" + headImgPath;
  776. AfxMessageBox(info);
  777. }
  778. }
  779. void CTestDevCaptureDlg::OnBnClickedRadio1()
  780. {
  781. if( ((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck() )
  782. {
  783. SetCutType(0);
  784. }
  785. }
  786. void CTestDevCaptureDlg::OnBnClickedRadio2()
  787. {
  788. if( ((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck() )
  789. {
  790. SetCutType(1);
  791. }
  792. }
  793. void CTestDevCaptureDlg::OnBnClickedRadio3()
  794. {
  795. if( ((CButton *)GetDlgItem(IDC_RADIO3))->GetCheck() )
  796. {
  797. SetCutType(2);
  798. }
  799. }