MFC下使用CvvImage在子对话框(非主对话框)中无法显示图片的解决方法

来源:互联网 发布:东华理工大学软件学院 编辑:程序博客网 时间:2024/04/28 12:03

在MFC框架下利用OPENCV进行项目开发时,我们经常会遇到要将一幅图片显示在对话框中,通常我们利用MFC的Picture Control控件作为图片容器,若Picture Control控件是在主对话框中,这时比较简单,参考代码如下:

1.主窗口(主对话框):

//按下button1,图片显示void CDemoDlg::OnBnClickedButton1(){    //......................    //.....................其他代码   ShowImage();//显示图片函数}

其中,ShowImage()代码如下:

void CDemoDlg::ShowImage(){// ID 是Picture Control控件的ID号CDC* pDC=GetDlgItem(ID)->GetDC();// 获得显示控件的 DCHDC hDC=pDC->GetSafeHdc();// 获取 HDC(设备句柄) 来进行绘图操作CRect rect;GetDlgItem(ID)->GetClientRect(&rect);CvvImage cimg;cimg.Load(m_imagePath,1); // 载入图片,m_imagePath是图片的完整路径,若是在本工程目录下,则可以直接填写图片名cimg.DrawToHDC(hDC,&rect);ReleaseDC(pDC);}

这是没问题的,图片可以加载并显示出来。

2.子窗口(或子对话框):

当我们通过资源视图,新建一个新的对话框,类名为CChildDlg,然后在主对话框中按下一个按钮,创建CChildDlg类的模态对话框:

void::CDemoDlg::OnBnClickedButton2(){CChildDlg dlg;dlg.DoMal();}
并在子窗口的OnInitDialog()函数中添加ShowImage()函数,企图在CChildDlg子对话框中显示图片时。

BOOL CChildDlg::OnInitDialog(){CDialogEx::OnInitDialog();// TODO:  在此添加额外的初始化//................其他的初始化代码      ShowImage();  //我们预期目标是初始化时就将图像显示出来      return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE}

如果仍用上面的代码,发现图片是不能显示的.

问题出在哪?

问题出在OnPaint()函数上,我们新建的窗口默认是没有重写OnPaint()函数,这也就导致无法绘制图像。解决办法如下:

通过类向导,为CChildDlg类添加WM_ONPAINT消息,其中ChildDlg::OnPaint()函数如下:

void CChildDlg::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用 CDialogEx::OnPaint()CDialog::OnPaint();                    // 重绘对话框CDialog::UpdateWindow();                // 更新windows窗口,如果无这步调用,图片显示还会出现问题ShowImage();    // 重绘图片函数}
这样图片就可以在子对话框中显示了。


转载请注明作者和出处:http://blog.csdn.net/holamirai,未经允许请勿用于商业用途



1 0
原创粉丝点击