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

版权声明:转载请注明作者和出处:http://blog.csdn.net/holamirai,未经允许请勿用于商业用途。 https://blog.csdn.net/HolaMirai/article/details/50390060

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



展开阅读全文

没有更多推荐了,返回首页