zoukankan      html  css  js  c++  java
  • 不使用CvvImage类来在MFC中显示图像

    /*
     * =====================================================================================
     *
     *       Filename:  a-kind-of-showDlg.cpp
     *          
     *    Description:  不使用CvvImage类来在MFC中显示图像
     *
     *
     *        Version:  1.0
     *        Created:  2013/11/16 22:06:13
     *         Author:  yuliyang
     *
     *             Mail:  wzyuliyang911@gmail.com
     *             Blog:  http://www.cnblogs.com/yuliyang
     *
     * =====================================================================================
     */
    
    
    // a-kind-of-showDlg.cpp : 实现文件
    //
    
    #include "stdafx.h"
    #include "a-kind-of-show.h"
    #include "a-kind-of-showDlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    static     DWORD  Thread(LPVOID *lpvParam);        /* 显示图像线程 */
    // 用于应用程序“关于”菜单项的 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()
    
    
    // CakindofshowDlg 对话框
    
    
    
    
    CakindofshowDlg::CakindofshowDlg(CWnd* pParent /*=NULL*/)
        : CDialogEx(CakindofshowDlg::IDD, pParent)
    {
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CakindofshowDlg::DoDataExchange(CDataExchange* pDX)
    {
        CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CakindofshowDlg, CDialogEx)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        ON_BN_CLICKED(IDC_BUTTON1, &CakindofshowDlg::OnBnClickedButton1)
        ON_BN_CLICKED(IDC_BUTTON2, &CakindofshowDlg::OnBnClickedButton2)
    END_MESSAGE_MAP()
    
    
    // CakindofshowDlg 消息处理程序
    
    BOOL CakindofshowDlg::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: 在此添加额外的初始化代码
        /*------------------------------------------------------------------------------------------------------------
         *  初始化
         *
         *  显示图像 另一种方法
         *
         *
         *------------------------------------------------------------------------------------------------------------*/
        cv::namedWindow("INPUT", 1);
        HWND hWnd = (HWND) cvGetWindowHandle("INPUT");
        HWND hParent = ::GetParent(hWnd);
        ::SetParent(hWnd, GetDlgItem(IDC_FRAME)->m_hWnd);
        ::ShowWindow(hParent, SW_HIDE);
    
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CakindofshowDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
            CAboutDlg dlgAbout;
            dlgAbout.DoModal();
        }
        else
        {
            CDialogEx::OnSysCommand(nID, lParam);
        }
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CakindofshowDlg::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 CakindofshowDlg::OnQueryDragIcon()
    {
        return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CakindofshowDlg::OnBnClickedButton1()
    {
        thread = AfxBeginThread((AFX_THREADPROC)  Thread, (LPVOID) this);
        // TODO: 在此添加控件通知处理程序代码
        
    }
    
    
    void CakindofshowDlg::ThreadProcess(void)
    {
        capture = cvCaptureFromCAM(0);
        if(!capture)
        {
            //AfxMessageBox(L"ERROR: Cannot initialize video!");
            return;
        }
        cv::Size default_size;
        default_size.width = 280;                   /* 窗口大小 */
        default_size.height = 210;
        IplImage* frame;
        
        cv::Mat img_input;
        while (1)
        {
            cv::Mat img_input_aux;
            frame = cvQueryFrame(capture);
            img_input = cv::Mat(frame,true);
            cv::resize(img_input, img_input_aux, default_size);
            if(!img_input_aux.empty())
                cv::imshow("INPUT", img_input_aux);
            ::Sleep(1000);                          /* 代替waitkey() */
        }
        
        
    }
    
    
     static DWORD  Thread(LPVOID *lpvParam)
    {
        CakindofshowDlg *thr = (CakindofshowDlg*) lpvParam;
        thr->ThreadProcess();
        return NULL;
    }
    
                                                     
    /*------------------------------------------------------------------------------------------------------------
     *  停止线程                                                                                                  
     *------------------------------------------------------------------------------------------------------------*/
     void CakindofshowDlg::StopThread(void)
     {
         DWORD exit_code = NULL;
    
         if(thread != NULL)
         {
             GetExitCodeThread(thread->m_hThread, &exit_code);
    
             if(exit_code == STILL_ACTIVE)
             {
                 ::TerminateThread(thread->m_hThread, 0);
                 CloseHandle(thread->m_hThread);
             }
    
             thread->m_hThread = NULL;
             thread = NULL;
         }
     }
     
     void CakindofshowDlg::OnBnClickedButton2()
     {
         // TODO: 在此添加控件通知处理程序代码
         CakindofshowDlg::StopThread();
     }

    程序有bug,不能退出。呵呵

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    SqlServer 本地连接打不开
    Ftp服务器搭建方法
    SQL分页查询
    sql 多表更新
    SQL 循环截取指定位置字符串
    创建在“system.net/defaultProxy”配置节中指定的 Web 代理时出错。
    python入门学习的第一天
    操作系统第二章总结/
    操作系统第一章总结/
    终端执行for循环
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3427234.html
Copyright © 2011-2022 走看看