您的位置:首页 > 运维架构

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

2016-03-12 16:36 274 查看

程序预期功能:

在父窗体中画一个按键(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得到空指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: