zoukankan      html  css  js  c++  java
  • 查找摄像头

    // 2_CAMDlg.cpp : 实现文件 //

    #include "stdafx.h" #include "2_CAM.h" #include "2_CAMDlg.h" #include "afxdialogex.h"

    #pragma comment(lib,"Strmiids") #pragma comment(lib,"quartz") #include <DShow.h>

    #ifdef _DEBUG #define new DEBUG_NEW #endif

    // 用于应用程序“关于”菜单项的 CAboutDlg 对话框

    class CAboutDlg : public CDialogEx { public:  CAboutDlg();

    // 对话框数据  enum { IDD = IDD_ABOUTBOX };

     protected:  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

    // 实现 protected:  DECLARE_MESSAGE_MAP() };

    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX) {  CDialogEx::DoDataExchange(pDX); }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()

    // CMy2_CAMDlg 对话框

    CMy2_CAMDlg::CMy2_CAMDlg(CWnd* pParent /*=NULL*/)  : CDialogEx(CMy2_CAMDlg::IDD, pParent) {  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }

    void CMy2_CAMDlg::DoDataExchange(CDataExchange* pDX) {  CDialogEx::DoDataExchange(pDX); }

    BEGIN_MESSAGE_MAP(CMy2_CAMDlg, CDialogEx)  ON_WM_SYSCOMMAND()  ON_WM_PAINT()  ON_WM_QUERYDRAGICON()  ON_BN_CLICKED(IDOK, &CMy2_CAMDlg::OnBnClickedOk) END_MESSAGE_MAP()

    // CMy2_CAMDlg 消息处理程序

    BOOL CMy2_CAMDlg::OnInitDialog() {  CDialogEx::OnInitDialog();

     // 将“关于...”菜单项添加到系统菜单中。

     // IDM_ABOUTBOX 必须在系统命令范围内。  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  ASSERT(IDM_ABOUTBOX < 0xF000);

     CMenu* pSysMenu = GetSystemMenu(FALSE);  if (pSysMenu != NULL)  {   BOOL bNameValid;   CString strAboutMenu;   bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   ASSERT(bNameValid);   if (!strAboutMenu.IsEmpty())   {    pSysMenu->AppendMenu(MF_SEPARATOR);    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   }  }

     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动  //  执行此操作  SetIcon(m_hIcon, TRUE);   // 设置大图标  SetIcon(m_hIcon, FALSE);  // 设置小图标

     // TODO: 在此添加额外的初始化代码

     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE }

    void CMy2_CAMDlg::OnSysCommand(UINT nID, LPARAM lParam) {  if ((nID & 0xFFF0) == IDM_ABOUTBOX)  {   CAboutDlg dlgAbout;   dlgAbout.DoModal();  }  else  {   CDialogEx::OnSysCommand(nID, lParam);  } }

    // 如果向对话框添加最小化按钮,则需要下面的代码 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, //  这将由框架自动完成。

    void CMy2_CAMDlg::OnPaint() {  if (IsIconic())  {   CPaintDC dc(this); // 用于绘制的设备上下文

      SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

      // 使图标在工作区矩形中居中   int cxIcon = GetSystemMetrics(SM_CXICON);   int cyIcon = GetSystemMetrics(SM_CYICON);   CRect rect;   GetClientRect(&rect);   int x = (rect.Width() - cxIcon + 1) / 2;   int y = (rect.Height() - cyIcon + 1) / 2;

      // 绘制图标   dc.DrawIcon(x, y, m_hIcon);  }  else  {   CDialogEx::OnPaint();  } }

    //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMy2_CAMDlg::OnQueryDragIcon() {  return static_cast<HCURSOR>(m_hIcon); }

    int CameraCount() {

     int count = 0;  CoInitialize(NULL);

     // enumerate all video capture devices  CComPtr<ICreateDevEnum> pCreateDevEnum;  HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,   IID_ICreateDevEnum, (void**)&pCreateDevEnum);

     CComPtr<IEnumMoniker> pEm;  hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,   &pEm, 0);  if (hr != NOERROR)  {   return count;  }

     pEm->Reset();  ULONG cFetched;  IMoniker *pM;  while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)  {   count++;  }

     pCreateDevEnum = NULL;  pEm = NULL;  return count; }

    int CameraName(int nCamID, char* sName, int nBufferSize) {  int count = 0;  CoInitialize(NULL);

     // enumerate all video capture devices  CComPtr<ICreateDevEnum> pCreateDevEnum;  HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,   IID_ICreateDevEnum, (void**)&pCreateDevEnum);

     CComPtr<IEnumMoniker> pEm;  hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,   &pEm, 0);  if (hr != NOERROR) return 0;

     pEm->Reset();  ULONG cFetched;  IMoniker *pM;  while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)  {   if (count == nCamID)   {    IPropertyBag *pBag=0;    hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);    if(SUCCEEDED(hr))    {     VARIANT var;     var.vt = VT_BSTR;     hr = pBag->Read(L"FriendlyName", &var, NULL); //还有其他属性,像描述信息等等...     if(hr == NOERROR)     {      //获取设备名称         WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,sName, nBufferSize ,"",NULL);

         SysFreeString(var.bstrVal);         }     pBag->Release();    }    pM->Release();

       break;   }   count++;  }

     pCreateDevEnum = NULL;  pEm = NULL;

     return 1; }

    void CMy2_CAMDlg::OnBnClickedOk() {  // TODO: 在此添加控件通知处理程序代码  int iCamCount = CameraCount();

     int CamIdx = 0;  for (int i=0;i<iCamCount;i++)  {   char szCamName[128];   memset(szCamName,0x00,128);   int retval = CameraName(i,szCamName,sizeof(szCamName));   CString temp;   temp.Format(_T("%s"),szCamName);   MessageBox(temp);  } // CDialogEx::OnOK(); }

  • 相关阅读:
    linux [Fedora] 下的 "飞秋/飞鸽传书"
    弹跳是不是自由落体?
    插件的简单原理
    WebService的简单应用
    普通按钮的另一种提交方式(调用后台事件)
    ASPNET服务端控件练习(一个机试题)
    AJAX简单的数据增删改与分页应用
    new XMLHttpRequest()和页面关系
    c++中placement new
    netty的引用计数
  • 原文地址:https://www.cnblogs.com/dengpeng1004/p/4112647.html
Copyright © 2011-2022 走看看