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

来源:互联网 发布:超女网络海选冥月 编辑:程序博客网 时间:2024/05/16 12:14

程序预期功能:

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



目前遇到的问题是:

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

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



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

在子窗体.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),显示图像。


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

父窗体.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得到空指针。









0 0
原创粉丝点击