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

5 篇文章 0 订阅
4 篇文章 1 订阅

在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,未经允许请勿用于商业用途



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值