[求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312

程序预期功能:

在父窗体中画一个按键(Button1),点击按键(Button1)然后跳出子窗体(son_window_IDD_DIALOG_BG),显示图像。(OPEN/CLOSE是用来打开和关闭摄像头的,father_window里面的image control控件用于显示视频,三者和本次问题无关)

[求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312_第1张图片


目前遇到的问题是:

我不知道怎么配置CDC/HDC/CRECT/CWND之类的参数。

如图,双击屏幕之后,程序停止。

[求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312_第2张图片


代码如下(仅我有修改部分):

在子窗体.cpp中的全局变量
IplImage* src = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg");//OpenCV里面的加载图像语句
CRect rect;  
CDC *pDC;  
HDC hDC;  
CWnd *pwnd; 

在子窗体.cpp中的OnLButtonDblClk中
void CTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	pwnd = GetDlgItem(IDC_ShowImage);  
	pDC =pwnd->GetDC();  <span style="font-family: Arial, Helvetica, sans-serif;">//DEBUG中,这里开始出错 </span>
	hDC= pDC->GetSafeHdc(); 
	pwnd->GetClientRect(&rect); 
	CvvImage m_CvvImage; // OpenCV中的显示类
    m_CvvImage.CopyOf(src,1);  //   <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用函数</span>
    m_CvvImage.DrawToHDC(hDC, &rect); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用的</span>

	CDialogEx::OnLButtonDblClk(nFlags, point);

}

问题总结:

1. 在子窗体里面有没有初始化函数?我在类向导里面没有找到。该怎么初始化呢?

2.以下
CRect rect;  
CDC *pDC;  
HDC hDC;  
CWnd *pwnd;
参考http://blog.csdn.net/yam_killer/article/details/7661449
都是什么用途?网上查阅之后,大概理解就是
DC是设备描述表,一种包含设备信息的数据结构。
HDC是DC 的句柄,API中的一个类似指针的数据类型。    我的理解是:用来标识每一个窗口的,相当于编号。
CDC是MFC的DC的一个类理解不了了,它和DC有什么不一样?
窗体显示的过程大概是什么样?需要哪些步骤?以及这些名词都是代表什么意义?有没有谁可以简单的解释一下各种关系?

3.我想试试是不是DC、HDC配置错了,所以在父窗体中运行了一个例子,但是通过了,也不知道为啥。
父窗体下功能是:
点击(OPEN),显示图像。
[求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312_第3张图片

代码如下(也仅我有修改部分)

父窗体.cpp文件中的全局变量
IplImage* src = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg");
CRect rect;  
CDC *pDC;  
HDC hDC;  
CWnd *pwnd; 

父窗体.cpp文件中的OnInitDialog
// TODO: 在此添加额外的初始化代码
	pwnd = GetDlgItem(IDC_ShowImage);  
	pDC =pwnd->GetDC();  
	hDC= pDC->GetSafeHdc();  
	pwnd->GetClientRect(&rect); 

父窗体.cpp文件中的OPEN按键消息
void CsubwindowDlg::OnClickedButtonOpen()
{
	// TODO: 在此添加控件通知处理程序代码 
    // 测试 
    CvvImage m_CvvImage;  
    m_CvvImage.CopyOf(src,1);     
    m_CvvImage.DrawToHDC(hDC, &rect);  

    // 设置计时器,每10ms触发一次事件  
}

父窗体.cpp文件中的CLOSE按键消息
void CsubwindowDlg::OnClickedButtonClose()
{
	// TODO: 在此添加控件通知处理程序代码
	ReleaseDC(pDC);
}

配置过程都一样。


麻烦大家看一下啦,谢谢。
最后,语文不好~废话较多。。见谅

***问题原因和解决方案***

子窗体.cpp文件中的   pwnd = GetDlgItem(IDC_STATIC);   IDC_STATIC一开始写错了,使得返回的pwnd是空指针。


注意从新配置如下
在子窗体.cpp中的OnLButtonDblClk中
void CTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	<span style="color:#ff0000;">pwnd = GetDlgItem(<span style="font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; font-size: 14px; line-height: 23px;">IDC_STATIC</span>);  //这里如果返回空指针会出错。</span>
	pDC =pwnd->GetDC();  <span style="font-family: Arial, Helvetica, sans-serif;">//DEBUG中,这里开始出错 </span>
	hDC= pDC->GetSafeHdc(); 
	pwnd->GetClientRect(&rect); 
	CvvImage m_CvvImage; // OpenCV中的显示类
    m_CvvImage.CopyOf(src,1);  //   <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用函数</span>
    m_CvvImage.DrawToHDC(hDC, &rect); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用的</span>

	CDialogEx::OnLButtonDblClk(nFlags, point);

}
同时,在父窗体的图片显示控件的IDD在子窗体中不能识别,会使pwnd得到空指针。









你可能感兴趣的:([求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312)