热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

在MFC框架下利用OPENCV进行项目开发时,我们经常会遇到要将一幅图片显示在对话框中,通常我们利用MFC的PictureControl控件作为图片容器,若PictureControl控件是在主对

在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();// 获得显示控件的 DC
HDC 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,未经允许请勿用于商业用途




推荐阅读
author-avatar
mobiledu2502874377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有