MFC/HALCON混合编程系列三_CFielDialog打开文件对话框

时间:2022-08-17 20:22:28
目的:在系列二的基础上,添加从文件中打开一幅图像的按钮。点击该按钮可以选择从文件或者当前目录下打开一幅图像。   按钮的事件响应函数如下:     void CHalconMFCDlg::OnBnClickedReadimage()
{
    // TODO: Add your control notification handler code here
    // HDevelop default window handle 
    char ReadImageModel = 0;
    if (1 == ReadImageModel)
    {
        open_framegrabber("File"110000"default"-1"default"-1"default"
             """default"-1-1&AcqHandle);
        grab_image(&Image, AcqHandle);
        get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
        set_window_attr("background_color","black");
        set_part(WindowHandle,0,0,Height-1,Width-1);
        disp_obj(Image, WindowHandle);    
    }
    else
    {
        CFileDialog dlg(TRUE, NULL,NULL, OFN_HIDEREADONLY,_T("JPEG|*.jpg|All files|*||"));//OFN_ALLOWMULTISELECT打开多文档选项。
        if (dlg.DoModal()==IDOK) //如果返回为确定,获得选择的文件名
        {
            //获取文件路径,读取图像。
            CString pathname=dlg.GetPathName( ); //
            char* Filename = pathname.GetBuffer(pathname.GetLength()+1); 
            read_image(&Image,Filename);
            get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);
            
            set_part(WindowHandle,0,0,Height-1,Width-1);
            disp_obj(Image, WindowHandle);
        }
    }
}
      问题一:通过dlg.GetPathName( )获得的文件路径是CString类型,而Halcon中的read_image需要的类型为HTuple,而这两种数据结构之间似乎不能进行类型转换。     解决办法:由于对read_image不熟悉,不知道它可以使用char *类型的传入参数。因此只要把CString转换为char*类型作为传入参数。       问题二,由dlg.GetPathName( )读取的路径类似下列 "C:\test.jpg",而Halcon需要的路径却是类似"C:/test.jpg"。如果使用的话,还需要进行一次转换。     解决办法:将CString类型装换为char*类型后,似乎没有这个问题了。   参考资料: 1.《VC++CString转换为char*的相互转换》