MFC中嵌入显示opencv窗口

⌚Time: 2023-09-14 22:40:39

👨‍💻Author: Jack Ge

在MFC窗体中建立一个Picture Control控件,用于显示opencv窗口

在属性中设置图片控件的资源ID为IDC_PIC1

主要的思路:

使用GetWindowRect可以获取图片控件的区域

使用cv::resizeWindow可以设置opencv窗口的大小,适合图片控件的大小

使用cvGetWindowHandle函数可以获取到opencv窗口的句柄

使用::SetParent将opencv父窗口设置为图片控件,实现嵌入到MFC控件里

显示opencv窗口的代码


void CMFCCCCDlg::OnBnClickedButton1()

{

    cv::destroyWindow("a");//销毁名为a的的窗口,避免受到影响

    cv::Mat src = cv::imread("D:\\z.jpg");//载入图片



    CRect rect;

    GetDlgItem(IDC_PIC1)->GetWindowRect(rect); //获取picture control控件变量的rect

    cv::namedWindow("a", CV_WINDOW_NORMAL);//创建一个名为a的opencv窗口

    cv::resizeWindow("a", rect.Width(), rect.Height());//根据picture control的大下设置opencv窗口的大小

    cv::imshow("a", src);//显示图片在名为a的opencv窗口



    HWND hWnd = (HWND)cvGetWindowHandle("a");//获取opencv窗口句柄

    HWND hParent = ::GetParent(hWnd);//获取原本的opencv父窗口

    ::SetParent(hWnd, GetDlgItem(IDC_PIC1)->m_hWnd);//将OpenCV窗口的父窗口设置为控件ID为IDC_PIC1的窗口,即OpenCV窗口成为IDC_PIC1的子窗口,嵌套在IDC_PIC1控件中。

    ::ShowWindow(hParent, SW_HIDE);//隐藏原本的父窗口,使得OpenCV窗口只显示在IDC_PIC1控件中。

}