TestDevCaptureDlg.cpp 21 KB

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